Koe*_*box 36 java constructor initialization
有谁知道为什么你可以static使用this()或super()但不是非静态方法引用构造函数的第一行中的方法?
考虑以下工作:
public class TestWorking{
private A a = null;
public TestWorking(A aParam){
this.a = aParam;
}
public TestWorking(B bParam)
{
this(TestWorking.getAFromB(bParam));
}
//It works because its marked static.
private static A getAFromB(B param){
A a = new A();
a.setName(param.getName());
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
以下非工作示例:
public class TestNotWorking{
private A a = null;
public TestNotWorking(A aParam){
this.a = aParam;
}
public TestNotWorking(B bParam)
{
this(this.getAFromB(bParam));
}
//This does not work. WHY???
private A getAFromB(B param){
A a = new A();
a.setName(param.getName());
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
amo*_*fis 18
非静态方法是实例方法.这只能在现有实例中访问,并且当您在构造函数中时,实例仍然不存在(它仍在构建中).
为什么会这样?因为实例方法可以访问实例(非静态)字段,这些字段在不同的实例中可以具有不同的值,因此在现有的完成实例上调用此类方法没有意义.
Mar*_*arc 12
请参阅Java语言规范8.8.7.1.这说明了这一点
构造函数体中的显式构造函数调用语句可能不引用此类或任何超类中声明的任何实例变量或实例方法或内部类,或者使用
this或super在任何表达式中; 否则,发生编译时错误.
这是因为在创建实例之前无法调用实例方法.顺便说一句,以后可以在构造函数中调用实例方法(尽管不是解决方案).
| 归档时间: |
|
| 查看次数: |
19967 次 |
| 最近记录: |