你将以下代码运行看一下,可以发现在子类中会隐式的调用父类的无参构造器class A{ public A(){ System.out.println("A构造") } } class B extends A{ public B(){ //super();//这里会有一个隐式的调用 System.out.println("B构造") } }class Ma{ public static void main(String[] args){ B b =new B(); } }
public class Test { //测试类 public static void main(String[] args) { Son son=new Son(); //子类的构造方法会默认继承父类的构造方法 } }class Father { //父类 public Father() { System.out.println("我就是父类方法!"); } }class Son extends Father { //子类继承父类 public Son() { //super();其实系统会在子类构造方法默认调用父类的构造方法 System.out.println("我是子类方法!"); }
你用我的代码跑一下就知道了,希望对你有用,好好加油!public class Test { //测试类 public static void main(String[] args) { Son son=new Son(); //子类的构造方法会默认继承父类的构造方法 } }class Father { //父类 public Father() { System.out.println("我就是父类方法!"); } }class Son extends Father { //子类继承父类 public Son() { //super();其实系统会在子类构造方法默认调用父类的构造方法 System.out.println("我是子类方法!"); }
如果没有被重写,就会直接调用父类的构造方法,默认super的
如果子类构造器没有显式调用,则编译器帮你调用不信的话,做个测试:
定义一个父类,这个类有带参数的构造器
为这个父类定义一个子类,在子类构造器中不显式调用父类构造器你看能不能编译通过
实现上:子类构造器必须调用父类构造器,并且是子类构造器中的第一条语言
而这个规则在C#里有更好的语法保证,C#里调用父类构造器的写法是:
public SubClass() : base(argument list) {
......
}
public A(){
System.out.println("A构造")
}
} class B extends A{
public B(){
//super();//这里会有一个隐式的调用
System.out.println("B构造")
}
}class Ma{
public static void main(String[] args){
B b =new B();
}
}
为什么呢?
这是因为子类不能访问private对象,如果不调用基类的构造方法的话,就没有创建基类,那么基类中的private对象就没有创建,这显然是是不行的。只有基类的构造器才能够完整创造对象
public class Test { //测试类
public static void main(String[] args) {
Son son=new Son(); //子类的构造方法会默认继承父类的构造方法
}
}class Father { //父类
public Father() {
System.out.println("我就是父类方法!");
}
}class Son extends Father { //子类继承父类
public Son() {
//super();其实系统会在子类构造方法默认调用父类的构造方法
System.out.println("我是子类方法!");
}
public void diaoYongFuMehtod(){
super(); //报错,这里不能调用父类构造方法,父类构造方法只能被子类构造方法调用,不能被子类的普通方法调用
/**
* 解释原因:
* 假设这个父类构造方法是可以在子类普通方法中被调用的,也就是new Son().diaoYongFuMehtod();这里的意思就是先加载Son类创建好
* Son类对象然后调用diaoYongFuMehtod方法,然后diaoYongFuMehtod方法里的super()是加载Father类,总体类加载顺序就是
* Son类-->Father类.而其实虚拟机真正的加载方式是先加载Father类,再加载子类的.(用现实生活举例:没有父亲这个人出现哪会有儿子呢,
* 其实java语言很多都是符合伦理道德的)
* */
}
}
public static void main(String[] args) {
Son son=new Son(); //子类的构造方法会默认继承父类的构造方法
}
}class Father { //父类
public Father() {
System.out.println("我就是父类方法!");
}
}class Son extends Father { //子类继承父类
public Son() {
//super();其实系统会在子类构造方法默认调用父类的构造方法
System.out.println("我是子类方法!");
}
public void diaoYongFuMehtod(){
super(); //报错,这里不能调用父类构造方法,父类构造方法只能被子类构造方法调用,不能被子类的普通方法调用
/**
* 解释原因:
* 假设这个父类构造方法是可以在子类普通方法中被调用的,也就是new Son().diaoYongFuMehtod();这里的意思就是先加载Son类创建好
* Son类对象然后调用diaoYongFuMehtod方法,然后diaoYongFuMehtod方法里的super()是加载Father类,总体类加载顺序就是
* Son类-->Father类.而其实虚拟机真正的加载方式是先加载Father类,再加载子类的.(用现实生活举例:没有父亲这个人出现哪会有儿子呢,
* 其实java语言很多都是符合伦理道德的)
* */
}
}