2011-02-16 108 views
1

如果我的子類和父類使用相同的變量名會發生什麼?子類,父類....變量衝突?

父類是八九不離十這樣的:

public class things{ 
    private things[] stuff; 
} 

和子類是這樣的:

import java.utils.LinkedList; 
public class listOfThings extends LinkedList<things>{ 
    private LinkedList<things> stuff; 
} 

這可以嗎?或者鏈表是否會覆蓋數組?

+3

瞭解Java編碼約定 - 您的類名不好。爲什麼你會同時做同一班的繼承和組成? IS-A和HAS-A在同一個對象中。你應該下定決心。 – duffymo 2011-02-16 00:27:54

回答

2

你不延長事情這個例子中,要擴展

LinkedList<things> 

這是不是擴展事情根本不同。

因此,您的代碼應該編譯。

+0

那麼,他的代碼不會編譯,因爲import語句是`java.utils.LinkedList`,它應該是`java.util.LinkedList`。 :) – limc 2011-02-16 00:17:26

+0

好抓...沒有注意到我自己;-) – karlgrz 2011-02-16 00:19:19

4

在這種情況下,兩個變量都是私有的。這意味着它們只存在於定義類的範圍內,並且沒有重疊。如果父類聲明該變量爲protected或public,那麼您將得到一個有關已存在的變量的編譯器錯誤。

編輯:
KG回答了您提供的示例的問題。我回答你是否真的在做你在問什麼。

1

具有相同名稱的變量是可以的。 私人,公共,靜態,實例,本地方法,塊本地,不管。 Java選擇最接近的一個。它比方法更鬆散。

JLS3#8.3:(這裏只有1這是在第一句說限制)

它是一類聲明體編譯時錯誤名稱相同聲明兩個領域。方法,類型和字段可能具有相同的名稱,因爲它們在不同的上下文中使用,並且通過不同的查找過程(第6.5節)進行消歧。

如果類聲明瞭一個具有特定名稱的字段,那麼該字段的聲明被稱爲隱藏在超類和該類的超接口中具有相同名稱的字段的任何和所有可訪問的聲明。字段聲明還隱藏了封閉類或接口中任何可訪問字段的聲明(第6.3.1節),以及在任何封閉塊中具有相同名稱的任何本地變量,形式方法參數和異常處理程序參數。

如果一個字段聲明隱藏了另一個字段的聲明,則這兩個字段不必具有相同的類型。

一個類繼承自它的直接超類和直接超接口超類和超接口的所有非私有字段,它們都可以在類中被代碼訪問並且不被類中的聲明隱藏。

請注意,超類的專用字段可能可以訪問子類(例如,如果兩個類都是同一類的成員)。儘管如此,私人領域永遠不會被一個子類繼承。

一個類可能會繼承具有相同名稱的多個字段(第8.3.3.3節)。這種情況本身並不會導致編譯時錯誤。但是,任何在類的主體中通過其簡單名稱引用任何這樣的字段的嘗試都會導致編譯時錯誤,因爲這樣的引用是不明確的。

// this is a valid program! 
class $ 
{ 
    $ $; 
    $ $($ $) 
    { 
     class $$ extends $ 
     { 
      $$ $; 
     } 
     return new $$(); 
    } 
}