标签:
面向对象思维:
在问题域中,不再考虑一步一步的过程,而是将问题域中的对象抽象出来,弄清楚对象和对象之间的关系。
重点:面向对象实现的三个步骤:
对象:一类事务的具体的实例。“某个瓶子”
类(对象)之间的关系 之
关联关系
关联关系:某个类的方法关联到某个类的对象。
继承关系(一般和特殊)
容易形成继承树
XX是一种XX:球类运动员是一种运动员。
一类可以从不同的多个类继承。【多重继承:C++】
聚合关系(整体和部分)
聚集:松耦合
组合:必不可少
实现关系
父类的方法,子类来实现。
多态
练习:
类:旅行社,旅客,机票,账目
机票
属性:班次
方法:送票,作废,显示航班时间
必须先定义类才能有对象
为什么用对象?
约定俗成的命名规则:
//用class关键字定义一个类,例如:
class Person{
//成员变量定义
private int id;
private int age = 20;
//方法定义
public int getAge(){
return age;
}
public void setAge(int i){
age = i;
}
public int getId(){
return id;
}
}
成员变量
成员变量可以使Java语言中任何一种数据类型(包括基本类型和引用类型)。
在定义成员变量时,可以对它初始化,也可以不对它初始化,不初始化时,Java会给出默认初始化值。
成员变量的作用范围为整个类体。
引用
Java中除了基本类型之外的变量类型都称为引用类型。
Java中的对象是通过引用对其操作。
类和对象的关系
构造函数与类同名且没有返回值。
public class Person{
int id;
int age;
Person(int n,int i){
id = n;
age = i;
}
}
创建对象时,使用构造函数初始化对象的成员变量。
public class Test{
public static void main(String args[]){
Person tom = new Person(1,25);
Person john = new Person(2,27);
}
}
当没有指定构造函数时,编译器为类自动添加形如:类名( ){ } 的构造函数。
class Point{
public int x;
public int y;
}
... Point p = new Point();
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同参数表选择对应的方法。
void info() {
System.out.println("my id is :" + id);
}
void info(String t) {
System.out.println(t + " my id is" + id);
}
构造方法也可以重载。
Person() {
id = 100;
age = 20;
}
Person(int _id) {
id = _id;
age = 30;
}
Person(int _id, int _age) {
id = _id;
age = _age;
}
this可以看作是一个变量,它的值时当前对象的引用
public class Leaf{
int i = 0;
Leaf(int i ){ this i = i; }
Leaf increament() {
i++;
return this;
}
void print(){ System.out.println("i = "+i); }
public static void main(String[] args){
Leaf leaf = new Leaf(100);
leaf.increament().increament().print();
}
}
为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间。
J2SDK 中主要的包介绍
- java.lang包中的类,不需要引入,可以直接使用。
- 把自己的类打成jar包:jar -cvf xxx.jar * . *
Java中使用extends关键字实现类的继承机制,其语法规则为:
<modifier> class <name> [extends <superclass>]
{ ... ... }
通过继承,子类自动拥有了基类(superclass)的所有成员(成员变量和方法)。
Java只支持单继承,不允许多继承:
//继承中的权限控制
class Parent{
private int n_private = 1;
int n_friendly = 2; // 包权限:同一个包内可以访问
protected int n_protected = 3;
public int n_public = 4;
}
class Child extends Parent {
public void f () {
// n_private = 10; 错误,继承中私有变量不能访问
n_friently = 20;
n_protected = 30;
n_public = 40;
}
}
Java权限修饰符public protected private 置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。
对于class的权限修饰只可以用 public 和 default
在子类中可以根据需要对从基类中继承来的方法进行重写
重写方法必须和被重写方法具有相同方法名称,参数列表和返回类型
重写方法不能使用比被重写方法更严格地访问权限
在Java类中使用 super 来引用基类的成分,例如:
class FatherClass {
public int value;
public void f () {
value = 100;
System.out.println("FatherClass.value = "+value);
}
}
class ChildClass extends FatherClass {
public int value;
public void f () {
super.f(); //super指向当前对象的父对象
value = 200;
System.out.println("ChildClass.value ="+value);
System.out.println(value);
System.out.println(super.value);
}
}
参数拷贝来拷贝去,最终剩下堆里的对象和栈里的引用以及数据区的静态变量。
如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
public class Person {
... ...
}
等价于:
public class Person extends Object{
... ...
}
toString 方法
hashcode 解释
每一个对象都有一个独一无二的哈希编码,可以通过这个哈希编码在内存中找到这个对象并确定这个对象的位置。
equals 方法
可以根据需要在用户自定义类型中重写equals方法
public class TestEquals {
public static void main(String[] args) {
Cat c1 = new Cat(1,2,3);
Cat c2 = new Cat(1,2,3);
//类Cat重写从Object类默认集成的方法equals()
System.out.println(c1 == c2); //false
System.out.println(c1.equals(c2)); //true
//String类已经中重写了方法equals()
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
}
}
class Cat {
int color;
int height, weight;
public Cat(int color, int height, int weight) {
this.color = color;
this.height = height;
this.weight = weight;
}
public boolean equals(Object obj) {
if(obj == null) return false;
else {
if(obj instanceof Cat) {
Cat c = (Cat)obj;
if(this.color == c.color && this.height == c.height && this.weight == c.weight) {
return true;
}
}
}
return false;
}
}
标签:
原文地址:http://blog.csdn.net/beauty_1991/article/details/51397225