2017-01-19 128 views
2

我會通過下面的代碼,同時學習Java的本地類定義的本地類中使用的這種超: -在靜態情況下

class A { 
    protected int one; 
} 

class Outer { 

    static void staticMethod(){    
     class InnerLocal extends A { 
      double first = this.one; 
      double second = super.one;  
     } 
    } 

} 

我的疑問是,當我們宣佈本地類內靜方法或靜態初始化塊,然後它們隱式地作爲靜態成員類工作,因爲它們不需要外部類來實例化它們。然而,我知道靜態成員類和靜態局部類(即靜態塊中定義的內部類)之間的明顯區別,問題是Java不允許在靜態上下文中使用對象引用「this」和「super」但上面的代碼完美編譯。

任何人都可以請給我提供Java編譯器不會在上述情況下在靜態上下文中使用'this'和'super'的抱怨的原因嗎?謝謝!:)

+1

因爲你正在定義這個本地類的實例變量。所以'this'將成爲你正在構建的'InnerLocal'的實例。將這兩個設置爲「靜態」來解決您期望的問題。 – AxelH

+2

示例代碼中沒有靜態上下文。 'this'指的是'InnerLocal'的實例,'super'指的是'InnerLocal'實例的'A'部分。 –

回答

2

我的疑問是,當我們宣佈內部靜態方法或靜態初始化塊的本地類,然後他們含蓄,因爲它們不需要外部類實例化他們

這其中的根本原因的工作靜態成員類的混亂。僅僅因爲方法是static並不意味着該方法中聲明的任何內容也是static。如果您在static方法內聲明變量(例如int a),則它被稱爲局部變量。如果說a是一個局部變量的方法是沒有意義的。同樣,如果說InnerLocal是一種本地static類的方法是沒有意義的。 (有沒有這樣的事情中的Java static局部變量)因此

InnerLocal是從A延伸並從A繼承a成員變量,並能夠要麼通過this或通過super訪問它常規類。這也有助於瞭解final是唯一可以在Java中的方法中使用的非訪問修飾符。

+0

感謝@CKing現在更清楚了,只是另一個好處告訴我是否正確理解了它:在上面的程序中,類InnerClass是一個靜態的內部類,但它只有一個特性或屬性使它看起來類似於靜態類的是,它不需要Outer類實例來實例化自己,其餘的實例可以像普通類一樣工作,它可以像任何普通類一樣使用'this'和'super'。如果我錯了某處,請糾正我,如果我仍然缺少任何方面,請指導我。謝謝! –

+0

@ prateek.1729'InnerLocal'是一個局部內部類的方法,而不是'static'類(正如答案中已經解釋的那樣)。不知道你爲什麼還在說它是一個靜態類。你能詳細說明嗎?另外,如果你從'staticMethod()'中移除了'static'關鍵字,這樣這個方法就不再是一個'static'方法,你仍然可以在方法中實例化'InnerLocal'而不需要'Outer'實例。 – CKing

+0

我只是使用「靜態」一詞來區分靜態上下文中的內部類與本地(非靜態)方法中的類;靜態內部類和非靜態內部類。但是,我清除了我的概念,進一步搜索主題!再次感謝。:) –

1

Java不允許在靜態上下文中使用對象引用thissuper,但上面的代碼完美地編譯。

static如「靜態類」是一樣static在「靜態背景」。

所有實例方法和構造函數都可以訪問thissuper。由於構造函數可以訪問thissuper,所以實例字段的初始值設定項也可以訪問thissuper。靜態內部類沒有外部實例,但它有自己的實例。這就是this所指的。

相反,靜態方法必須thissuper無訪問,而不管在其被定義這些靜態方法的類的(頂層,靜態內部的,非靜態內部,匿名等)

+0

雖然在這種情況下你不能參考的是'Outer.this'。這確實不會編譯。 – biziclop

+0

你能否詳細說明你的意思:**靜態,因爲「靜態類」與靜態上下文中的靜態不一樣** –

+0

@ prateek.1729我只想說Java使用關鍵字'靜態「意味着當你聲明一個類與聲明一個方法時兩個完全不同的東西。 – dasblinkenlight

相關問題