我遇到了像
这样的东西ArgProcessor argProcessor = runWebApp.new ArgProcessor(options);
此行来自GWT的来源。通过深入研究Java的语法,我发现它是(“。new”)内在创造者。
但是我没有找到任何关于为什么我们需要内部创作者的正确文档。
这与普通对象/实例创建者有何不同?
答案 0 :(得分:4)
用于创建内部类类型的对象。
例如:看看这个
http://www.javabeat.net/tips/124-inner-classes-in-java.html
即:
class Outer{
final int z=10;
class Inner extends HasStatic {
static final int x = 3;
static int y = 4;
}
public static void main(String[] args) {
Outer outer=new Outer();
System.out.println(outer.new Inner().y);
}
}
答案 1 :(得分:4)
此示例中的new
关键字在runWebApp
实例的范围内调用。这意味着runWebApp.class
包含一个名为ArgProcessor
的内部类。这是在ArgProcessor
中指定您构造runWebApp
并且不调用其他顶级ArgProcessor
类的适当方法。
请注意,外部赋值将具有ArgProcessor的实例,但它将是runWebApp
的{{1}}实例,而不是其他实例的ArgProcessor
实例。偶尔,这样做是为了模拟类之间的旧式C ++ ArgProcessor
接口;但是,还有其他原因可以解决这个问题。它基本上允许比实际编程语言可用的标准friend
,public
,protected
,default
接口更细粒度的方法。
答案 2 :(得分:0)
内部类是在另一个类中定义的类。如果它不是静态的,则内部类的每个实例都具有对外部类的实例的隐式引用。它可以在内部类中访问,如下所示:OuterClass.this
。
因此,当您从外部类InnerClass
的实例outerObject
的非静态方法实例化内部类OuterClass
时,创建的实例innerObject
具有隐式参考outerObject
。但是当你想从OuterClass
之外的某个地方(或从静态方法)做同样的事情时,你必须指定它将引用的OuterClass
实例:你通过调用{{1}来做到这一点在外部类的实例上。