子类父类属于同一个类么 本帖最后由 longer5153458 于 2013-08-26 12:19:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 short answer: nolong answer: son2.getClass() == son1.getClass() 跟 25 == "25" 道理一样,类型不匹配无法比较第一个子类自然不等于父类,可以兼容并不就是相等。你爹让你进家门,总不至于让你睡错床吧!就是这个道理 我觉得是不是应该用equals来比较呢...不知道,试试吧 1.son1.getClass()==father.getClass(),对象比较需要重写下equals()方法,用equals()来比较.2.son1.getClass()和father.getClass()本来就不是以一个对象,一个是父类Class,一个是子类Class. 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的对象,这样更加通用。 子类与父类的getClass会做类型推断,判断这些类是不是extends 某个类而子类与父类都extends 父类,所以可以比较但是子类比较推断不出相同的extends的类,或者说推断不到父类那一级别的类型,所以会报错 子类与父类用 == 判断,明显不对。 对象之间用equals判断 这个报错是因为现在编译器聪明了,把绝对不可能相等的情况在编译时就告诉你:“哥~别闹了”如果你你写成 Class c1=son1.getClass(); if(son2.getClass()==c1){ flag = true; }就不会报错了,但实际执行结果也不可能相等。至于if(son1.getClass()==father.getClass()){ flag= true;}不会报错是因为“Father的引用有可能是一个Son1的实例”。这句话希望楼主能够听明白。最后我想说一句:"哥~别闹了,咱好好理解一下'=='好么" 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的实例”。这句话希望楼主能够听明白。最后我想说一句:"哥~别闹了,咱好好理解一下'=='好么" 楼主注意一下你的逻辑好吗!你程序写完,即没编译也没运行你就想知道这两个类是否一样吗?你只是在工具里写好这个程序,编译器只能判断语法错误,你的语法没错,所以就不会报编译错误了。对了,理解好编译期和语法编译。其实你的程序已经很明白的告诉你了,如果相等输出true,否则输出false。java错误有两种,编译错误和逻辑错误,编译通过了并不能说明你逻辑没错。父类和子类不属于同一个类。只是有这样一种现象,就是子类在编译期会是父类的类型,但是在运行期却还是子类的类型。 java一些常用代码的分享! 麻烦帮忙 为什么怎么刷新也刷不出来? 关于tabFolder控件怎样默认显示一个tabItem 我现在做"世界杯足球赛成绩统计",但不懂怎么实现添加、删除、修改记录。 监听器问题 java实现网站在线人员名单的如何区分开? java小程序,判断输入的年份是否合法,动态输入,高手进 一个java游戏,急,(1) 一道简单的JAVA事件驱动题,编译出错,请求解答? 如何在JFrame中改变鼠标光标的形状 【工作5年面试被卡主,坑爹】内部类问题 大文本文件数据对比方案
long answer:
son2.getClass() == son1.getClass() 跟 25 == "25" 道理一样,类型不匹配无法比较
第一个子类自然不等于父类,可以兼容并不就是相等。你爹让你进家门,总不至于让你睡错床吧!就是这个道理
2.son1.getClass()和father.getClass()本来就不是以一个对象,一个是父类Class,一个是子类Class.
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的对象,这样更加通用。
而子类与父类都extends 父类,所以可以比较
但是子类比较推断不出相同的extends的类,或者说推断不到父类那一级别的类型,所以会报错
如果你你写成 Class c1=son1.getClass();
if(son2.getClass()==c1){
flag = true;
}
就不会报错了,但实际执行结果也不可能相等。至于if(son1.getClass()==father.getClass()){
flag= true;
}不会报错是因为“Father的引用有可能是一个Son1的实例”。这句话希望楼主能够听明白。最后我想说一句:"哥~别闹了,咱好好理解一下'=='好么"
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的实例”。这句话希望楼主能够听明白。最后我想说一句:"哥~别闹了,咱好好理解一下'=='好么"