黑马程序员技术交流社区

标题: 题,做错了,求解释 [打印本页]

作者: 张涛的狂怒    时间: 2014-8-12 04:57
标题: 题,做错了,求解释
本帖最后由 张涛的狂怒 于 2014-8-12 10:09 编辑

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

/* compareTo其实就是依次比较两个字符串ASC码。如果两个字符串完全一样,则返回0。
* 父类中使用了compareTo方法,那么子类继承的时候会覆写父类中的方法。
* 也就是说子类中也就不能存在自己的compareTo方法。如果同时放入父类和子类的实例对象
* 比较的是父类中的compareTo方法。
*
*/
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");
       Parent o1 = (Parent)o;
       return age>o1.age?1:age<o1.age?-1:0;
    }
}
class Child extends Parent{
    public Child(){
       super(3);
    }
    public int compareTo(Object o) {
           System.out.println("method of child");
           Parent o1 = (Parent)o;//传入的是父类对象的实例
//           Child o1 = (Child)o;//调用的也是父类的compareTo
           return 1;
    }
}
public  class Test10 {
    public static void main(String[] args) {
       TreeSet set = new TreeSet();
       set.add(new Parent(3));
       set.add(new Child());
       set.add(new Parent(4));
       System.out.println(set.size());
    }
}
作者: m313786372    时间: 2014-8-12 06:03
本帖最后由 m313786372 于 2014-8-12 06:25 编辑

放入谁,就是 谁.compareTo(set里的元素)
有多态的情况下,符合多态的方法调用规则。

  1. import java.util.Set;
  2. import java.util.TreeSet;

  3. public class TestOne {
  4.         public static void main(String[] args){
  5.                 Fu f = new Fu("f");
  6.                 Zi z = new Zi("z");
  7.                 Fu f1 = new Fu("f1");
  8.                 Fu f2 = new Zi("f2");        //多态
  9.                 Zi z1 = new Zi("z1");
  10.                
  11.                 Set set = new TreeSet();
  12.                
  13.                 System.out.println("=======================================放入父类对象f:");
  14.                 set.add(f);
  15.                 System.out.println();
  16.                
  17.                 System.out.println("=======================================放入子类对象z:");
  18.                 set.add(z);
  19.                 System.out.println();
  20.                
  21.                 System.out.println("=======================================放入父类对象f1:");
  22.                 set.add(f1);
  23.                 System.out.println();
  24.                
  25.                 System.out.println("=======================================放入父类引用指向子类对象f2:");
  26.                 set.add(f2);
  27.                 System.out.println();
  28.                
  29.                 System.out.println("=======================================放入子类对象z1:");
  30.                 set.add(z1);
  31.                 System.out.println();
  32.                
  33.     }
  34. }

  35. class Fu implements Comparable {
  36.        
  37.         String quoteName;
  38.        
  39.         public Fu(String quoteName) {
  40.                 this.quoteName = quoteName;
  41.         }
  42.        
  43.         @Override
  44.         public String toString() {
  45.                 return this.quoteName;
  46.         }
  47.        
  48.         public int compareTo(Object obj) {
  49.                 System.out.println(this.quoteName+" compareTo "+((Fu)obj).quoteName+",调用父类compareTo方法");
  50.                 return this.quoteName.compareTo(((Fu)obj).quoteName);
  51.         }
  52. }


  53. class Zi extends Fu {
  54.        
  55.         public Zi(String quoteName) {
  56.                 super(quoteName);
  57.         }
  58.        
  59.         @Override
  60.         public int compareTo(Object obj) {
  61.                 System.out.println(this.quoteName+" compareTo "+((Fu)obj).quoteName+",调用子类compareTo方法");
  62.                 return this.quoteName.compareTo(((Fu)obj).quoteName);
  63.         }
  64. }
复制代码
拿去跑一下就清楚了。
  1. =======================================放入父类对象f:
  2. f compareTo f,调用父类compareTo方法

  3. =======================================放入子类对象z:
  4. z compareTo f,调用子类compareTo方法

  5. =======================================放入父类对象f1:
  6. f1 compareTo f,调用父类compareTo方法
  7. f1 compareTo z,调用父类compareTo方法

  8. =======================================放入父类引用指向子类对象f2:
  9. f2 compareTo f1,调用子类compareTo方法
  10. f2 compareTo z,调用子类compareTo方法

  11. =======================================放入子类对象z1:
  12. z1 compareTo f1,调用子类compareTo方法
  13. z1 compareTo z,调用子类compareTo方法
复制代码



作者: m313786372    时间: 2014-8-12 06:19
另外,LZ,compareTo不是比较ASC码啊,compareTo是你自己写的方法,你写什么它就比较什么。
除了(它是Comparable接口所要求的方法,TreeSet会调用这个方法)之外,compareTo跟普通的方法没什么区别,具有一般方法在继承和重写下的通用特性啊。
有继承和重写的情况下,就遵循继承和重写的规则。
作者: 张涛的狂怒    时间: 2014-8-12 06:42
m313786372 发表于 2014-8-12 06:03
放入谁,就是 谁.compareTo(set里的元素)
有多态的情况下,符合多态的方法调用规则。

明白了,谢谢
作者: 张涛的狂怒    时间: 2014-8-12 06:43
m313786372 发表于 2014-8-12 06:19
另外,LZ,compareTo不是比较ASC码啊,compareTo是你自己写的方法,你写什么它就比较什么。
除了(它是Comp ...

谢了。。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2