java私有instance_java – Instance Initializer与私有成员
这条线
b = new Test5(){{ value = 1 ;}};
创建一个扩展Test5的匿名类的实例.但是,由于值是私有的,因此匿名类无法访问其超类的实例变量.
由于Test5的匿名子类没有可见的变量值,编译器会在下一个范围内查找替代方法.在这种情况下,下一个范围属于静态main方法.编译器发现Test5的实例变量,并发出警告,因为无法从静态上下文引用实例变量.
你有两个选择:
>使实例变量可供匿名类访问:
受保护的int值;
>或使静态main方法可以访问变量:
private static int value;
我从你的问题中得出结论,第一个选择是你真正想做的事情.
@Tom:问题不在于首先搜索静态范围.如果是这种情况,则替代(1)将不起作用,因为仍然首先找到实例变量值,但仍然无法引用.
@Ken:你的instanceMethod()不能做,你期望它做什么!看看下面的代码:
class Test5A {
private int value;
public void instanceMethod() {
Test5A a = new Test5A() {{ value = 1; }}; // (A)
System.out.println(this.value);
System.out.println(a.value);
}
public static void main(String[] args) {
new Test5A().instanceMethod();
}
}
此示例代码模仿您的类的行为.如果编译并执行它,您将看到输出为“1 0”.
虽然(A)中的匿名子类的实例初始化程序看起来像是将一个赋值给它自己的值实例变量,但该变量实际上只能在匿名类的超类中可见.相反,在第(A)行,唯一一个名为value的可见变量是Test5A实例的实例变量,在该实例上调用instanceMethod().因此,它变为一个.
现在让我们提高价值的可见度:
class Test5B {
protected int value;
public void instanceMethod() {
Test5B a = new Test5B() {{ value = 1; }};
System.out.println(this.value);
System.out.println(a.value);
}
public static void main(String[] args) {
new Test5B().instanceMethod();
}
}
这次输出为“0 1”.实例变量值由匿名子类继承,并且对于其实例初始化程序是可见的.因此,将一个分配给正确的实例变量.
创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖总结
以上是生活随笔为你收集整理的java私有instance_java – Instance Initializer与私有成员的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: days matter怎么换背景图(Ma
- 下一篇: java xwork_java-与休眠的