1.一个对象变量并没有实际包含一个对象,而仅仅是引用一个对象。任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new操作符的返回值也是一个引用。
变量不会自动初始化为null,必须通过调用new或将它们设置为null进行初始化。
2.日期类:
Date 表示时间点,GregorianCalendar表示日历,GregorianCalendar.set是更改器方法,GregorianCalendar.get是访问器方法。
3.用户自定义类:
1.构造器:初始化实例域;构造器总是伴随一个new操作符被调用,不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
2.隐式与显式参数:e.raiseSalary(5),e是employee类对象是一个隐式参数,括号中是显示参数。每个方法中,this表示隐式参数。(java中所有方法定义在类的内部,但不表示他们是内联方法)
3.封装:应提供三项内容——一个私有的数据域;一个公有的域访问器方法;一个公有的域更改器方法;(注意:不要编写 返回引用可变对象的访问器方法?)
4.访问权限:一个方法可以访问所属类的所有对象的私有数据;可以将方法private;可以将实例域final,必须初始化,这个值不再被修改/ final修饰符大都用于基本数据类型域或不可变类(类中每个方法都不改变其对象)的域
静态域:属于类,不属于任何独立的对象;
静态常量:如public static final double PI=3.14159265358979323846
静态方法:是不能向对象实施操作的方法,用类名调用方法 。可认为静态方法没有this参数;静态方法不能访问实例域,但可以访问自身类中的静态域
5.factory:未深入。
4.方法参数:java采用的总是值调用。
public static void tripleSalary(Emloyee x)
{
e.raiseSalary(200);
}
harry = new employee(...);
tripleSalary(harry);
实现过程:x被初始化为harry值的拷贝,这里是一个对象的引用;
raiseSalary方法应用于这个对象引用,x和harry同时引用的那个Employee对象的薪金提高了200%
方法结束后,参数变量x不再使用,对象变量harry则继续引用那个薪金增至3倍的雇员对象。
总结一下java中方法参数的使用情况:
一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
一个方法可以改变一个对象参数的状态
一个方法不能实现让对象参数引用一个新对象。
5.对象构造:多种构造器方法
重载:多个方法有相同的名字、不同的参数
默认域初始化:数值为0,布尔值为false,对象引用为null,但最好对域初始化;域与局部变量的不同:即局部变量必须明确的初始化。
默认构造器:没有参数的构造器,若未编写构造器则系统会默认提供。
显示域初始化:确保每个实例域都被设置为有意义的初值; 还可调用方法对域初始化。
class Employee{
..
static int assignId()
{
int r = nextId;
nextId ++;
return r;
}
...
private int Id = assignId();
}
在构造器中,参数名用与实例域同样的名字命名,将实例域屏蔽起来。this指示被构造的对象,可以采用this.salary访问实例域
public employee(String name,double salary)
{
this.name = name;
this.salary = salary;
}
还可调用另一个构造器。如下例,当调用new employee(60000)时,employee(double)构造器将调用Employee(String,double)构造器
public employee(double s){
this("Employee#"+nextId,s);
nextId++;
}
除了以上2种初始化数据域的方法,在构造器中设置值,在声明中赋值,还有第三种方法:
初始化块。但通常直接将初始化代码放到构造器中。
总结一下调用构造器的具体步骤:
1.所有数据域被初始化为默认值(0、false或null)
2.按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
3.如果构造器第一行调用了第二个构造器,则执行第二个构造器主体
4.执行这个构造器主体。
对静态域来说,可以采用一个静态的初始化化块来对静态域进行初始化。在类第一次加载的时候,将会进行静态域的初始化。初始化顺序按照类定义的顺序。
public class Hello
{
static
{
System.out.println("Hello World!");
}
}
6.对象析构和finalize方法:
java有自动的垃圾回收器,无需人工回收内存,所以java不支持析构器。当一些对象使用了内存外的资源,此时可在垃圾回收器清除对象前调用finalize方法,一种更好的方法是使用shutdown hook
7.包作用域:
标记为public的部分可以被任意类使用,private的部分职能被定义他们的类使用,没有指定public或private的类、方法、变量可以被同一个包中的所有方法访问。
因此,变量最好显示的标记为private,否则就默认包可见。
8.最后总结一下,类的设计技巧:
1 一定将数据设计为私有化
2 一定要对数据初始化
3 不要在类中过多的使用基本数据类型
4 不是所有的域都需要独立的域访问器和域更改器
5 使用标准格式进行类的定义
建议顺序为:公有访问特性部分 、包作用域访问特性部分、私有访问特性部分,在每一部分中按照下列顺序:实例方法、静态方法、实例域、静态域
6 将职责过多的类进行分解
7 类名与方法名要能体现他们的职责。