[英]Java constructors and super()
我已经看到了一些关于这个主题的问题,但他们都假设有继承的知识。 我书中的例子在继承章节之前,所以父类是java.long.Object。
1. 场景:我的类 FotoApparat 没有自定义构造函数或任何构造函数,我使用FotoApparat meinFotoApparat = new FotoApparat()
创建了一个 FotoApparat 实例
问题:由于我的类没有构造函数,也没有 super() 调用,我假设程序会检查父 Object 类是否有合适的构造函数,应该是 new Object(),对吗? 如果是,这是否仍被视为“隐式” super() 调用?
2. 场景:我创建了一个接受参数的自定义构造函数(通过使用 eclipse 源)。 在生成的构造函数中,一开始就添加了 super() 调用,我认为这是我一直在阅读的实际隐式调用。 我在javapoint上读到,当创建一个类的实例时,也会创建一个父类的实例,它被super()引用。
问题:我读到这个 super() 调用可以从构造函数中删除,但是如果它被删除并且我使用一个带有参数的构造函数,那么(没有 super())这个父对象是如何创建的?!
谢谢您的帮助 :-)
场景 1:如果您没有定义任何构造函数,则会为您创建一个默认的、无参数的构造函数。 这是使用new FotoApparat()
时调用的new FotoApparat()
。 这个默认构造函数然后调用Object
上的构造函数(参见场景 2。)
场景 2:如果您没有显式调用super()
,此调用仍是隐式完成的。 然而,父对象可能没有没有参数的构造函数,在这种情况下,您需要调用特定的构造函数。
由于我的类没有构造函数,也没有 space() 调用,我假设程序会检查父 Object 类是否有合适的构造函数
不完全的。 如果您没有定义构造函数,编译器会为您创建一个。 这个构造函数没有参数,它唯一做的就是调用超类构造函数super()
。
创建类的实例时,也会创建父类的实例
不完全是:只创建了一个实例。 没有单独的父类实例。
该语句并非完全错误,因为由于继承,创建的子类的一个实例也是父类的实例。
我读到这个 super() 调用可以从构造函数中删除,但是如果它被删除并且我使用一个带有参数的构造函数,那么(没有 super())这个父对象是如何创建的?!
在这种情况下,编译器插入对无参数超类构造函数super()
的调用。 但这不会创建一个单独的“父对象”——只创建一个对象。
您的研究可能没有弄清楚对象创建和初始化之间的区别。 调用构造函数不会“创建”对象。 对象是通过在内存中为其保留空间来创建的。 保留内存后,调用构造函数来“初始化”对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.