首页 > Java有参数的父类构造函数调用过程

Java有参数的父类构造函数调用过程

 public abstract class Animal{
        private String name;
        public String getName(){
            return name;
        }
        public Animal(String theName){
            name = theName;
        }
 }
 public class Hippo extends Animal{
        public Hippo(String name){
                super(name);
        }
}
public class MakeHippo{
        public static void main(String[] args){
            Hippo h = new Hippo("Buffy");
                System.out.println(h.getName());
        }
}

输出结果是Buff

我没看懂name传递过程中new Hippo ("Buffy")变量传递给构造函数public Hippo(String name)后是怎么传递给return name返回上去的 super(name)引用的是什么,求解释运行过程。 十分感谢


你把super(name),看成this.Animal(name)就好理解了。

换句话说,就是把子类的实例作为this去调用父类的构造函数。

如果你懂JavaScript就更好理解了,等价于:

Animal.call(this, name);

父类是如何接收的


  1. 创建一个Hippo对象h,实例化

  2. 调用Hippo构造方法

  3. super(name)调用父类(也称超类)Animal的构造方法
    这里为什么不在子类里直接this.name = name?
    因为name是父类的私有属性,访问不到。需要调用父类里面的public修饰的方法来操作,比如调用父类构造方法把你的初始化参数传过去。后面如果想修改name,肯定需要父类里面有个public的setName方法。
    这就好比你父母的财产,是他们的私有财产,作为孩子也不能想拿就拿。父母需要同意你使用,OK给你public授权的get set方法,你就可以动这笔钱了。

  4. 调用h对象的getName方法。在子类中没找到,然后去父类中找,找到了然后调用。
    为什么不在子类中直接写个getName呢?
    还是上面的问题,父类private属性,子类中访问不到,肯定要在父类里面写个public的方法。
    可是子类里并没有这个方法,不会报错吗?
    父类中的public方法,子类是直接继承的。


Java的方法调用都会隐式的传入调用对象,比如:

Hippo h = new Hippo("Buffy");
System.out.println(h.getName());

//h.getName() 实际上就是Hippo.getName(h)
//在你new一个Hippo对象的时候,如果其父类存在无参数的构造方法且被调用的构造方法第一步不是调用父类构造方法的情况下会调用父类的无参数构造方法,当然你这里显示的调用了父类有参数的构造方法
//super(name) 就相当于 Animal(this,name)调用父类构造方法,这里this是指你new出来的对象,也就是一个Hippo实例对象。
//h.getName() Hippo类并没有getName方法,会调用父类的getName方法,这一点是java的多态性的体现。
【热门文章】
【热门文章】