Java中 super关键字

    xiaoxiao2021-04-15  31

    super关键字:在对象的内部使用,可以代表父类对象。

    1.访问父类的属性 super.age; 2.访问父类的方法 super.eat();

    新建java项目演示:

    Init.java 是项目入口文件:

    package com.mydev; public class Init { /** * 入口函数 * @param args */ public static void main(String[] args){ Dog dog = new Dog(); dog.method(); } }

    Animal.java 的动物类(父类):

    package com.mydev; public class Animal { public int age = 10; public void eat(){ System.out.println("父类eat方法"); } }

    Dog.java 继承自Animal.java:

    package com.mydev; public class Dog extends Animal{ public void method(){ // 访问父类的属性 System.out.println("父类的age=" + super.age); } }

    程序逻辑:我们在入口文件的main 函数里实例化了一个Dog 类对象,然后调用本类的method() 方法。该方法中访问了父类的age 属性,使用super.age 的方式。

    如果子类有和父类的同名方法,比如说eat() 方法,在子类中如何区分调用呢?

    public class Dog extends Animal{ public void eat(){ System.out.println("子类的eat方法"); } public void method(){ // 访问父类的属性 System.out.println("父类的age=" + super.age); // 调用父类的方法 super.eat(); // 调用本类的方法 eat(); } }

    执行打印结果:

    父类的age=10 父类eat方法 子类的eat方法

    super关键字和构造方法的关系

    子类的构造的过程当中必须调用其父类的构造方法。 我们之前已经总结了,当我们创建子类的对象的时候,其实会自动调用父类的构造方法,并且创建父类对象。这里实质上就隐式地使用了super关键字。

    我们在父类Animal类中创建一个构造方法:

    public Animal(){ System.out.println("Animal类(父类)的构造方法执行了"); }

    子类Dog类中也创建一个构造方法:

    public Dog(){ System.out.println("Dog类(子类)的构造方法执行了"); }

    然后我们实例化子类Dog类的时候发现,父类的构造方法也执行了,而且上先于子类的构造方法执行的。

    Dog dog = new Dog();

    程序执行打印结果:

    Animal类(父类)的构造方法执行了 Dog类(子类)的构造方法执行了

    如果子类的构造方法中没有显示地调用父类的构造方法,则系统默认调用父类无参数的构造方法

    public Dog(){ super(); //这里写和不写效果上一样的。不写会隐式调用。 System.out.println("Dog类(子类)的构造方法执行了"); }

    如果显示地调用父类的构造方法,必须上在子类的构造方法等第一行

    如果父类没有指定无参的构造方法,而子类的构造方法中也没有显式地调用父类的构造方法,则会编译报错

    /* public Animal(){ System.out.println("Animal类(父类)的构造方法执行了"); }*/ public Animal(int age){ this.age = age; }

    父类只有有参数的构造方法, 现在子类就不能隐式地(不写super())调用父类的构造方法了 显式地调用就可以了:

    public Dog(){ super(10); System.out.println("Dog类(子类)的构造方法执行了"); }
    转载请注明原文地址: https://ju.6miu.com/read-671673.html

    最新回复(0)