复用的三种方式:
组合、继承、代理(代理是组合和继承的结合,Java中没有直接支持。通过将A类组合在B类中,并在B类中暴露A的所有接口来实现)
组合:将对象引用置于新类中即可。表示has-a关系。
继承:子类从父类继承得到父类的方法和变量,再根据自己需要对方法和变量进行增加和修改。表示is-a关系。
可以认为子类对象中包含了一个父类对象,所以在构造一个子类对象时,会先构造一个父类对象。构造顺序由里向外。参考下列代码,输出依次为:Art、Drawing、Cartoon。
class Art{
Art(){
System.out.println("Art");
}
}
class Drawing extends Art{
Drawing(){
System.out.println("Drawing");
}
}
public class Cartoon extends Drawing{
public Cartoon(){
System.out.println("Cartoon");
}
public static void main(String args[]){
Cartoon c=new Cartoon();
}
}
另外,如果需要调用一个带参数的基类构造器,必须显示调用super(parameter)。
重载和重写
重载指通过使参数列表不同来实现共用同一方法名的行为。
重写指子类重写父类中的某一方法以实现子类的特殊需求,参数列表需与父类中方法一致,否则就成了重载。
@Override表示重写,当方法发生意外重载时(即参数列表被改变),@Override后紧跟的方法会报错。
向上转型
子类对象可被理解为父类类型。
final关键字
对对象引用运用final时,表示该引用将永远无法指向另一个对象,但是该引用所指向的对象本身可变。
一个既是static又是final的域指占据一段不能改变的存储空间。static表示全局唯一,final表示不变。
final参数:表示在方法中无法改变参数引用所指向的对象
final方法:
final在这里表示方法不希望被修改。即使在继承过程中,子类也不能对父类的final方法做出任何修改,即final方法无法被重写。
所有private方法都被隐式地指定为final。
final类:
不允许被继承。
类中的域可以选择是不是final。
类中方法均被隐式地指定为final。