黑马程序员技术交流社区

标题: 分析运行结果 [打印本页]

作者: yangzhong1991    时间: 2014-10-14 10:56
标题: 分析运行结果
分析运行结果,说明原理
        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么...


作者: 牛兴亮    时间: 2014-10-14 11:05
456123,估计是把
作者: 牛兴亮    时间: 2014-10-14 11:06
自己运行以下阿,不太记得了
作者: EDDY_Liang    时间: 2014-10-14 11:15
对的。。。都是456,普通成员函数运行看右边
作者: yueyazhishang    时间: 2014-10-14 11:27
必然是两个456
作者: Quasimodo    时间: 2014-10-14 11:29
对,第一个是继承,第二个是多态。
作者: zd12345    时间: 2014-10-14 11:29
都是456吧!
作者: javaAndroid    时间: 2014-10-14 13:45
结果打印的都是456
因为父类的func2被子类覆盖了。
调用b.fun1();的时候执行的是子类的func2,返回值为456
这一句A a = b;就是创建一个父类对象,指向b,但是堆内存没有产生新的对象
只是父类a指向了子类b,是多态
所以a.fun1();结果还是456.
作者: 默默丶    时间: 2014-10-14 15:41
肯定是两个456 第二个多态的fun()2是被复写之后的
作者: chenglove1201    时间: 2014-10-14 16:10
javaAndroid 发表于 2014-10-14 13:45
结果打印的都是456
因为父类的func2被子类覆盖了。
调用b.fun1();的时候执行的是子类的func2,返回值为456

A a = b这行代码怎么理解,不太懂
作者: 英雄传说ER    时间: 2014-10-14 16:56
chenglove1201 发表于 2014-10-14 16:10
A a = b这行代码怎么理解,不太懂

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

那他跟基本数据类型的互相转换是一样的吗
作者: 英雄传说ER    时间: 2014-10-14 17:18
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:24
本帖最后由 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类型实例。
如果一时半会理解不了可以慢慢来不要急。

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

嗯嗯,十分感谢:handshake
作者: chenglove1201    时间: 2014-10-15 19:09
javaAndroid 发表于 2014-10-14 22:24
A a = b这句就是说
本来内存中已经存在b,b的名字存放在栈内存
实体存在堆内存,b存放的是在堆内存的地址

十分详细,多谢多谢:handshake




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