Java构造方法的继承机制
2017-08-25 14:38
393 查看
1、如果类中没有构造方法,Java会给类自动添加一个无参的构造方法,即默认构造方法;如果定义了构造方法,则不会添加默认无参构造方法。
2、如果子类的构造方法没有通过super显式调用父类的构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认调用父类的无参构造方法。如果此时父类没有无参构造方法,则会编译出错。
3、如果子类的构造方法中通过super显式调用父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类的无参构造方法。
4、如果子类通过super显式调用父类的构造方法或者通过this显式调用自身的其他构造方法,那么super或者this必须是子类构造方法的第一条语句(但如果仅是通过this或super来访问成员属性则没有这个要求)。
此时输出结果为:
我是父类的无参构造方法
我是子类的有参构造方法,参数为null
我是子类的无参构造方法
如果去掉父类的无参构造方法
此时编译报错,在ChildClass的有参构造函数那里提示:
Implicit super constructor FatherClass() is undefined. Must explicitly invoke another constructor
将子类的有参构造方法修改如下:
此时的运行结果为:
我是父类的有参构造方法,参数为null
我是子类的有参构造方法,参数为null
我是子类的无参构造方法
或者去掉父类的有参构造方法,改为:
此时运行结果为:
我是子类的有参构造方法,参数为null
我是子类的无参构造方法
在上面的方法中,系统自动为父类生成一个无参构造方法。
2、如果子类的构造方法没有通过super显式调用父类的构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认调用父类的无参构造方法。如果此时父类没有无参构造方法,则会编译出错。
3、如果子类的构造方法中通过super显式调用父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类的无参构造方法。
4、如果子类通过super显式调用父类的构造方法或者通过this显式调用自身的其他构造方法,那么super或者this必须是子类构造方法的第一条语句(但如果仅是通过this或super来访问成员属性则没有这个要求)。
public class FatherClass { public FatherClass() { System.out.println("我是父类的无参构造方法"); } public FatherClass(String str) { System.out.println("我是父类的有参构造方法,参数为" + str); } } public class ChildClass extends FatherClass { public ChildClass() { this(null); System.out.println("我是子类的无参构造方法"); } public ChildClass(String str) { System.out.println("我是子类的有参构造方法,参数为" + str); } } public class Test { public static void main(String[] args) { ChildClass childClass = new ChildClass(); } }
此时输出结果为:
我是父类的无参构造方法
我是子类的有参构造方法,参数为null
我是子类的无参构造方法
如果去掉父类的无参构造方法
public class FatherClass { // public FatherClass() { // System.out.println("我是父类的无参构造方法"); // } public FatherClass(String str) { System.out.println("我是父类的有参构造方法,参数为" + str); } } public class ChildClass extends FatherClass { public ChildClass() { this(null); System.out.println("我是子类的无参构造方法"); } public ChildClass(String str) { System.out.println("我是子类的有参构造方法,参数为" + str); } }
此时编译报错,在ChildClass的有参构造函数那里提示:
Implicit super constructor FatherClass() is undefined. Must explicitly invoke another constructor
将子类的有参构造方法修改如下:
public class FatherClass { // public FatherClass() { // System.out.println("我是父类的无参构造方法"); // } public FatherClass(String str) { System.out.println("我是父类的有参构造方法,参数为" + str); } } public class ChildClass extends FatherClass { public ChildClass() { this(null); System.out.println("我是子类的无参构造方法"); } public ChildClass(String str) { super(str); System.out.println("我是子类的有参构造方法,参数为" + str); } } public class Test { public static void main(String[] args) { ChildClass childClass = new ChildClass(); } }
此时的运行结果为:
我是父类的有参构造方法,参数为null
我是子类的有参构造方法,参数为null
我是子类的无参构造方法
或者去掉父类的有参构造方法,改为:
public class FatherClass { // public FatherClass() { // System.out.println("我是父类的无参构造方法"); // } // public FatherClass(String str) { // System.out.println("我是父类的有参构造方法,参数为" + str); // } } public class ChildClass extends FatherClass { public ChildClass() { this(null); System.out.println("我是子类的无参构造方法"); } public ChildClass(String str) { System.out.println("我是子类的有参构造方法,参数为" + str); } } public class Test { public static void main(String[] args) { ChildClass childClass = new ChildClass(); } }
此时运行结果为:
我是子类的有参构造方法,参数为null
我是子类的无参构造方法
在上面的方法中,系统自动为父类生成一个无参构造方法。
相关文章推荐
- java继承之构造方法
- Java语言入门教程(十三):Java语言中继承中的构造方法问题
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨 .
- Java 语言静态变量和静态方法继承机制的吐槽
- JAVA学习笔记(五)继承时的构造方法、多态、接口、汉诺塔
- java继承中的构造方法
- java 继承中的构造方法
- Java继承中父类子类构造方法、静态代码块、非静态代码块的执行顺序
- java中利用反射机制得到一个类的所有构造方法,成员方法机器参数的列表
- Java学习之面向对象(方法的重写 overwrite,super的使用,继承中的构造方法)
- Java学习记录(一):Java中继承与静态static、非静态、构造方法等的初始化顺序
- java[继承][构造方法]
- SJCP试题--JAVA继承时候的构造方法笔试面试总结
- java 构造方法的继承
- java中的继承问题,类B继承A,那么构造方法需要这样写吗?这不是重复吗?还有接口与抽象类怎么实现?
- java代码继承难点。构造方法的调用
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的研究
- java继承中的构造方法
- JAVA构造方法的继承
- java中,子类能不能继承父类的构造方法?