Java对象

类之间的关系

  • 依赖(“uses-a”):如果一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
  • 聚合(“has-a”):类A的对象包含类B的对象。
  • 继承(“is-a”):类A扩展类B,类A不但包含从类B继承的方法,还会拥有一些额外的功能。

用户自定义类

定义类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class ClassName{
    //fields
    private String name;
    //constructor
    public ClassName(String n){
        name = n;
    }
    //a method
    public String getName(){
        return name;
    }
}

多个源文件

每一个类存在一个单独的源文件中。

封装的优点

  • 如果改变内部实现,除了该类的方法之外,不会影响其他代码。
  • 更改器方法可以执行错误检查,直接对私有域进行赋值将不会被处理。

警告:不要编写返回可变对象引用的访问器方法。

例子:

1
2
3
4
5
class Employee{
    private Date hireDay;
    public Date getHireDay(){ return hireDay; }
}
//Date对象是可变的(因为Date类中有一个setTime()的更改器方法),这一点就破坏了封装性。
1
2
3
4
5
Employee harry = new Employee();
Date d = harry.getHireDay();
d.setTime(d.getTIme() - 100);
//d和harry.hireDay引用同一个对象。
//对d调用更改其就可以自动地改变这个雇员对象的私有状态。

如果需要返回一个可变对象的引用,应该首先对它进行克隆。克隆对象是存放在另一个位置上的对象副本。

1
2
3
4
5
class Employee{
    public Date getHireDay(){
        return (Date) hireDay.clone();
    }
}

基于类的访问权限

一个方法可以访问所属类的所有对象的私有数据。

私有方法

一个方法划分成若干独立的辅助方法,可以将辅助方法设为私有

final实例域

1
private final String name;

必须确保在每一个构造器执行之后,这个域的值被设置,而且在后面的操作中,不能够再对他修改。

final修饰符大都应用于基本类型域,或不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类)。

静态域与静态方法

静态域

每个类中只有一个静态域。

如果由100个Employee类的对象,则由100个实例域id。但是,只有一个静态域nextId。

即使没有一个实例对象,静态域也存在。

静态域就是cpp中的类域,它属于类,而不属于任何独立的对象。

静态常量

1
public static final double PI = 3.1415;

静态方法

静态方法是一中不能向对象实施操作的方法。(我们可以认为静态方法是没有this参数的方法)

  • 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供。
  • 一个方法只需要访问类的静态域

工厂方法(类似于构造函数)

使用工厂方法而不使用构造函数的原因:

  • 无法命名构造函数。构造函数的名字必须与类名相同。
  • 当使用构造函数时,无法改变所构造的对象类型。而工厂方法将返回一个它的子类或者其他

对象构造

重载

如果多个方法由相同的名字、不同的参数,便产生了重载。

编译器会通过用各个方法给出的参数类型特定方法的调用所使用的值类型进行匹配来挑选出相应的方法