在Java中通过静态方法访问私有变量

3
假设我有以下Java类:
Class 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);
    }
}

Class 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的类中使用x时会出错?

可能是由以下原因引起的:
1. 多态性的使用?
2. 静态方法的使用?
3. main方法的使用?


3
由于正确答案已在下方列出,我强烈建议使用getter和setter方法。 - Gorbles
不需要将B强制转换为A,即使你强制转换也无法访问私有成员。 - mahesh
7个回答

7

您需要将其类型转换为((A)b).x才能正确进行强制转换。

注意:您正在尝试将属性x强制转换为类型A。这是错误的!


1

int xprivate的,因此它无法从类的作用域之外进行访问。您可以将其标记为protected。这样,它仍然具有受限制的作用域。扩展A的类将能够自由地访问该变量。


1
当你写下 (A)b.x 时,编译器会尝试将 b.x 转换为 A,但是 x 是一个 int
此外,你不需要将 b 强制转换为 A,也无法访问 b.x,因为 x 是一个私有字段。你可能需要一个 getter 方法,例如 b.getX()

1
您有以下问题:
  • 编译器会显示"Field not visible"错误,因为您试图访问父类的私有方法
  • 在语法上,.运算符比强制转换运算符具有优先级
  • 另一个重要的事情是不需要将子对象强制转换为父对象以访问特定于父级的成员,因为它们已经继承到子对象中。在这里,您正在访问的成员是private,这不是继承的。即使您将其转换为父级,也无法使用子对象访问私有成员。

1
这是因为点运算符比强制类型转换运算符的优先级高。这将起作用,因为它强制在点运算符之前应用强制类型转换运算符:
System.out.println(((A)b).x);

在ideone上的演示。


0

基本上,这里存在两个问题。

其中一个是int xprivate的,因此无法从子类访问。

即使您将int x的访问条件更改为publicprotected,该代码仍将不起作用,因为(A)b.x将尝试将整数(读取x)强制转换为对象(读取A)。 您应该使用((A)b).x,而不是这个。


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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接