Skip to content

Java高手训练营第五章第十二节:继承的成员特点

ufofVincent edited this page Jan 17, 2016 · 1 revision

5.12 继承的成员特点

5.12.1 继承中的字段和方法

如果子类和父类的方法或者字段名称冲突,若为父类实例执行父类的字段/方法;如果子类实例执行子类的字段/方法。相当于子类把父类的字段/方法覆盖了。

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("我不能飞");
    }
}

结果:

我不能飞

注意:如果子类要重写父类的方法,返回值、方法名和参数列表必须完全一样。不然编译器会认为你是在子类中建立一个特有的方法,而非复写。而且,复写的方法的访问权限必须大于等于被复写的方法。

5.12.2 构造方法

我们都知道,要先有父类才有子类。比如说要先有父亲才会有儿子。所以说在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("子类构造方法执行");
    }
}

结果:

父类构造方法执行
子类构造方法执行

本章小结

  • 父类对象调用父类字段/方法;子类对象调用子类字段/方法
  • 子类对父类的成员的更改叫做重写
  • 创建子类对象时先调用父类构造方法,然后调用本身的构造方法
Clone this wiki locally