-
Notifications
You must be signed in to change notification settings - Fork 0
Java高手训练营第五章第十二节:继承的成员特点
ufofVincent edited this page Jan 17, 2016
·
1 revision
如果子类和父类的方法或者字段名称冲突,若为父类实例执行父类的字段/方法;如果子类实例执行子类的字段/方法。相当于子类把父类的字段/方法覆盖了。
class InheritanceConflict{
public static void main(String[] args){
SuperClass superclass = new SuperClass(); //实例化父类
System.out.println(superclass.num); //打印父类的num字段
superclass.print(); //调用父类的print()方法
SubClass subclass = new SubClass(); //实例化子类
System.out.println(subclass.num); //打印子类的num字段
subclass.print(); //调用子类的print()方法
}
}
class SuperClass{
int num = 7;
void print(){
System.out.println("我是父类");
}
}
class SubClass{
int num = 8;
void print(){
System.out.println("我是子类");
}
}
结果:
7
我是父类
8
我是子类
在这个小实例当中,可以发现如果通过父类实例调用字段/方法则执行父类的;如果通过子类实例调用字段/方法则执行子类的。
这种机制叫做复写。在开发当中,永远永远不要去改源代码。应当是通过写一个子类继承原本的类来复写其的字段/方法。因为如果你直接在原本的类当中改代码,其他的类会受到牵连。
而且,有的时候子类虽然继承了父类,但是执行的结果是不一样的。比如说鸟类都可以飞,企鹅是鸟的子类,但是它就不能飞。我们可以在企鹅类当中复写鸟类的飞方法,已达到重写。
class OverrideDemo{
public static void main(String[] args){
Penguin p = new Penguin();
p.fly();
}
}
class Bird{
void fly(){
System.out.println("飞");
}
}
class Penguin extends Bird{
void fly(){
System.out.println("我不能飞");
}
}
结果:
我不能飞
注意:如果子类要重写父类的方法,返回值、方法名和参数列表必须完全一样。不然编译器会认为你是在子类中建立一个特有的方法,而非复写。而且,复写的方法的访问权限必须大于等于被复写的方法。
我们都知道,要先有父类才有子类。比如说要先有父亲才会有儿子。所以说在Java当中,创建一个子类对象时,会先调用父类的构造方法,然后再调用自己的构造方法。
class InheritanceConstructor{
public static void main(String[] args){
new SubClass();
}
}
class SuperClass{
SuperClass(){
System.out.println("父类构造方法执行");
}
}
class SubClass extends SuperClass{
SubClass(){
System.out.println("子类构造方法执行");
}
}
结果:
父类构造方法执行
子类构造方法执行
- 父类对象调用父类字段/方法;子类对象调用子类字段/方法
- 子类对父类的成员的更改叫做重写
- 创建子类对象时先调用父类构造方法,然后调用本身的构造方法