本篇文章总结了一些关于Java构造方法的常见问题。

为什么创建了一个子类对象会调用其父类的构造方法

如下代码示例:

package simplejava;class Super {String s;public Super() {System.out.println("Super");}
}class Sub extends Super {public Sub() {System.out.println("Sub");}}public class Q4 {public static void main(String[] args) {Sub s = new Sub();}
}

结果打印:

Super
Sub

当一个类继承了某个类时,在子类的构造方法里,super()必须先被调用;如果你没有写,编译器会自动调用super()方法,即调用了父类的构造方法;

这并不是创建了两个对象,其实只有一个子类Sub对象;之所以需要调用父类的构造方法是因为在父类中,可能存在私有属性需要在其构造方法内初始化;

当编译器自动插入父类构造方法的调用后,子类的构造方法类似如下代码:

    public Sub() {super();System.out.println("Sub");}

一个常见的错误信息:Implicit super constructor is undefined for default constructor

对于Java开发人员来说,这是一个很常见的编译错误:

"Implicit super constructor is undefined for default constructor. Must define an explicit constructor"

之所以出现这个编译错误,是因为父类的默认构造方法未定义。在Java中,如果一个类没有定义构造方法,编译器会默认插入一个无参数的构造方法;但是如果一个构造方法在父类中已定义,在这种情况,编译器是不会自动插入一个默认的无参构造方法,这正是以上demo的情况;

对于子类来说,不管是无参构造方法还是有参构造方法,都会默认调用父类的无参构造方法;当编译器尝试在子类中往这两个构造方法插入super()方法时,因为父类没有一个默认的无参构造方法,所以编译器报错;

要修复这个错误,很简单:

1、在父类手动定义一个无参构造方法:

public Super(){System.out.println("Super");
}

2、移除父类中自定义的构造方法

3、在子类中自己写上父类构造方法的调用;如super(value);

在子类中明确调用父类构造方法

以下代码运行正常:

父类定义了一个有参构造方法,然后子类构造方法明确调用了父类有参构造方法;

规则总结

简单的说,规则是这样的:

在子类构造方法中,不管是程序员手动调用父类构造方法还是编译器自动调用,

子类构造方法必须要调用父类的某个构造方法;

被子类调用的父类构造方法在父类中必须是存在的;

一个有趣的问题

如果一个类定义了一个有参数的构造方法,Java为什么就不提供默认的无参构造方法呢?

有兴趣的可以看下stackoverflow中的回答:

http://stackoverflow.com/q/16046200/127859

译文链接:http://www.programcreek.com/2013/04/what-are-the-frequently-asked-questions-about-constructors-in-java/

转载于:https://www.cnblogs.com/chenpi/p/5486096.html

关于JAVA中子类和父类的构造方法相关推荐

  1. [转载]关于JAVA中子类和父类的构造方法

    原文链接:https://www.cnblogs.com/chenpi/p/5486096.html#_label0 转载于:https://www.cnblogs.com/chiweiming/p/ ...

  2. java中子类继承父类时是否继承构造函数

    java继承中对构造函数是不继承的,只是调用(隐式或显式). 以下是例子: public class FatherClass { public FatherClass() {        Syste ...

  3. java中子类继承父类程序执行顺序问题

    为什么80%的码农都做不了架构师?>>>    Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说 ...

  4. java中子类和父类的初始化和函数调用关系

    在开始说明之前,我们直接来看一个代码 public class play {public static void main(String[] args) {Base base = new Sub(); ...

  5. java中子类与父类强制转换_java中父类强制转换成子类的错觉

    引言:父类引用指向子类对象在java中十分常见,比如: Object object=new a();//a是一个类名 但是有时候我们看见子类引用指向了父类对象,就是上边的反过来,比如 图片中圈1标识的 ...

  6. java中子类与父类中隐含的this引用的分析

    /*看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{public int x;public Parent p;public Parent(){}public P ...

  7. Java中子类覆盖父类方法所必须满足的条件

    因为太喜欢,所以转来,侵删! 参考自:http://www.it165.net/pro/html/201504/39284.html 一.描述 子类重写(覆盖)父类的方法必须满足的条件: 1.父类中的 ...

  8. java中子类对父类中的私有变量和私有方法有拥有权无使用权

    解释的我觉得也到位:子类拥对父类的私有变量具有拥有权 但是不具有使用权. 再和以前学的东西联系起来,总结如下: 1.不管父类中的成员变量是静态的还是非静态的,子类统统拥有(这里不用继承概念). 2.不 ...

  9. 关于Java中子类调用父类方法

    当一个类继承于另一个类,子类中没有父类的方法时.用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性.  如果 ...

最新文章

  1. 要不是这本书及时出现,本周真撑不下去…
  2. BCH升级辩论仍在继续:BU提出一项新的硬分叉策略
  3. C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签
  4. java读取属性文件的方法_java读取属性文件的方法
  5. Ubuntu中如何使用root用户
  6. redistemplate注入为null_Windows DLL 注入技术
  7. ffplay分析 (暂停 / 播放处理)
  8. 局域网大型文件分发的可能解决方案
  9. abstract、virtual、override 和 new
  10. pkpm快速入门教程_PKPM快速入门教程.ppt
  11. JNI/NDK入门指南之JNI数据类型,描述符详解
  12. 电脑ping不通的原因
  13. 触摸屏计算机技术参数,触摸屏硬件安装—— 触摸屏参数设置
  14. Deepin常用环境配置
  15. Charles的安装和注册码破解
  16. 平价无线蓝牙耳机推荐,小米和南卡蓝牙耳机哪个好用?
  17. 2020年面试后端必会算法记录
  18. 新手站长做网站SEO的无奈与煎熬
  19. 魔百盒 修改时间服务器,魔百盒网关服务器下发超时
  20. 英文软件测试文章翻译,软件测试中英文对照外文翻译文献

热门文章

  1. spring系列-注解驱动原理及源码-AOP使用及源码解析
  2. flutter的安装与设置
  3. ATDD验收测试驱动开发
  4. 592zn rom/apk 自动签名工具_ios超级签名服务器
  5. 全国计算机等级考试三级历年真题,历年全国计算机等级考试三级(数据库技术)笔试选择真题...
  6. php调用c语言库,使用C语言给php写扩展
  7. 网络爬虫(一):配置selenium、pycharm(windows平台)
  8. linux下rpm方式安装mysql5.6及问题解决
  9. 项目开发--------XMPP即时通讯
  10. 如何读取jar包外的properties文件和log4j.properties