可能是一個非常noob問題無法理解的java
我是新來的Java和正在讀用Java編寫的第三方API的新關鍵字...
我碰到這個聲明
Foo foo = new FooBar().new Foo();
來到
我無法理解
FooBar().new
爲什麼這個聲明也是這樣嗎?
有什麼好處,可以申報類似上述的東西,以及這種申報的替代方案是什麼。
任何意見/引用將不勝感激。
感謝
可能是一個非常noob問題無法理解的java
我是新來的Java和正在讀用Java編寫的第三方API的新關鍵字...
我碰到這個聲明
Foo foo = new FooBar().new Foo();
來到
我無法理解
FooBar().new
爲什麼這個聲明也是這樣嗎?
有什麼好處,可以申報類似上述的東西,以及這種申報的替代方案是什麼。
任何意見/引用將不勝感激。
感謝
FooBar
包含這樣
class FooBar {
class Foo {
...
}
}
外部類的新實例的內部類需要實例化內部類。有些類自己沒有意義,所以實現爲嵌套類。這裏Foo
與FooBar
的關係,也具有訪問所有後者的成員變量的好處。
請參閱@Reimeus'關於您的第一個問題的答案。
關於你的第二個問題:
有什麼選擇這樣的聲明
提供的內部類可以獨立於外部類的建立,可以使內部類靜態的,如:
public class FooBar
{
// ...
public static class Foo
{
// ...
}
}
然後,您將實例化:
new Foobar.Foo()
一個經典用這種靜態內部類是類(配方從Effective Java提取 - 不要買這本書)一個生成器類。這是創建不變的情況下,以及對「流暢接口」一個很好的例子,一個很好的方式,因爲一般都建造方法返回Builder實例本身:
public class MyClass
{
public static Builder newBuilder()
{
return new Builder();
}
private MyClass(final Builder builder)
{
// build according to data in builder
}
public static class Builder
{
private Builder()
{
}
// methods to add data to builder, then:
public MyClass build()
{
return new MyClass(this);
}
}
}
你會注意到靜態工廠方法newBuilder()
;這允許你寫:
MyClass.newBuilder()
,而不是
new MyClass.Builder()
創建一個建設者。
這是一個[嵌套類](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)的東西。 – Santa