A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨建聪 中级黑马   /  2013-3-6 08:49  /  1870 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨建聪 于 2013-3-7 22:08 编辑

class A
{
int num = 4;
void show()
{
System.out.println(num+"  *  ");
}
}
class B extends A
{
int num = 5;

}

class Demo1
{
public static void main(String[] args)
{
B b= new B();
System.out.println(b.num+" --  "+b.num);
b.show();
}
}
输出的结果是 5  5  4   为什么结果不是 5 5 5

8 个回复

倒序浏览
因为在调用show方法时,子类对象指向父类
回复 使用道具 举报
因为子类B继承了父类A,在你调用b.show()方法的时候,是调用父类的show()方法,而不是你本类的方法,所以打印的数值是父类的4,而不是子类的5。
回复 使用道具 举报
b中没有定义show,show始终都在父类中,而父类又是在子类中,所以show中的num是指向父类的num的,
回复 使用道具 举报
本帖最后由 谢军 于 2013-3-6 09:23 编辑

当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,这时会被父类类型的引用调用,所以你的b.show(),会被父类中的num调用!
使用父类类型的引用指向子类的对象;
该引用只能调用父类中定义的方法和变量;
回复 使用道具 举报
b.show();因为子类里没有show()方法,但是子类会重载父类里的show()方法,不会覆盖,所以会调用父类里的show()方法,
而show()方法里的num值还是父类的num值。所以会打印num=4;
如果子类里有show()方法会打印num=5;也就是说子类再覆盖父类里的show()方法时,show(){System.out.println(num+"  *  ");}方法会现在父类里查找num值,发现num=4,会先赋值给show()方法里的num,然后子类再覆盖(相当于调用)b.show();
回复 使用道具 举报
Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态。
通过引用变量来访问其包含的实列属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时类所定义的属性。所以运行的结果是5 5 4!
回复 使用道具 举报
杜超 发表于 2013-3-6 09:24
b.show();因为子类里没有show()方法,但是子类会重载父类里的show()方法,不会覆盖,所以会调用父类里的sho ...

这个比较认同!
回复 使用道具 举报
复写show方法应该就可以了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马