我正在面对Java内部类,并且在外部变量可见性方面遇到了一些麻烦。
class A {
private int x = 5;
class B extends A{
public void fun(B b){
b.x = 10; //here
}
}
}
如果内部类和外部类之间没有可见性限制,为什么我不能做这样的事情(请参见“ here”标签)?我真的不理解这些规则。
答案 0 :(得分:2)
在您的示例中,成员变量x
不是类B的属性,因此b.x = 10
不会产生任何错误,因此该错误与可见性规则无关。尝试使用x = 10
效果很好,这是A.this.x = 10
或super.x = 10
的捷径。
答案 1 :(得分:1)
修饰符private
不能在子类中访问。
class A {
private int x = 5; // The issue is in `private` in this line
class B extends A{
public void fun(B b){
b.x = 10; //here
}
}
}
如果删除修饰符private
并将其更改为default
,public
或protected
,则可以访问该变量。
请通过link进行更好的理解。
更新:
删除扩展关键字(现在,类B将不再是子类,而只是内部类),并且变量x将仅使用 this 或 super 关键字。在link
中详细说明了用法答案 2 :(得分:0)
您需要了解这三个private
,protected
,default
,public
访问说明符
private
变量只能在本身的类中修改,不包括subclass
default
变量可以在同一程序包中进行修改。protected
变量可以在子类中以及在同一包及其自身中修改public
变量可以在任何地方进行修改。您可以在此link
上看到它
在旁边。如果使用此示例,则可以使用super
说明符来修改变量,以访问可见的对象
class A {
private int x = 5;
class B extends A{
public void fun(B b){
b.x = 10; //here error
super.x=1;//this is ok
}
}
}
这个b.x = 10; //here error
的问题是b是方法的参数,不是成员变量或超类变量。
答案 3 :(得分:0)
这很特别。内部类可以访问外部类的私有字段。这可以通过fun(A)
方法显示
class A {
private int x = 5;
class B extends A{
public void fun(A a){
a.x = 5; //Valid since we are in the same class (inner-class can access private field)
}
}
现在,如果您有一个B
参数,则有点不同,因为它将尝试使用继承而不是外部-内部链接:
public void fun(B b){
b.x = 10; //Access using inheritence, not OK for private field
((A)b).x = 10; //Casting into A to be able to access the private field (just like fun(A).
}
请注意,这是一个问题,因为您更新了参数中的引用接收,因此可以轻松地更新当前内部实例
public void fun(){
x = 10; //OK : access to A.x from inner class
super.x = 10; //OK : same
this.x = 10; // KO : trying to access a private variable from B scope
}