假设我有以下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.使用主要方法?
答案 0 :(得分:7)
你需要让((A)b).x
正确输入它
注意:您正尝试键入强制转换属性x
以键入A
。这是错误!
答案 1 :(得分:1)
int x
是private
因此无法从课程范围之外到达。您可以将其标记为protected
。这样它的范围仍然有限。扩展A的类将能够自由地访问变量。
答案 2 :(得分:1)
答案 3 :(得分:1)
当您编写(A)b.x
时,编译器会尝试将b.x
投射到A
,但x
是int
此外,您不需要将b
投射到A
,而无法访问b.x
,因为x
是私有字段。<登记/>
您可能需要一个getter,例如b.getX()
答案 4 :(得分:1)
你有以下问题
"Field not visible"
错误,因为您尝试访问父类的私有方法.
运算符优先于强制转换运算符答案 5 :(得分:0)
因为您试图将int
投射到A
。您需要围绕对象包裹演员表,然后调用.x
。
您的电话相当于(A)(b.x)
,应该是((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);
}
答案 6 :(得分:0)
基本上,这里存在两个问题。
一个是int x
是private
,因此无法从子类访问它。
现在即使您将int x
的访问条件更改为public
或protected
;代码仍然无效,因为(A)b.x
会尝试将一个整数(读x
)类型转换为对象(读A
)。而不是这个,你应该使用((A)b).x