Java中父类和子类关于构造方法和私有属性的几个问题
一、什么是默认构造方法?子类构造方法与父类构造方法的关系?
通过前面的学习可以知道:默认构造方法是指无参构造方法,(1)隐式包含的默认构造方法:当类的定义中没有任何显式的构造方法(无参或有参)时,则系统默认会给该类一个隐式的无参构造方法。 (2)显式定义的默认构造方法:当类中显式定义了一个无参构造方法。
对于以下示例:
//父类
public class Person {
public String name;
public int age;
public Person(){
System.out.println("父类无参构造方法执行了");
}
}
//子类及其实现
public class Charactor extends Person {
public void run(){
System.out.println("Charactor的实例对象开始奔跑!");
}
public static void main(String[] args) {
Charactor cp=new Charactor();
cp.run();
}
}
运行结果如下:
父类无参构造方法执行了
Charactor的实例对象开始奔跑!
这里注意到子类Charactor中并没有显式定义构造方法,但依然可以执行的原因是JVM编译时自动为其添加了默认构造方法(无参的),如下:
public Charactor(){ }
如果显式地添加上述代码,运行结果是一致的。
我们还注意到运行结果中有“父类无参构造方法执行了”,说明父类构造方法也执行了,其实这里说明任何一个类的实例对象的实现(创建)都依赖于其父类实例对象的实现。而这里Charactor的构造方法中其实也隐式地调用了父类的构造方法,完整的Charactor构造方法如下:
public Charactor(){
super();
}
可以发现显式添加上述代码后,运行结果依然一致。
从上面可以总结出:
*子类实例的创建依赖于父类的实例,所以就依赖于父类的构造方法,而如果没有显式地定义子类的构造方法,系统会自动隐式地给其添加无参构造方法。无论是直接显式编写代码还是系统自动添加的无参构造方法,系统都会在其中隐式地添加父类的默认构造方法。
那么当父类中缺少默认构造方法时呢?*
public class Person {
public String name;
public int age;
public Person(String name,int age){
this.name=name;
this.age=age;
System.out.println("父类构造方法执行了");
}
}
public cl