黑马程序员技术交流社区

标题: 今天老师发的一个程序题, [打印本页]

作者: yy306525121    时间: 2015-1-13 21:34
标题: 今天老师发的一个程序题,
原题是这样的:
public class Test {
    public static void main(String[] args) {
        Zi z = new Zi();
    }
}

class Fu {
    int num = 5;

    Fu() {
        show();
        System.out.println(num);
    }

    void show() {
        System.out.println("55");
    }
}

class Zi extends Fu {
    int num = 3;

    Zi() {
    }

    void show() {
        System.out.println(num);
    }
}

各位可以猜猜打印结果





结果是0   5,你猜对了吗???

本屌也是通过debug和问度娘之后才明白,下面就讲讲这道题
按照正常程序走,成员变量在对象创建的同时会自动复制为0,然后走构造函数,这里有一个问题,如上题子类中的    int num = 3;中的3在什么时候赋值给num,通过debug多次之后发现这个值3是在构造函数中的super()方法运行之后才会赋给num,其实父类中的构造函数可以说也隐藏了一个super()方法,因为父类上面还有一个Object类,但是那么问题来了,父类构造函数中的 show();调用的是父类中的show()方法呢还是子类中的show()方法呢?这里体现了继承的多态性,如果子类继承了父类中的方法,那么不管你在子类还是在父类中调用这个方法名,最终执行的都是子类中的方法,我是这样理解的,子类继承了父类的方法并进行了重写,那么子类中的功能就比父类中的功能要强大,那么肯定是要用子类中的方法了啊,当父类构造函数中调用show()方法的时候,其实执行的是子类中的show()方法,但是这个时候子类构造函数中的super()方法还没有执行完,那么打印的num值就是0了,最终打印出来的结果就是0    5



这里有两点是容易弄错的:
1,方法的成员变量在对象创建的时候int的默认值是0的,当你构造函数中的super()方法执行完之后才会将你的值赋给变量
2,子类复写父类的方法之后,即使你在父类中直接调用方法,最终运行的却是子类中的方法
作者: 胖子是没有春天    时间: 2015-1-13 21:36
大神解答的够迅速的啊
作者: IcedCoffee    时间: 2015-1-13 21:36
沙发是我滴 小山羊
作者: yy306525121    时间: 2015-1-13 21:37
胖子是没有春天 发表于 2015-1-13 21:36
大神解答的够迅速的啊

哈哈,今天晚自习研究了一下
作者: yy306525121    时间: 2015-1-13 21:38
IcedCoffee 发表于 2015-1-13 21:36
沙发是我滴 小山羊

沙发被别人抢了:(
作者: lionel    时间: 2015-1-13 21:38
其实关键是还没有了解java里面的内存机制,上课老师讲的有几点没讲清,有一个临时存储区,
作者: yy306525121    时间: 2015-1-13 21:39
lionel 发表于 2015-1-13 21:38
其实关键是还没有了解java里面的内存机制,上课老师讲的有几点没讲清,有一个临时存储区, ...

恩,这个初始化以前一直没注意,这点内存咋弄的还是有点迷糊
作者: 胖子是没有春天    时间: 2015-1-13 21:45
IcedCoffee 发表于 2015-1-13 21:36
沙发是我滴 小山羊

椅子坐着舒服么:P
作者: 李一白_    时间: 2015-1-13 21:49
大神就在我身边...
作者: eli0827    时间: 2015-1-13 21:56
上课没弄明白show()方法的执行顺序问题。。。
作者: Rain2692    时间: 2015-1-13 21:57
呵呵。。。
作者: yy306525121    时间: 2015-1-13 21:59
eli0827 发表于 2015-1-13 21:56
上课没弄明白show()方法的执行顺序问题。。。

因为子类重写了父类的show()方法,所以不管在哪调用,最终执行的都是子类的show(),可以自己做个小实验实验一下
作者: lionel    时间: 2015-1-13 22:20
寄存器应该吧,我去度娘看看
作者: gecl    时间: 2015-1-13 22:45
:o才整明白。。。上课听完也没太懂
作者: kenfine    时间: 2015-1-13 23:02
完全懵了...
作者: bluebloodant    时间: 2015-1-13 23:11
人工帮顶
作者: bluebloodant    时间: 2015-1-13 23:26
很好 帮顶一下
作者: 路尽鹭飞    时间: 2015-1-13 23:33
小山羊同学,真开心看见你
作者: lidinghai    时间: 2015-1-13 23:43
学习了!
作者: da_chuan    时间: 2015-1-13 23:48
楼主你好牛逼啊,
作者: hjg8858    时间: 2015-1-13 23:58
懂了^^^66
作者: xc29417412    时间: 2015-1-14 00:12
顶一个,顶一个,顶一个,顶一个,
作者: da_chuan    时间: 2015-1-14 00:18
如果子类继承了父类中的方法,那么不管你在子类还是在父类中调用这个方法名,最终执行的都是子类中的方法???大哥我感觉这句话好像有点问题啊啊
作者: jojo    时间: 2015-1-14 00:25
受教了,自己也debug亲测了下
作者: 郭文飞    时间: 2015-1-14 05:27
我也糊涂了  




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