繁体   English   中英

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

[英]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 xprivate因此无法从类的范围之外到达它。 您可以将其标记为protected 这样它的范围仍然有限。 扩展A的类将能够自由地访问变量。

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

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

在ideone上演示。

当您编写(A)bx ,编译器会尝试将bx转换为A ,但xint

此外,您不需要将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 xprivate因此无法从子类访问它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM