面试题: TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

 问题:TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

我个人测试的结果是:当前的add方法 放入父类的对象,就会报错。    如果 放入子类的对象,则各自调用各自的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

  

原文地址:https://www.cnblogs.com/gshao/p/10195934.html

时间: 2024-10-08 00:34:55

面试题: TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!的相关文章

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

/** * * @author ocq */ class Parent implements Comparable { private int age = 0; public Parent(int age) { this.age = age; } public int compareTo(Object o) { System.out.println("method of 父类"); Parent o1 = (Parent) o; return age > o1.age ? 1 :

python—类对象和实例对象的区别

最近在对RF的通讯层的模块进行封装,需要将之前放在类似main里面的一个方法,如下所示:这段代码是开发提供,用于接口测试,模拟底层通讯,具体的通讯是在dll内,python这边只是做了个封装让RF进行调用.这段通讯层的代码实质上做了五件事: 第一:加载dll: 第二:初始化dll内的通讯参数: 第三:与服务器进行连接,创建session 第四:把数据senbuffer通过sessionManger发送给服务器 第五:取得的数据返回recibuffer def testlogin(ip,port,

面向对象之父类变量指向子类实例对象分析

父类 public class person { public static string markup; static person() { markup = "markup"; } //无参数构造函数 //public person() //{ // Console.WriteLine("调用person构造函数"); //} public person(int parage, string paraname, string parahobby) { age =

浅析JS原型对象&amp;实例对象&amp;构造函数(转)

浅析原型对象,实例对象,构造函数的关系 原文地址:JS面向对象-原型对象,实例对象,构造函数的关系(http://blog.csdn.net/u014205965/article/details/45798861) 因为最根上的object拥有一个prototype属性,而js中所有的对象又都继承自object,所以js中所有的对象都拥有一个prototype属性,而在js中函数也是对象,所以js中每个函数也都有一个prototype属性. 例如:function Person(){...} 和

组合,Mixin,类、类对象、实例对象

1.组合,将几个横向关系的组合在一起.所谓的组合就是将类的实例化放到新类里面,那么就将旧类组合进去了. class Turtle: def __init__(self, x): # 注意 init 前面必须双下划线 self.num = x class Fish: def __init__(self, x): self.num = x class Pool: def __init__(self, x, y): self.turtle = Turtle(x) # Pool类中实例化Turtle对象

关于Javascript中通过实例对象修改原型对象属性值的问题

Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的说就1种,即Object类型.往细的说有:Object类型.Array类型.Date类型.Regexp类型.Function类型等. 当原型对象的属性值为基本类型的数据值时,通过实例对象修改属性值从而引起原型对象的属性值发生变化的情况不会发生.当原型对象的属性值为引用类型的数据值时,通过实例对象修改

扩展方法where方法查询不到数据,不会抛异常,也不是返回的null

如题,“扩展方法where方法查询不到数据,不会抛异常,也不是返回的null”,示例代码如下: Product类: public class Product { private string name; public string Name { get { return name; } set { name = value; } } private double price; public double Price { get { return price; } set { price = va

在重写了对象的equals方法后,还需要重写hashCode方法吗?

首先说建议的情况:  比如你的对象想放到Set集合或者是想作为Map的key时(非散列的Set和Map,例如TreeSet,TreeMap等),那么你必须重写equals()方法,这样才能保证唯一性.当然,在这种情况下,你不想重写hashCode()方法,也没有错.但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法. 然后再说说必须重写hashCode()的情况:     如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHa

私有构造方法为什么要抛异常?

私有构造方法为什么要抛异常? 不知道有没有小伙伴浏览过JDK源码,发现有些私有构造方法里也要抛出异常.那么疑问来了?构造方法都私有了.也不能调用,抛异常不是多此一举吗? 答案是否定的. 先来看一个例子:java.util.Objects public final class Objects { private Objects() { throw new AssertionError("No java.util.Objects instances for you!"); } } 在源码里