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关键字。
我们在父类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类(子类)的构造方法执行了"); }