静态嵌套类可以访问封闭类的哪些成员?

时间:2019-05-23 01:16:48

标签: java inner-classes

  1. Java完整参考说

      

    静态嵌套类是已应用static修饰符的类。因为它是静态的,所以它必须访问非静态的   通过对象获取其封闭类的成员。也就是说,它   不能引用其封闭类的非静态成员   直接。由于此限制,静态嵌套类是   很少使用。

    “通过对象”和“不能直接……”是什么意思?

  2. Java简而言之

      

    •静态成员类型可以访问(仅)包含它的类的静态成员

         

    •静态成员类型可以访问其所有静态成员(包括任何其他静态成员类型)   包含类型。

    两个句子是否彼此多余?这两个句子有什么区别?

  3. 这两本书的引文是否互相矛盾?首先 引用说静态嵌套类可以访问非静态成员 封闭类,而第二个引号表示静态成员类型 只能访问封闭类的静态成员。

谢谢。

4 个答案:

答案 0 :(得分:1)

在Java中,嵌套的非静态类具有对父类实例的隐藏引用。这就是为什么他们可以访问所有非静态成员的原因。嵌套类没有这样的实例。但是,如果父类通过 this

,它的作用域允许它访问父成员。

因此第二引号表示访问不会自动进行。将引用传递给封闭类,嵌套的静态类可以访问它。否则,它不知道封闭类的地址。

答案 1 :(得分:1)

在没有首先使用包含类的对象限定实例字段的情况下,任何静态方法都不能直接访问实例字段。

class Foo {
   int myField;

   public void main(String[] args) {
       Foo foo = new Foo();
       access(foo);
   }
   public static void access(Foo obj) {
      System.out.println(myField); // <-- error, can't access myField from static 
                                   //context.
      System.out.println(obj.myField); // OK here  
   }
}

通过内部静态类访问实例字段也是如此。

答案 2 :(得分:0)

java静态嵌套类可以访问嵌套类的静态成员和父类的静态成员。当您了解一个类和对象在内存中的位置时,这才有意义-只有一个类但有多个对象,并且您需要确定一个对象的每个实例绝对需要什么,什么实际上是多余的并可以保留在该类中(不需要重复),因此所有方法(静态和非静态)以及所有静态成员

答案 3 :(得分:0)

静态嵌套类可以访问封闭类的哪些成员?

通过为Java关键字 static 分配以下含义,可以使该问题的答案更加清晰:

Java中的“静态”表示不考虑任何类的任何实例或与之关联的任何

  • 静态字段属于声明它的类,并且未被该类的任何实例封装。随后构造的类的任何实例(或作用域中任何类的任何实例或任何方法)都可以访问静态字段(这就是为什么静态字段在并发环境中可能很危险的原因)。

  • 为声明该类的类定义了静态方法,并且该类没有关联的实例。静态方法不知道任何类实例,并且除非有实例引用作为参数传递给它,否则无法访问它们。

  • 静态成员类在所有方面都与为封装方便而打包在封闭类中的普通顶级类相同。就像顶级类一样,其实例对封闭类的任何实例一无所知(除非在构造过程中将对封闭类实例的引用传递给它们)。

  • 一个静态初始化程序块用于初始化一个类的静态字段,但它对该类的任何实例一无所知。因此,它们无法初始化实例字段,因为它们无法访问它们。

因此,答案变得直观:静态嵌套类可以访问封闭类的所有成员,而无需该类的实例即可访问该成员。

如果将封闭的类实例传递给静态嵌套类的构造函数,则该实例的成员(包括私有实例)将在范围内。从逻辑上讲,将封闭的类实例传递给静态的嵌套类构造函数与使用嵌套成员类非常相似。区别在于,对于前者,关联是显式的依赖注入;而对于后者,实例之间的关联是隐式的。