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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangzhong1991 中级黑马   /  2014-10-14 10:56  /  1838 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

分析运行结果,说明原理
        class A {
            void fun1() {
                      System.out.println(fun2());
                }
                int fun2() {
                        return 123;
                }
        }
         public class B extends A {
                int fun2() {
                         return 456;
                 }
              public static void main(String args[]) {
                        B b = new B();
                        b.fun1();
                        A a = b;
                        a.fun1();
                }
        }
结果是两个456么...

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

16 个回复

倒序浏览
456123,估计是把
回复 使用道具 举报
自己运行以下阿,不太记得了
回复 使用道具 举报
对的。。。都是456,普通成员函数运行看右边
回复 使用道具 举报
必然是两个456
回复 使用道具 举报
对,第一个是继承,第二个是多态。
回复 使用道具 举报
zd12345 中级黑马 2014-10-14 11:29:32
7#
都是456吧!
回复 使用道具 举报
结果打印的都是456
因为父类的func2被子类覆盖了。
调用b.fun1();的时候执行的是子类的func2,返回值为456
这一句A a = b;就是创建一个父类对象,指向b,但是堆内存没有产生新的对象
只是父类a指向了子类b,是多态
所以a.fun1();结果还是456.
回复 使用道具 举报
肯定是两个456 第二个多态的fun()2是被复写之后的
回复 使用道具 举报
javaAndroid 发表于 2014-10-14 13:45
结果打印的都是456
因为父类的func2被子类覆盖了。
调用b.fun1();的时候执行的是子类的func2,返回值为456

A a = b这行代码怎么理解,不太懂
回复 使用道具 举报
chenglove1201 发表于 2014-10-14 16:10
A a = b这行代码怎么理解,不太懂

子类向上转型 把b(子类对象)提升到为A类(父类)
就像动物类里面有猫这个类  你new了一个新对像cat 但是你又不用cat的特有方法捉老鼠 这个cat其实也是动物 因为cat所属的猫类是动物类的子类 所以你也可以说这个cat是动物 这就是类型提升
回复 使用道具 举报
英雄传说ER 发表于 2014-10-14 16:56
子类向上转型 把b(子类对象)提升到为A类(父类)
就像动物类里面有猫这个类  你new了一个新对像cat 但 ...

那他跟基本数据类型的互相转换是一样的吗
回复 使用道具 举报
chenglove1201 发表于 2014-10-14 17:11
那他跟基本数据类型的互相转换是一样的吗

可以这样理解 向上转型无所谓 但是向下转型的时候一定要注意 最开始建立的时候就是父类对象
例如 FU f = new ZI(); 这样才可以强制向下转型 ZI z = (ZI)f;
如果 FU f = new FU();然后 ZI z = (ZI)f;是不可以的
回复 使用道具 举报
本帖最后由 javaAndroid 于 2014-10-14 22:26 编辑
chenglove1201 发表于 2014-10-14 16:10
A a = b这行代码怎么理解,不太懂

A a = b这句就是说
本来内存中已经存在b,b的名字存放在栈内存
实体存在堆内存,b存放的是在堆内存的地址
现在新建一个A类型的对象a在栈内存上
然后a直接指向b的实体
这个过程中并没有产生真正的新的A类型实例。
如果一时半会理解不了可以慢慢来不要急。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
456456,没错的。子类fun2()覆盖了父类的。后面多态也一样,想结果不一样,在Class A中改成 private int fun2()。
回复 使用道具 举报
英雄传说ER 发表于 2014-10-14 17:18
可以这样理解 向上转型无所谓 但是向下转型的时候一定要注意 最开始建立的时候就是父类对象
例如 FU f =  ...

嗯嗯,十分感谢:handshake
回复 使用道具 举报
javaAndroid 发表于 2014-10-14 22:24
A a = b这句就是说
本来内存中已经存在b,b的名字存放在栈内存
实体存在堆内存,b存放的是在堆内存的地址

十分详细,多谢多谢:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马