面試題: TreeSet裏面放對象,如果同時放入了父類和子類的實例對象,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!

 問題:TreeSet裏面放對象,如果同時放入了父類和子類的實例對象,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常!

我個人測試的結果是:當前的add方法 放入父類的對象,就會報錯。    如果 放入子類的對象,則各自調用各自的compareTo()方法進行排序。

 引入問題: 如果 子類沒有重寫 compareTo()方法,放入子類和父類的對象的順序 可以隨便放,但是遍歷的結果子類對象只能加入一個。這又是爲什麼?????求解?

看代碼:

 

package 測試比較父類子類conpateTo;

public class Parent  implements Comparable  {
	private String name;
	private int age;
	
	public int getAge(){
		return age;
	}
	public Parent(){
		System.err.println("Parent無參構造器"+name+":"+age);
	};
	public Parent(String name,int age){
		this.name=name;
		this.age=age;
		System.err.println("Parent雙參構造器"+name+":"+age);
	}
	//父類年齡升序排列
	@Override
	public int compareTo(Object o) {
		Parent obj = (Parent)o;
		return this.age-obj.getAge();
	}
	
	public String toString(){
		return name+":"+age;
	}
	

}

 

  

package 測試比較父類子類conpateTo;

public class Children extends Parent {
	private String name;
	private int age;
	
	public Children(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override 
	//子類年齡降序排列
	public int compareTo(Object o){
		Children c=(Children)o;
		return c.age-this.age;
	}
	public String toString(){
		return name+":"+age;
	}
}

  

測試1:

先放入父類任意一個對象,報錯  ClassCastException
public class Test {
	public static void main(String[] args) {
		TreeSet<Parent> t=new TreeSet();
		
		Parent p=new Parent("Parent1", 45);
		Parent p1=new Parent("Parent2", 47);
		Parent p2=new Parent("Parent3", 24);
		Parent p4=new Parent("Parent4", 22);
		
		Children c1=new Children("Jame1",12);
		Children c2=new Children("Jame2",23);
		Children c3=new Children("Jame3",46);
		
		System.out.println("TreeSet遍歷-------");
		//先放入父類任意一個對象,報錯  ClassCastException
		t.add(p);
		t.add(c2);
		t.add(c1);
		t.add(p1);
		t.add(p4);
		t.add(c3);
		
		t.add(p2);

		Iterator<Parent> iterator=t.iterator();
		while(iterator.hasNext()){
			System.err.println(iterator.next());
		}
	}
}

  

測試2:

//先放入子類的對象
		t.add(c2);
		t.add(c1);
		t.add(p1);
		t.add(p4);
		t.add(c3);
		t.add(p);
		t.add(p2);

 輸出結果:

Parent雙參構造器Parent1:45
Parent雙參構造器Parent2:47
Parent雙參構造器Parent3:24
Parent雙參構造器Parent4:22
Parent無參構造器null:0
Parent無參構造器null:0
Parent無參構造器null:0
TreeSet遍歷-------
Jame3:46
Jame2:23
Jame1:12
Parent4:22
Parent3:24
Parent1:45
Parent2:47

 

測試3:  子類沒有重寫 compareTo()方法

         t.add(p4);

		t.add(c3);  //我先加入,只有我了
		t.add(c2);
		t.add(p2);
		t.add(p1);
		t.add(p);
		t.add(c1);

  

Parent雙參構造器Parent1:45
Parent雙參構造器Parent2:47
Parent雙參構造器Parent3:24
Parent雙參構造器Parent4:22
Parent無參構造器null:0
Parent無參構造器null:0
Parent無參構造器null:0
TreeSet遍歷-------
Jame3:46
Parent4:22
Parent3:24
Parent1:45
Parent2:47

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章