一些關於Java的句子
Java有四個級別的訪問類型。
從另一方面來說,如果在介面中,你不指定方法的訪問修飾符,那麼它將是public類型的。你也可以顯式地指定它為public類型, 但這並不符合SONAR(一個開源代碼質量管理平台,譯者注)的代碼質量管理思想。
訪問類型是傳遞的
我的「在Java中允許選擇性的在介面的方法中寫public」的觀點是一個技術錯誤。
同樣你也可在介面的欄位前寫final,甚至是static。這說明這些欄位可以是非靜態或非final嗎?不是的,介面中的欄位中總是final和static的。
Protected和package private是不一樣的
Package private(或者default)訪問類型可以使得相同包(package)下其他類能夠訪問這些欄位或方法。保護類型(protected)的方法和欄位可以被相同包下的類使用(這和package private是一樣的),同時它也可以被其他類使用,只要那個類繼承了這個包含這些protected方法或欄位的類。
Protected是可傳遞的
如果有三個包a、b、c,每個包都分別包含A、B、C類,而且B繼承A,C繼承B,那麼C可以訪問A中的protected欄位和方法。
package a;
public class A {
protected void a() {
}
}
package b;
import a.A;
public class B extends A {
protected void b() {
a();
}
}
package c;
import b.B;
public class C extends B {
protected void c() {
a();
}
}
介面不能定義protected方法
很多人認為可以在介面中定義protected方法。如果你這麼做的話,編譯器很快就會毫不留情地給你報錯。順便說下,這也就是我為什麼認為允許public關鍵字在介面中是一個技術錯誤,它會讓人覺得還可以寫其他訪問類型似的。
private是一種新的public
如果你還想在一個介面的方法中聲明protected方法,你可能還不理解封裝的含義。
此private非彼private
私有變數和方法在編譯單元內是可見的。如果這聽起來太神秘的話,換種說法:幾乎就是在同一個Java文件中。這比「在它們被定義的類中」聽起來好理解些。它們在同一編譯單元的類和介面中也是可見的。嵌套類可以看到類中封裝的私有欄位和方法。然而,當前封閉類也可以看到該類下任何深度下類中的私有方法和欄位。
package a;
class Private {
private class PrivateInPrivate {
private Object object;
}
Object m() {
return new PrivateInPrivate().object;
}
}
後者並不廣為人知,事實上也很少有用到。
Private是類的訪問級別而不是對象
如果你可以訪問一個變數或方法,那麼不管它屬於哪個對象你都可以訪問它。如果this.a可以訪問到,那another.a也可以訪問到,只要它們是同一個類的實例。同一個類的實例對象可以隨意調用其他實例的變數或方法。不過這樣的代碼一般都沒有意義。現實生活中異常是equals()(由Eclipse生成, 15 - 18行):
package a;
public class PrivateIsClass {
private Object object;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PrivateIsClass other = (PrivateIsClass) obj;
if (object == null) {
if (other.object != null)
return false;
} else if (!object.equals(other.object))
return false;
return true;
}
}
靜態(static)類可能有很多實例
訪問類型不是對象級別的而是類級別的。
那些不支持有任何實例的類,通常被稱為實用工具類。它們只包含靜態欄位和靜態方法以及唯一的不被該類的任何靜態方法調用的私有構造函數。在Java 8中也可以有這樣的一個野獸(這個詞翻譯不通,譯者注)在介面中實現,因為Java 8的介面可以有靜態方法。我不覺得我們應該使用這個特性而不是實用工具類。我也不完全確信我們應該使用實用工具類。
靜態類總是在另一個類或介面中。它們是嵌套類。他們是靜態的,就像靜態方法不能訪問類的實例方法和欄位一樣,靜態內部類也不能訪問嵌入類的實例方法和欄位。這是因為內部類沒有嵌入類實例的引用(或者說是指針,如果你喜歡這麼叫的話)。內部類(內部類,也即非靜態嵌套類, 譯者注),而非靜態嵌套類, 沒有嵌入類的一個實例,它是無法被創建的。每個內部類的實例都具有嵌入類實例的一個引用,因此一個內部類可以訪問嵌入類的實例方法和欄位。
因為這個原因,要是沒有外部類的一個實例,你就不能創建一個內部類。當然,如果是當前對象,也就是this的話,你就可以不需要指定它。在這種情況下你可以使用new, 在這種情況下,也就是this.new的簡式。在一個靜態的環境中,例如從一個靜態方法,你必須指定內部類應該創建哪個封閉類的實例。見第10行:
package a;
class Nesting {
static class Nested {}
class Inner {}
void method(){
Inner inner = new Inner();
}
static void staticMethod(){
Inner inner = new Nesting().new Inner();
}
}
匿名類只能訪問final變數
變數必須是有效的final
當一個匿名類被定義在一個方法中,它可以訪問局部變數如果該變數是final的。但這說的有點模糊。它們不得不聲明成final,他們還必須是有效final。這也是Java 8中發布的一些特性。你不需要聲明這些變數為final型,但它們仍然必須是有效的final。
Java 8並不要求final,只要求有效final。
為什麼你需要對一些東西聲明final,當它被檢查必須是這樣的。就像方法的參數。它們也必須是final的。你說這不是Java所必須的嗎?嗯,你是對的。這只是一個良好的編程風格所必須的。
via: http://www.javacodegeeks.com/2014/11/some-sentences-about-java.html
作者:Peter Verhas 譯者:a598799539 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive