【问题标题】:Access Static variable of Outer class from Static Inner class从静态内部类访问外部类的静态变量
【发布时间】:2019-02-10 13:41:46
【问题描述】:

我正在学习嵌套类。我只是想知道为什么我无法使用静态内部类的实例访问外部类的静态变量。

class MyListner {
    static String name = "StaticApple";
    String nonStaticName = "NonStaticApple";

    static class InnerMyListner {
        void display(){
            System.out.println("Static variable of outer class: " + name);
        }
    }

    private static final MyListner singleton = new MyListner();

    private MyListner() {

    };

    public static MyListner getInstance() {
        return singleton;
    }
}

public class Results{
    public static void main(String[] args) {
        MyListner.getInstance();

        MyListner.InnerMyListner innerclassO = new MyListner.InnerMyListner();
        innerclassO.display();  // This works
        String staticVariable = innerclassO.name;  // Why doesn't this work?
    }
}

【问题讨论】:

  • name 不是InnerMyListener 的属性,它是MyListener 的属性
  • 至少因为InnerMyListner没有名为name的字段
  • 你需要这个:String staticVariable = MyListner.name; // 为什么这不起作用?
  • @MTCoster,是的,名称不是 InnerMyListener 的属性,但静态嵌套类可以访问封闭类的静态成员。不是吗?那么如何使用 display() 方法访问...?
  • @CookingJava 看到我的回答。

标签: java static inner-classes


【解决方案1】:

您必须了解class(es) 在这里的工作原理。 InnerMyListner 类是一个静态的嵌套类。

与类方法和变量一样,静态嵌套类是 与其外部类相关联。

虽然静态嵌套类无法访问外部类的 instance 属性,但它可以访问可见范围内的 static 属性(由所有实例共享) .

在Results 内部,您超出了name 的可见范围。
如需更深入的概述,请参阅Java documentation

【讨论】:

  • 我正在为 InnerMyListner 类的使用调用静态变量。我可以使用内部类的方法来做到这一点,但为什么不能没有它们......你用文字说(与类方法和变量一样,静态嵌套类与其外部类相关联。)..但我问为什么它不可能?使用或不使用方法访问..不应该有任何区别......因为这里没有违反法律,即静态内部类只能访问外部类的静态成员......!
  • @CookingJava 只需查看“名称”属性访问的位置。一个在包含类“MyListner”(InnerMyListner#display)内,另一个完全在其上下文之外。想一想,就会明白为什么会发生这种情况。您可以使用“显示”方法,因为它的静态类方法对外部可见。
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多