当前位置:  开发笔记 > 编程语言 > 正文

Java中的默认构造函数和继承

如何解决《Java中的默认构造函数和继承》经验,为你挑选了5个好方法。

我有一个关于Java中的默认构造函数和继承的问题.

通常,如果你编写一个类并且不包含任何构造函数,Java会自动为你提供一个默认构造函数(一个没有参数),它初始化类的所有实例变量(如果有的话)都有一些默认值(0,null或者是假的.但是,如果使用某些参数编写构造函数,并且不编写任何默认构造函数,则Java不提供默认构造函数.我的问题是:类继承自其他类的情况是什么 - 如果我编写一个带有一些参数的构造函数,但是不包含默认构造函数,它们是否继承了超类的默认构造函数?



1> paulmurray..:

    如果不创建构造函数,则会自动创建默认的空构造函数.

    如果任何构造函数没有显式调用super或this构造函数作为其第一个语句,则会自动添加对super()的调用.

总是.


链接被打破(谢谢,Oracle),这里有新的链接:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9和http:/ /docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7

2> starblue..:

构造函数不是继承的.

此外,字段的初始化由虚拟机完成,而不是默认构造函数.默认构造函数只调用超类的默认构造函数,而Object的默认构造函数为空.这种设计的优点是无法访问未初始化的字段.



3> Peter Lawrey..:

除非你使用super(...),否则构造函数会调用其父级的空构造函数.注意:它在所有类上执行此操作,甚至是扩展Object的类.

这不是继承,子类不会获得具有相同参数的相同构造函数.但是,您可以添加调用超类的构造函数之一的构造函数.



4> 小智..:

基本规则是对构造函数的调用(或调用)应该是JVM需要执行的第一个语句,

所以当你有一个只有参数化构造函数且没有默认构造函数的超类,并且基类没有对超类的参数化构造函数的显式调用时,JVM提供了super(); 由于没有超类的默认构造函数,因此抛出错误的调用,所以我们要么在超类中提供默认构造函数,要么在基类构造函数中显式调用超类的参数化构造函数.当我们给出显式调用时,那么JVM就懒得把行放到super(); 因为构造函数调用应该是方法的第一个语句,这是不可能发生的(因为我们的显式调用).



5> dasblinkenli..:

Java语言规范的第8.8.9节详细解释了发生了什么:

如果类不包含构造函数声明,则隐式声明默认构造函数.顶级类,成员类或本地类的默认构造函数的形式如下:

默认构造函数具有与类相同的可访问性(第6.6节).

默认构造函数没有形式参数,除非在非私有内部成员类中,默认构造函数隐式声明一个形式参数,表示该类的直接封闭实例(§8.8.1,§15.9.2,§15.9.3) ).

默认构造函数没有throws子句.

如果声明的类是原始类Object,则默认构造函数具有空体.否则,默认构造函数只调用不带参数的超类构造函数.

你可以看到这里没有继承:所有它都是带有隐式声明的默认构造函数的"编译器魔术".规范还明确指出,只有当类根本没有构造函数时才添加默认构造函数,这意味着你的问题的答案是"否":一旦你给一个类一个构造函数,就可以访问它的默认构造函数超类失去了.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有