Java中父类与子类的构造器调用和私有变量及私有方法的继承问题

一、子类构造器都必须显示或隐式调用父类构造器

众所周知,子类可以继承父类所有的变量和方法,但是有没有想过子类为何能继承它们,它们是凭空继承而来的么?当然不是,其实每当调用子类构造器new一个子类对象的时候,都要先调用父类的构造new一个父类对象,父类对象隐式的存在于子类中,子类是这样继承父类的变量和方法的,以我中有你的方式,所以子类构造器都必须显示或者隐式调用父类构造器,如果不能调用则该子类无效。另外还要补充的一点是,子类构造器调用父类构造器的方式类似于递归,也就是说子类先调用父类,然后父类再调用它的父类,以此类推一直到一个没有父类的类为止,最先用这个没有父类的类的构造器生成对象,再依次往子类方向生成对象。

tip:子类构造器中默认调用的是父类中的无参构造器,当父类构造器没写或者只有无参构造器时,子类构造器写不写父类的构造器都行;当父类中只有有参构造器时,则子类构造器中必须指明父类构造器;当父类中有无参构造器又有有参构造器时,子类构造器中若不写则是默认调用父类无参构造器,若要调用父类有参构造器则需要指明。


二、子类不能继承父类的私有变量和私有方法,但是当继承的方法涉及父类的私有变量时,该方法可以使用该私有变量。

举个例子:
父类Father

public class Father {
     public String house;
     public String car;
     private String shoes="huili"; //鞋子为私有变量

     public Father(String house,String car)
     {
         this.house=house;
         this.car=car;
     }

     public void FatherShoes()  //公共方法调用了鞋子私有变量
     {
         System.out.println("Father's shoes is:"+" "+shoes);
     }

}

子类Son

public class Son extends Father {

    public Son(String house,String car) 
    {
        super(house,car);
    }
}

测试类

public class Test {

    public static void main(String[] args) {
        Son a=new Son("apartment","benz");
        a.FatherShoes();  //调用继承父类的方法,该方法调用了父类的私有变量
    }

}

运行结果:

Father's shoes is: huili

可以看到该继承的方法成功调用了父类的私有变量,所以说子类不能继承父类的私有变量和方法,但是当继承的方法涉及父类的私有变量时可以使用该私有变量。

猜你喜欢

转载自blog.csdn.net/lovecaicaiforever/article/details/81604585