参考:
MCBBS-JAVA高手训练营第五章
深入理解Java的接口和抽象类
一、
通过继承可以实现一些公共方法的复用。
即子类继承父类后,就会拥有父类的方法和字段。
JAVA中通过关键字extends来实现继承,格式为:
class 子类名 extends 父类(){
//Code
}
二、
如果子类和父类的方法或字段名称冲突,若为父类实例则执行父类方法/字段,若为子类则执行子类的方法/字段,相当于子类把父类的方法/字段覆盖掉了。这种机制称为复写。
注:如果要复写父类的方法,方法名、返回值、参数列表必须完全一样,并且复写的方法的访问权限必须大于或等于被复写的方法。
三、
在JAVA中,创建一个子类对象时,会先调用父类的构造方法,然后再调用自己的构造方法。
四、
super关键字可以用于调用父类的方法、字段和构造方法。
语法为:
super.字段
super.方法
super(父类构造方法参数) //调用父类的构造方法
注:super()必须是构造方法中的第一个语句。
调用的例子:
class SuperDemo{
public static void main(String[] args){
new SubClass().print();
}
}
class SuperClass{
int num = 10;
void show(){
System.out.println("我是父类");
}
}
class SubClass extends SuperClass{
int num = 5;
void show(){
System.out.println("我是子类");
}
void print(){
super.show();
}
}
这样,SubClass虽然复写了show()方法,但是print方法中通过super调用的父类SuperClass的show()方法。
例子二:
class SuperDemo{
public static void main(String[] args){
new SubClass();
}
}
class SuperClass{
SuperClass(){
System.out.println("父类构造方法");
}
}
class SubClass extends SuperClass{
SubClass(){
super();
System.out.println("子类构造方法");
}
}
结果为:
前面所说的会先调用父类的构造方法再调用子类的构造方法,其实就是在子类的构造方法中的第一句加入了一个super()。如果你不写这个super(),依旧会给你写上一个。
五、
继承的复写特征带来方便性的同时,也会有一个安全隐患,即通过复写可以随意修改父类的方法,即使是一个非常重要的方法。
而要解决的方式就是不让某一个类被继承或不让某一个方法被复写–使用final关键字。
final关键字可以修饰变量、方法和类,被final修饰的类不能被继承,被final修饰的方法不能被复写。
六、
在某些场景下会有如下的情况,父类中某个方法实现出来没有任何的意义,必须根据子类的实际需求来进行不同的实现,则可以将这个方法声明为抽象方法,而这个父类也就成为了抽象类。
抽象方法是一种特殊的方法,只有声明,而没有具体的实现,即不能创建对象。
抽象方法通过修饰符abstract声明,格式为:
其他修饰符 abstract 方法名(参数列表);
要注意方法最后有分号结尾。
如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。
其他修饰符 abstract 类名{
//代码
}
含有抽象方法的类称为抽象类,但抽象类中不是只能有抽象方法,也可以有成员变量和普通的成员方法。
需要注意的是抽象方法必须为public或protected,
如果一个类继承于一个抽象类,但却没有复写其父类的所有抽象方法,则此子类成为抽象类。
注:
一个类只能继承一个抽象类。