本帖最后由 longer5153458 于 2013-08-26 12:19:39 编辑

解决方案 »

  1.   

    short answer: no
    long answer: 
    son2.getClass() == son1.getClass() 跟 25 == "25" 道理一样,类型不匹配无法比较
    第一个子类自然不等于父类,可以兼容并不就是相等。你爹让你进家门,总不至于让你睡错床吧!就是这个道理
      

  2.   

    我觉得是不是应该用equals来比较呢...不知道,试试吧
      

  3.   

    1.son1.getClass()==father.getClass(),对象比较需要重写下equals()方法,用equals()来比较.
    2.son1.getClass()和father.getClass()本来就不是以一个对象,一个是父类Class,一个是子类Class.
      

  4.   

         boolean flag= false;        
         Son1 son1= new Son1();         
         Son2 son2= new Son2();         
         Father father= new Father();         
        if(son1.getClass()==father.getClass()){//这里却不会报错,难道只有子类跟父类才可以使用  getclass()来比较么吗?             flag= true;         
    }          
    System.out.println(flag);//这里的flag=flase,难道子类不属于父类么?        
     /*if(son2.getClass()==son1.getClass()){//这就为啥会报错             flag = true;         }         
    */
    =================================================
    我的理解是这样的:
        1)子类是子类,同时也是父类,它可以调用子类的方法,为了通用常将其类型用父类表示,更通用的做法是上升到接口。
        2)if中是比较不会有错的,Son1.getClass就是Son1.class,而Father.getClass就是Father.class,由于两个名称不同因此是不相同的,但并不意味着子类不是父类,它仍是从父类下继承过来的就象猫是猫,同时也是动物一样。
       3)经常可以看到这样写:Father son1=new Son1();此时访问的是Son1类中的方法,但它仍可上溯成Father的对象,这样更加通用。
      

  5.   

    子类与父类的getClass会做类型推断,判断这些类是不是extends 某个类
    而子类与父类都extends 父类,所以可以比较
    但是子类比较推断不出相同的extends的类,或者说推断不到父类那一级别的类型,所以会报错
      

  6.   

    子类与父类用 == 判断,明显不对。 对象之间用equals判断
      

  7.   

    这个报错是因为现在编译器聪明了,把绝对不可能相等的情况在编译时就告诉你:“哥~别闹了”
    如果你你写成        Class c1=son1.getClass();
            if(son2.getClass()==c1){
                flag = true;
            }
    就不会报错了,但实际执行结果也不可能相等。至于if(son1.getClass()==father.getClass()){
    flag= true;
    }不会报错是因为“Father的引用有可能是一个Son1的实例”。这句话希望楼主能够听明白。最后我想说一句:"哥~别闹了,咱好好理解一下'=='好么"
      

  8.   


    if(son2.getClass()==son1.getClass()){//这就为啥会报错
        flag = true;
    }这个报错是因为现在编译器聪明了,把绝对不可能相等的情况在编译时就告诉你:“哥~别闹了”
    如果你你写成        Class c1=son1.getClass();
            if(son2.getClass()==c1){
                flag = true;
            }
    就不会报错了,但实际执行结果也不可能相等。至于if(son1.getClass()==father.getClass()){
    flag= true;
    }不会报错是因为“Father的引用有可能是一个Son1的实例”。这句话希望楼主能够听明白。最后我想说一句:"哥~别闹了,咱好好理解一下'=='好么"
      

  9.   

    楼主注意一下你的逻辑好吗!你程序写完,即没编译也没运行你就想知道这两个类是否一样吗?你只是在工具里写好这个程序,编译器只能判断语法错误,你的语法没错,所以就不会报编译错误了。对了,理解好编译期和语法编译。其实你的程序已经很明白的告诉你了,如果相等输出true,否则输出false。java错误有两种,编译错误和逻辑错误,编译通过了并不能说明你逻辑没错。父类和子类不属于同一个类。只是有这样一种现象,就是子类在编译期会是父类的类型,但是在运行期却还是子类的类型。