[英]Using Final Fields in Anonymous Classes, Declaring Static Nested Class Inside a Method and Defining Static Members inside an Inner Class
我有三個問題。
1-如果非最終字段的值可以更改,那么如何在非匿名字段類中使用非最終字段?
class Foo{
private int i;
void bar(){
i = 10
Runnable runnable = new Runnable (){
public void run (){
System.out.println(i); //works fine
}//end method run
}//end Runnable
}//end method bar
}//end class Foo
2-為什么不能在方法內部聲明靜態嵌套類,因為內部類不能指定(本地類)的名稱?
Class Foo {
void bar(){
class LocalClass{ //static nested classes are NOT allowed here
//define members
}//end class LocalClass
}//end method bar
}//end class Foo
3-為什么內部類不能定義除靜態final字段以外的靜態成員?
class Foo {
class Bar{
static int x; //NOTallowed
static final int y; //allowed
static void doSomething(){} //NOT allowed
}//end class Bar
}//end class Foo
對於第三個問題,我知道內部類與外部類的實例相關聯,但這對我來說仍然沒有說服力。 我們可以使用諸如new Foo().Bar.doSomething();
如果允許使用靜態方法。
1-如果非最終字段的值可以更改,那么如何在非匿名字段類中使用非最終字段?
class Foo{
private int i;
void bar(){
i = 10;
Runnable runnable = new Runnable (){
public void run (){
System.out.println(i); //works fine
}//end method run
}//end Runnable
}//end method bar
}//end class Foo
讓我們中斷代碼等效於-
class Foo{
private int i;
ublic static void bar() {
i = 10;
Runnable r = new ARunnable();
r.run();
}
private static class ARunnable implements Runnable {
@Override public void run() {
System.out.println(i);
}
}
}
聲明的匿名Runnable類本質上是方法bar()
的嵌套類,該方法是函數bar()
局部類。 因此,匿名類可以訪問父類的字段。 但是,如果變量i
是函數bar()
局部變量,則我們不想允許任何其他函數訪問它。 對於方法bar()
的內部類函數,我們可以允許對其進行讀取但不能對其進行更改,否則它看起來會很奇怪並破壞了local的倫理 。
class Foo{
// private int i;
void bar(){
final int i = 10; // adding `final` as i is local to function bar
Runnable runnable = new Runnable (){
public void run (){
System.out.println(i);
}//end method run
}//end Runnable
}//end method bar
}/
2-為什么不能像內部類那樣在方法內部聲明靜態嵌套類?
正如Java規范所說:
緊接在塊中的局部類聲明的范圍(第14.2節)是緊緊包圍的塊的其余部分,包括它自己的類聲明。
如果我們在一個塊內聲明一個本地類,則它將在封閉的塊的上下文中運行。 沒有一個塊(方法)知道另一個塊(方法)的本地實例,因為在一個塊內聲明的任何內容對於該塊都是本地的。 因此,它所在的塊(方法)應該是唯一能夠實例化它的方法。 將其聲明為static
毫無意義。 對於class access修飾符private
, public
和protected
來說,情況也是如此。
3-為什么內部類不能定義除靜態final字段之外的靜態成員?
內部類是非靜態的。 嵌套的靜態類稱為嵌套類,而不是內部類。 它在封閉實例的上下文中運行。 不知何故,允許靜態變量和方法與這種動機相矛盾。 但是,有關此問題的答案的更多詳細說明,請參見此處和此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.