2017-08-13 72 views
3

我有一個簡單的類擴展LinkedHashSet,並試圖覆蓋toString()方法。我在主要方法中向Set添加了一些元素,但在我的toString方法中,Set爲空。代碼:爲什麼我的LinkedHashSet在toString()方法中是空的?

import java.util.*; 
import java.util.*; 

public class MyHashSet<T> extends LinkedHashSet<T>{ 
    private Set <T> myHashSet; 


    public MyHashSet(){ 
     myHashSet = new HashSet<T>(5); 
    } 

    @Override 
    public String toString(){ 
     if (myHashSet.isEmpty()) 
      return "This MyHashSet is empty."; 
     else 
      return myHashSet.toString(); 
    } 

    public static void main (String[] args){ 
     MyHashSet <String> myHashSet = new MyHashSet<>(); 

     myHashSet.add("A"); 
     myHashSet.add("B"); 
     myHashSet.add("C"); 
     myHashSet.add("D"); 
     myHashSet.add("E"); 

     System.out.println(myHashSet); 

     System.out.println(myHashSet.isEmpty()); 
    } 
} 

返回如下:

這MyHashSet是空的。

我期待toString(),而不是返回

[A,B,C,d,E]

我在做什麼錯?提前致謝。

+0

提示:您的代碼中有**兩件**事情,名爲'myHashSet'。 –

+1

五分鐘在調試器和這個問題(和隨之而來的downvote)將不會是必要的:) –

+0

myHashSet.myHashSet.add(「A」); :以這種格式添加數據。 – Akash

回答

5

toString()方法依賴於您聲明的myHashSet字段,但不添加元素。

事實上,在這裏:

 MyHashSet <String> myHashSet = new MyHashSet<>(); 

    myHashSet.add("A"); 
    myHashSet.add("B"); 
    myHashSet.add("C"); 
    myHashSet.add("D"); 
    myHashSet.add("E"); 

您所依託的LinkedHashSet實現您的類繼承自添加的元素。它當然不會使用你的領域。

事實上,你甚至不需要申報myHashSet如果擴展LinkedHashSet
所以只是toString()方法依賴於類的變化,你繼承:

@Override 
public String toString(){ 
    if (isEmpty()) 
     return "This MyHashSet is empty."; 
    else 
     return super.toString(); 
} 

否則,你也可以使用組成由依靠myHashSet場,但這樣你就不應擴大LinkedHashSet而是實現Set<E>

無論如何,使用繼承或組合。
但不是兩個在同一時間。

3

簡單:因爲你不添加內部地圖,你在你的類必須爲字段中的任何元素。

此位置:

myHashSet.add("A"); 

添加元素,你類繼承 「設置」 結構。

爲了使用內部集合,您還必須@Override各種add()方法。

但請注意:你應該要麼使用的組合物(使用內部myHashSet場) - 繼承(那麼你並不需要擺在首位這樣的字段)。

您正在合併兩個概念,不應該這樣組合!

除此之外:你有兩件事myHashSet - 這是相當混亂。避免以這種方式重新使用名字!

相關問題