1. 程式人生 > >一些關於Java的句子

一些關於Java的句子

一些關於Java的句子

本文並沒有什麼新鮮的。我只是收集了一些不太重要的語句,但這些語句可能對初級程式設計師來說很重要。也就是些無聊的舊東西。

如果以下的這些你都知道的話,那麼你比Java的瞭解已經超過了對一個平常的家庭主婦的瞭解。我不知道清楚所有的這些是否是有意義的。即使不知道其中的一些特性,你照樣也可以成為一個相當不錯的Java程式設計師。然而,本文中許多的新資訊可能表明你還有很大的發展空間。

Java中有四種不同的訪問型別(而不是三種)

這四種類型包括:private, package private (包訪問許可權,無修飾符,又叫default, 譯者注)。如果你在類中定義一個元素時並不加任何訪問型別修飾符,它將被預設設定為包訪問許可權(package private),而不是public或者protected。

一些關於Java的句子

Java有四個級別的訪問型別。

從另一方面來說,如果在介面中,你不指定方法的訪問修飾符,那麼它將是public型別的。你也可以顯式地指定它為public型別, 但這並不符合SONAR(一個開原始碼質量管理平臺,譯者注)的程式碼質量管理思想。

訪問型別是傳遞的

我的“在Java中允許選擇性的在介面的方法中寫public”的觀點是一個技術錯誤。
同樣你也可在介面的欄位前寫final,甚至是static。這說明這些欄位可以是非靜態或非final嗎?不是的,介面中的欄位中總是final和static的。

Protected和package private是不一樣的

Package private(或者default)訪問型別可以使得相同包(package)下其他類能夠訪問這些欄位或方法。保護型別(protected)的方法和欄位可以被相同包下的類使用(這和package private是一樣的),同時它也可以被其他類使用,只要那個類繼承了這個包含這些protected方法或欄位的類。

一些關於Java的句子

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();
一些關於Java的句子

介面不能定義protected方法
很多人認為可以在介面中定義protected方法。如果你這麼做的話,編譯器很快就會毫不留情地給你報錯。順便說下,這也就是我為什麼認為允許public關鍵字在介面中是一個技術錯誤,它會讓人覺得還可以寫其他訪問型別似的。

private是一種新的public

如果你還想在一個介面的方法中宣告protected方法,你可能還不理解封裝的含義。

此private非彼private

私有變數和方法在編譯單元內是可見的。如果這聽起來太神祕的話,換種說法:幾乎就是在同一個Java檔案中。這比“在它們被定義的類中”聽起來好理解些。

一些關於Java的句子

它們在同一編譯單元的類和介面中也是可見的。巢狀類可以看到類中封裝的私有欄位和方法。然而,當前封閉類也可以看到該類下任何深度下類中的私有方法和欄位。

package
class Private {
private class PrivateInPrivate {
private Object object;
Object m() {
return new PrivateInPrivate().object;
a;
後者並不廣為人知,事實上也很少有用到。

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;

一些關於Java的句子

靜態(static)類可能有很多例項
訪問型別不是物件級別的而是類級別的。

那些不支援有任何例項的類,通常被稱為實用工具類。它們只包含靜態欄位和靜態方法以及唯一的不被該類的任何靜態方法呼叫的私有建構函式。在Java 8中也可以有這樣的一個野獸(這個詞翻譯不通,譯者注)在介面中實現,因為Java 8的介面可以有靜態方法。我不覺得我們應該使用這個特性而不是實用工具類。我也不完全確信我們應該使用實用工具類。

靜態類總是在另一個類或介面中。它們是巢狀類。他們是靜態的,就像靜態方法不能訪問類的例項方法和欄位一樣,靜態內部類也不能訪問嵌入類的例項方法和欄位。這是因為內部類沒有嵌入類例項的引用(或者說是指標,如果你喜歡這麼叫的話)。內部類(內部類,也即非靜態巢狀類, 譯者注),而非靜態巢狀類, 沒有嵌入類的一個例項,它是無法被建立的。每個內部類的例項都具有嵌入類例項的一個引用,因此一個內部類可以訪問嵌入類的例項方法和欄位。

一些關於Java的句子

因為這個原因,要是沒有外部類的一個例項,你就不能建立一個內部類。當然,如果是當前物件,也就是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所必須的嗎?嗯,你是對的。這只是一個良好的程式設計風格所必須的。