回顾一下对super关键字的理解
public class Animal {
private String name;
public Animal(String name){
System.out.println("Animal的有参构造~");
}
public Animal(){
System.out.println("Animal的无参构造~");
}
}
public class Person extends Animal{
public Person(){
System.out.println("Person的无参构造~");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
}
}
从运行结果可以看出,程序最先调用的是Animal类的无参构造,因为Person类继承Animal类。会调用父类的无参构造,接着才会调用本类的无参构造。这是为什么呢?我讲述一下我的观点
- 问:当子类继承父类之后,我们是不是有可能会访问到父类中的一些成员变量,成员方法?
- 答:答案是肯定的。java中之所以要有继承这个体系,就是为了减少冗余,让一些变量和方法能够得到复用。
- 问:构造方法的作用?
- 答:初始化一个对象的信息。
如果我们能很好的理解上述两个问题,问题就很简单了。当我们在子类中使用构造方法时,这个对象就被构建出来了。
假设我们构建这个子类对象会用到父类对象的一些属性,那么这个父类必须是构建完成的,也就是说父类必须先存在,我们这个子类才能被创建出来,不然会存在异常。就好比你不可能是凭空产生的,必然是先有了的爸爸,妈妈。才能把你生下来。
那么有的小伙伴问了:我在创建子类时如果不用到父类的一些属性呢?我想说的是在创建时你可能用不到父类的一些属性。那创建完成后是否可能用到呢?
那么又有的小伙伴问了:我创建时和创建后都不用到父类的属性呢?那么我想说的是,既然都这样了, 这两个类之间还存在继承关系吗?
上述个人观点不足或有错误之处请大佬指正。
public class Animal {
private String name;
public Animal(String name){
System.out.println("Animal的有参构造~");
}
public Animal(){
System.out.println("Animal的无参构造~");
}
public void shout(){
System.out.println("动画发出叫声~");
}
}
public class Dog extends Animal{
public void shout(){
System.out.println("汪汪~");
}
}
public class TestDemo {
public static void main(String[] args) {
//Person person = new Person();
Dog dog=new Dog();
dog.shout();
}
}
当子类重写父类的shout()时,子类对象无法访问父类被重写的方法。那么如何让子类访问父类的成员呢?super关键字的作用就来了。
一、使用super关键字在子类中访问父类的成员变量和成员方法。具体格式如下:
super.成员变量
super.成员方法(参数1,参数2...)
public class Animal {
public String name="我是动物";
public Animal(String name){
System.out.println("Animal的有参构造~");
}
public Animal(){
System.out.println("Animal的无参构造~");
}
public void shout(){
System.out.println("动画发出叫声~");
}
}
public class Dog extends Animal{
public String name;
public void shout(){
super.shout();
}
public void getAnimalName(){
System.out.println("访问父类的成员变量:"+super.name);
}
}
public class TestDemo {
public static void main(String[] args) {
//Person person = new Person();
Dog dog=new Dog();
dog.shout();
dog.getAnimalName();
}
}
从运行结果看出,我们成功在子类使用super关键字中访问到了父类的成员变量和成员方法。
二、 使用super关键字在子类中访问父类的构造方法 格式如下:
super.() // 访问无参构造方法
super.(arg1) // 访问有参构造方法
public class Animal {
public String name;
public Animal(String name){
System.out.println("我是一只"+name);
}
public Animal(){
System.out.println("我是一只动物~");
}
}
public class Dog extends Animal{
public Dog(){
super();
}
public Dog(String name){
super(name);
}
}
public class TestDemo {
public static void main(String[] args) {
//Person person = new Person();
Dog dog=new Dog();
Dog dog1=new Dog("中华田园犬");
}
}
从运行结果可以看,我们成功的在子类中使用super关键字访问到了父类的有参构造和无参构造。
在最开始时我们讲到,运行子类的构造方法时,首先会访问父类的构造方法,其次才会访问子类的构造方法。
需要注意的是,通过super调用父类的构造方法的代码必须位于子类构造方法的第一行。换一种说法,要想在子类中访问父类的构造方法就必须是在子类的构造方法中使用suepr()。