复用代码的两种方式:只需在新的类中产生现有类的方法,由于新的类是由现有类的对象所组成的,所以这种方式称为组合;他按照现有类的类型来创建新的类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码这种方式称为继承
每一个非基本类型的对象都有一个toString()方法。当编译需要一个String儿你却只有一个对象时,该方法便会被调用。
初始化引用可以在代码中的下列位置进行:在定义的地方;在类的构造器中;就在正要使用这些对象之前(惰性初始化);使用实例初始化
继承一般的规则是将所有的数据成员都指定为private。将所有的方法指定为public。Java使用super关键字表示超类的意思。当前类就是从超类中继承的
当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与基类直接创建的对象是一样的。二者的区别在于后者来自外部,而基类被包装在导处类对象内部。子类在构造器中调用基类构造器来执行初始化。Java会自动在导出类的构造器中插入对基类构造器的调用。基类在导出类构造器可以访问它之前就完成了初始化
若没有默认的基类构造器或想调用一个带参数的基类构造器,必须使用super显式地编写调用基类构造器的语句,并且该事件必须是在导出类构造器中要做的第一件事
public class SpaceShipController{
void up(int velocity);
void down(int velocity);
...
}
public class SpaceShip extends SpaceShipController{
private String name;
public SpaceShip(String name){
this.name = name;
}
}
public class SpaceShipDelegation{
private String name;
private SpaceShipController controls = new SpaceShipController();
public SpaceShipDelegation(String name){
this.name = name ;
}
public void up(int velocity){
controls.up(velocity);
}
public void down(int velocity){
controls.down(velocity);
}
}
若想执行一些必要的清理活动,必须将这一清理活动置于finally字句中,以防异常出现
在清理方法中,要注意对基类清理方法和成员对象清理方法的调用顺序,执行类的所有的清理动作,其顺序同生成顺序相反。
若Java的基类拥有莫个已被多次重载的方法名称,那么在导出类中重新定义该方法的名称并不会屏蔽其在基类中的任何一个版本。Java SE5新增了@Override注解,要重写某个方法时,可以添加这个主食,防止程序员对它重载
组合技术通畅用于想在新类中使用现有的功能而非它的接口这种情形
在继承的时候,使用某个现有类并开发一个它的特殊版本,即在使用一个通用类,并为了某种特殊需要而将其特殊化
is-a的关系是用继承来表达的,has-a的关系是用组合来表达的
protected对于任何继承于此类的或其位于同一包下的。
导出类是基类的一个超集。在向上转型的过程中,类接口中唯一可能发生的事情就是丢失方法,而不是获取他们。
在开发中,用组合还是继承,最清晰的判断就是问自己是否需要从新类向基类进行向上转型,若必须向上转型,则继承时必要的,否则需思考继承是否必要了
final数据:一个永不改变的编译时常量,并且在运行时被初始化的值并不希望他被改变。这些常量必须是基本数据类型,并且以关键字final表示,在对这个常量进行定义时,必须对其先赋值
一个既是static又是final的域之占据一段不能改变的存储空间。明明时大写,紫和字之间有难过下划线隔开
对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法将其改为指向另一个对象,但对象自身时可更改的
Java允许在参数列表中以声明的方式将参数指明为final,这意味着无法在方法中更改参数引用所指向的对象
使用fianl方法的原因有两个:把方法锁定,以防任何继承类修改它的含义;效率(早期时,编译器采用final方法进行优化,现正在被替换)
类中所有的private方法都隐式地被指定为final
覆盖只有在某方法是基类的接口的一部分时才会出现。即必然能将向上转型为它的基本类型并调用相同的方法。若某方法是private,它就不是基类接口的一部分,仅是一些隐藏于类中的程序代码,具有相同的名称而已,若在导出类中出现“具有相同名称”的方法,仅是生成了一个新的方法
当某个类的整体定义为final时,意味着该类的设计永远不需要改变,不能被继承
类的代码在初次使用时才加载。即当创建类的第一个对象或访问类的static域或方法时,它才会被加载。所有的static对象或代码都会在加载时依顺序进行
加载初始化顺序,访问main()并加载该类的编译代码,加载基类的编译代码到根;对象中所有的基本类型和引用都会被置为默认值;基类构造器依继承关系自上到下被调用;实例变量按顺序依次初始化;构造器执行剩余部分初始化