![](/img/trans.png)
[英]Accessing private fields of an instance created through a static method with a setter method in Java gone wrong - what can be done?
[英]Accessing a private variable through static method in java
假设我有以下java类:
A类:
public class A {
private int x;
public A(int x){
this.x = x;
}
public static void main(String[] args) {
A a = new A(1);
B b = new B(1,2);
System.out.println((A)b.x);
}
}
B级:
public class B extends A {
public int y;
public B(int x, int y){
super(x);
this.y = y;
}
}
为什么编译器会在此行上标记对x的访问
System.out.println((A)b.x);
作为一个错误,即使我试图从定义它的类访问x?
是因为:
1.使用多态?
2.使用静态方法?
3.使用主要方法?
你需要做((A)b).x
来正确输入它
注意:您正在尝试将属性x
类型转换为类型A
那是错误!
int x
是private
因此无法从类的范围之外到达它。 您可以将其标记为protected
。 这样它的范围仍然有限。 扩展A的类将能够自由地访问变量。
当您编写(A)bx
,编译器会尝试将bx
转换为A
,但x
是int
此外,您不需要将b
转换为A
并且您无法访问bx
因为x
是私有字段。
你可能需要一个getter,比如b.getX()
你有以下问题
"Field not visible"
错误,因为您尝试访问父类的私有方法 .
运算符优先于强制运算符 private
,不会被继承。 即使您转换为父级,也无法使用子对象访问私有成员。 因为你试图将一个int
转换为A
你需要围绕对象包裹演员然后调用.x
。
你的电话相当于(A)(bx)
,应该是((A)b).x
。
public static void main(String[] args) {
A a = new A(1);
B b = new B(1,2);
System.out.println(((A)b).x);
}
基本上,这里存在两个问题。
一个是int x
是private
因此无法从子类访问它。
现在即使您将int x
的访问标准更改为public
或protected
; 代码仍然无效,因为(A)bx
将尝试将一个整数(读取x
)类型转换为对象(读取A
)。 而不是这个,你应该使用((A)b).x
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.