先来看下面这个代码能不能运行成功
Demo7.java
package pxx;
class TestDemo7 {
}
class TestDemo7Son extends TestDemo7 {
}
public class Demo7 {
public static void main(String[] args) {
TestDemo7Son testDemo7Son = new TestDemo7Son();
TestDemo7 testDemo7 = new TestDemo7();
}
}
上面代码能否运成功?
当然,是可以的。
来说一下TestDemo7与TestDemo7Son,是不是没有显示的构造方法,对的,这里编译器就会给这两个类提供一个默认的空参的构造方法,子类会去调用父类的无参构造方法,就比如下面
Demo7.java
package pxx;
class TestDemo7 {
public TestDemo7() {
}
}
class TestDemo7Son extends TestDemo7 {
public TestDemo7Son() {
}
}
public class Demo7 {
public static void main(String[] args) {
TestDemo7Son testDemo7Son = new TestDemo7Son();
TestDemo7 testDemo7 = new TestDemo7();
}
}
与上面的运行原理一样,但是修饰符默认的构造方法修饰符不是public的,默认的构造函数修饰符与当前类的修饰符有关。
再来说一下,如果子类用super显示调用了父类有参构造方法,就不会调用父类的无参构造方法。
Demo7.java
package pxx;
class TestDemo7 {
int age;
public TestDemo7() {
System.out.println("父类的无参构造方法");
}
public TestDemo7(int age) {
this.age = age;
}
}
class TestDemo7Son extends TestDemo7 {
public TestDemo7Son(int age) {
super(age);
}
}
public class Demo7 {
public static void main(String[] args) {
TestDemo7Son testDemo7Son = new TestDemo7Son(30);
}
}
运行结果:
没有结果,父类的无参构造函数没有被打印出来