Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:创建本地内部类的实例_Java_Scope_Inner Classes - Fatal编程技术网

Java:创建本地内部类的实例

Java:创建本地内部类的实例,java,scope,inner-classes,Java,Scope,Inner Classes,下面是一些演示我的问题的玩具代码。第一个是可编译的版本,第二个是不可编译的版本 在示例1中,为了创建InnerClass的实例,我必须在InnerClass的类定义下面创建实例。这是有意义的,因为在类定义之上,InnerClass是不可见的。但是,为了整洁起见,我想在foo()的顶部创建并使用InnerClass的实例。是否有一种方法可以在实际的类定义之前动态地定义InnerClass,这样我的代码看起来更像示例2,但将是合法的Java 例1 例2 您可以在方法之外定义内部类,如 public

下面是一些演示我的问题的玩具代码。第一个是可编译的版本,第二个是不可编译的版本

在示例1中,为了创建InnerClass的实例,我必须在InnerClass的类定义下面创建实例。这是有意义的,因为在类定义之上,InnerClass是不可见的。但是,为了整洁起见,我想在foo()的顶部创建并使用InnerClass的实例。是否有一种方法可以在实际的类定义之前动态地定义InnerClass,这样我的代码看起来更像示例2,但将是合法的Java

例1

例2


您可以在方法之外定义内部类,如

public class OuterClass {
    public void foo() {

        InnerClass in = new InnerClass(); // Defined above, does not compile!


    }

    class InnerClass {  
        public InnerClass() {
            // do nothing.
        }
    }
}

您可以在方法之外定义内部类,如

public class OuterClass {
    public void foo() {

        InnerClass in = new InnerClass(); // Defined above, does not compile!


    }

    class InnerClass {  
        public InnerClass() {
            // do nothing.
        }
    }
}

从概念上讲,局部类声明是一个语句。在执行该语句之前,该类不存在。该类在其声明的作用域结束时也会消失。通常,本地类可能引用其他本地作用域名称,因此执行顺序很重要

void f()
{
  if(true) 
      throw new Error();

  class InnerClass
  { 
    ... 
  }
}
在本例中,
InnerClass
声明语句永远不会到达,因此该类将永远不存在。事先参考它是没有意义的


在使用前声明一些东西总是一个好主意。在Java中,类可以具有循环依赖关系,因此Java必须允许突然引用类,但如果可以避免,就不要这样做。

从概念上讲,本地类声明是一种语句。在执行该语句之前,该类不存在。该类在其声明的作用域结束时也会消失。通常,本地类可能引用其他本地作用域名称,因此执行顺序很重要

void f()
{
  if(true) 
      throw new Error();

  class InnerClass
  { 
    ... 
  }
}
在本例中,
InnerClass
声明语句永远不会到达,因此该类将永远不存在。事先参考它是没有意义的


在使用前声明一些东西总是一个好主意。在Java中,类可以具有循环依赖关系,因此Java必须允许突然引用类——但如果可以避免的话,就不要这样做。

听起来像是为了整洁而做了很多工作。下面是一个使用匿名内部类的技巧,它允许您声明一个类的实例,该类具有您尚未定义的功能,这与您想要的类似

注意,限制是您必须在更早的地方定义接口,或者重用现有接口,如Runnable。以下是一个例子:

public class OuterClass {
    public void foo() {
        // Declaration
        Runnable anonymous;

        // Implementation
        anonymous = new Runnable() {
            public void run() {
                // do nothing.
            }
        };

        // Execution
        anonymous.run();
    }
}

听起来像是为了整洁而做了很多工作。下面是一个使用匿名内部类的技巧,它允许您声明一个类的实例,该类具有您尚未定义的功能,这与您想要的类似

注意,限制是您必须在更早的地方定义接口,或者重用现有接口,如Runnable。以下是一个例子:

public class OuterClass {
    public void foo() {
        // Declaration
        Runnable anonymous;

        // Implementation
        anonymous = new Runnable() {
            public void run() {
                // do nothing.
            }
        };

        // Execution
        anonymous.run();
    }
}

java版本“1.5.0_26”java(TM)2运行时环境,标准版在使用类之前定义类有什么问题?我看不出第二个例子有什么优势,即使它有效。第二个例子没有什么主要优势。我正在尝试学习Java的细节,我只是好奇。Java版本“1.5.0_26”Java(TM)2运行时环境,标准版在使用之前定义类有什么问题?我看不出第二个例子有什么优势,即使它有效。第二个例子没有什么主要优势。我试图了解Java的来龙去脉,我只是好奇,这并不能回答我的问题。我希望该类是本地内部类。如果你把它移到方法之外,它就不再是本地的了。@Charlotte:在类声明之前,根本没有办法创建一个本地的内部类实例。你唯一的选择是你的第一个例子或者Rob的答案(我当然更喜欢,因为代码最终会更整洁)。这并不能回答我的问题。我希望该类是本地内部类。如果你把它移到方法之外,它就不再是本地的了。@Charlotte:在类声明之前,根本没有办法创建一个本地的内部类实例。您唯一的选择是您的第一个示例或Rob的答案(我当然更喜欢,因为代码最终会更整洁)。