通过java中的静态方法访问私有变量

时间:2014-04-03 12:33:16

标签: java static-methods private-members

假设我有以下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.使用主要方法?

7 个答案:

答案 0 :(得分:7)

你需要让((A)b).x正确输入它

注意:您正尝试键入强制转换属性x以键入A。这是错误!

答案 1 :(得分:1)

int xprivate因此无法从课程范围之外到达。您可以将其标记为protected。这样它的范围仍然有限。扩展A的类将能够自由地访问变量。

答案 2 :(得分:1)

这是因为点运算符优先于强制运算符。这将起作用,因为它强制在点运算符之前应用强制转换运算符:

System.out.println(((A)b).x);

Demo on ideone.

答案 3 :(得分:1)

当您编写(A)b.x时,编译器会尝试将b.x投射到A,但xint

此外,您不需要将b投射到A,而无法访问b.x,因为x是私有字段。<登记/> 您可能需要一个getter,例如b.getX()

答案 4 :(得分:1)

你有以下问题

  • 编译器将显示"Field not visible"错误,因为您尝试访问父类的私有方法
  • 语法.运算符优先于强制转换运算符
  • 另一个无能为力的事情是不需要将子对象强制转换为父来访问父特定成员,因为它们已经被继承到子代,所以您访问的成员是{{1这不是继承的。即使您转换为父级,也无法使用子对象访问私有成员。

答案 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 xprivate,因此无法从子类访问它。

现在即使您将int x的访问条件更改为publicprotected;代码仍然无效,因为(A)b.x会尝试将一个整数(读x)类型转换为对象(读A)。而不是这个,你应该使用((A)b).x