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类(子类)的构造方法执行了");
}