【问题标题】:Nested class(static inner) lifetime/scope嵌套类(静态内部)生命周期/范围
【发布时间】:2013-01-23 07:19:31
【问题描述】:

我声明了一个静态内部类,我在外部类的方法中创建了一个新实例。但是,我得到的结果表明每次在我的方法中都使用相同的内部类实例。 下面的例子,

public class Outer{

   public method m(){
      Inner n = new Inner();  //Creating local instance of Nested class
      n.something();
   }

   public static class Inner{
       Map<K,V> cache = new Map<K,V>();

       void something(){
          //use and update cache;
       }
   }
}

public Test{
   public static void main(String a[]){
     Outer o = new Outer();
      o.m();
      o.m();  //cache was still available
   }
}

有人可以帮忙解释为什么没有创建两个 Inner 类的实例吗?
另外,如果我从内部类中删除static,这种行为是否会改变?

【问题讨论】:

  • 它确实在您的情况下创建了两个实例。我认为您确定没有两个实例的方式有问题。由于我们没有完整的代码,我还不能对此发表评论。
  • 向内部类添加“静态”意味着您可以在外部类之外实例化它。你能详细说明你得到什么结果“建议在我的方法中每次都使用同一个 Inner 类的实例”?
  • 引用的代码包含语法错误,因此它必须与编译的任何内容有很大不同。请发布重现您遇到的问题的代码。
  • 我的错,实际上是我的实际代码中 cache 之前的静态关键字“持久化”了它。上面编写的代码是对我的实际代码的额外简化。感谢所有的帮助。

标签: java nested-class


【解决方案1】:

static inner 每个外部封闭类实例只能实例化一次。由于您只有一个Outer o = new Outer(); 外部实例o.m(); 将调用内部类的相同实例。 像这样创建两个实例

Outer o = new Outer();
o.m();
Outer o1 = new Outer();
o1.m();  // will create new instance of inner

关于static关键字

嵌套类可以是:静态和非静态。声明为静态的嵌套类是静态嵌套类。非静态嵌套类称为内部类。

静态嵌套类没有对嵌套实例的引用,因此静态嵌套类无法访问其嵌套类的实例的非静态方法。

【讨论】:

  • “静态内部类每个外部封闭类实例只能实例化一次”。这个不对。如果这是真的,how does the nested class Entry works?
  • 已确认。静态内部类的行为类似于任何“外部”类。它可能包含方法和字段,并且可能像这样实例化: Outer.Inner object = new Outer.Inner ();谢谢指正
猜你喜欢
  • 2015-05-06
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多