一、子类构造器都必须显示或隐式调用父类构造器
众所周知,子类可以继承父类所有的变量和方法,但是有没有想过子类为何能继承它们,它们是凭空继承而来的么?当然不是,其实每当调用子类构造器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
可以看到该继承的方法成功调用了父类的私有变量,所以说子类不能继承父类的私有变量和方法,但是当继承的方法涉及父类的私有变量时可以使用该私有变量。