为什么不能this()
和super()
这两个一起在构造函数中使用?
合并这样的东西的原因是什么?
this(...)
将在同一类中调用另一个构造函数,而super()
将调用超级构造函数。如果super()
构造函数中没有,则编译器将隐式添加一个。
因此,如果两者都允许,您最终可能会super
两次调用构造函数。
示例(不要在参数中寻找含义):
class A {
public A() {
this( false );
}
public A(boolean someFlag) {
}
}
class B extends A {
public B() {
super();
}
public B( boolean someFlag ) {
super( someFlag );
}
public B ( int someNumber ) {
this(); //
}
}
现在,如果调用new B(5)
,将调用以下构造函数:
this( false);
A() ---------------> A(false)
^
|
| super();
|
| this();
B() <--------------- B(5) <--- you start here
更新 :
如果您能够使用this()
并且super()
可能会得到如下结果:
( 注意 :这是为了说明 如果允许您这样做, 可能会出什么问题-幸运的是 , 这不是 要发生的事情 )
this( false);
A() ---------------> A(false)
^ ^
| |
| super(); | super( true ); <--- Problem: should the parameter be true or false?
| |
| this(); |
B() <--------------- B(5) <--- you start here
如您所见,您会遇到一个问题,即A(boolean)
可以使用不同的参数来调用构造函数,而现在您必须以某种方式决定应使用哪种构造函数。另外,其他构造函数(A()
和B()
)可能包含现在可能无法正确调用的代码(即乱序等),因为对的调用super( true )
会绕开它们,而this()
不会。
问题内容: 在C ++中,从构造函数内部调用虚拟函数时,它的行为不像虚拟函数。 我认为第一次遇到这种行为的每个人都会感到惊讶,但第二次认为这是有道理的: 只要派生的构造函数没有被执行的对象是 不是 又一个 衍生 实例。 那么如何调用派生函数呢?前提条件还没有建立的机会。例: Java和.NET完全相同,但是他们选择了另一种方式,这可能是 产生最少惊讶原则 的唯一原因吗? 您认为哪个是正确的选择?
我们不能使构造函数,但可以在构造函数内部编写。在什么情况下会有这样的要求?我很开心。
问题内容: 我是Java编程语言的初学者,最近我研究了 构造函数 不能在Java中继承,有人可以解释 为什么 吗? 问题答案: 简而言之,构造函数不能被继承,因为在子类中它具有不同的名称(子类的名称)。 您只能执行以下操作: 相反,方法是使用“相同名称”继承的,可以使用。 理由如下:继承构造函数没有多大意义,因为类A的构造函数意味着创建类型A的对象,而类B的构造函数意味着创建类B的对象。 不过
允许您执行以下操作: 但不是这个: 可能是因为返回类型不是函数签名的一部分。但是是一个类类型,它被赋予一个返回类型,并且知道构造它的函数对象的返回类型。所以这里可能有编译器错误。 为什么没有编译器错误?
问题内容: 我一直在寻找为什么不应该在类的构造函数中调用线程的start方法的理由。考虑以下代码: ImportantData是一些通用的东西(可能很重要),而MyOperationThread是知道如何处理SomeClass实例的线程的子类。 脚节点: 我完全理解为什么这是不安全的。如果MyOperationThread在以下语句完成(并且数据已初始化)之前尝试访问SomeClass.data,
我在做一个非常简单的两个按钮状态。如果我点击abutton,A组件显示,如果点击bButk,那么B组件。我正在映射通过数组的项目,以便每个项目都有自己的按钮状态。假设我点击项目1的按钮B,那么我只想要第一个项目B显示。现在所有这些都会同时被触发。我已经在构造函数中限制了它们,但我仍然无法只获得一次点击触发并显示相关组件。