zoukankan      html  css  js  c++  java
  • 面试题: 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
    

      

  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/gshao/p/10195934.html
Copyright © 2011-2022 走看看