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