发表时间:2008-05-25
程序跑到System.out.println(t3.i);这一行的时候堆栈里信息如下图
t2保存了2个i的值 好神奇啊 一个是它自己的 一个是它继承而来的 1-System.out.println(t3.i);//由前期绑定变量可知 显示Test3类的i 所以为1 2-System.out.println(t3.f());//由方法重写[override](后期绑定方法)可知 调Test2类对象的f方法 而Test2类对象i=2(它当然不会选继承来的1) 故-2 3-System.out.println(t3.g()); //这个很简单 静态方法不能被子类重写 当然用Test3的g咯 PS: 2 3 都很好理解 关键是子类如果和父类实例变量名称类型一样。。。子类是能继承过来的。。。只不过子类会用自己的。。。就如楼上说的,父类那个i被藏起来了。 好毒啊。。。我也做错了第1个 以为父类那个i被覆盖了 其实不然 它还在 晕!!!别笑我菜 我真是学到了。。。 好题目 考基础 但是开发当中 最好别那么用!!! |
|
发表时间:2008-05-27
引用 你说的第2条有点问题,各有优缺点的。
JDK的很多方法都是这样重载的,一方面没什么不好,另一方面重构的时候扩展一般都是这样扩展的,老接口定义的方法怎么能随便动。 我来告诉你ParmClass1会有什么问题,你这种方式我取个名字叫“参数打闷包”,自己用起来非常方便,要加个参数,类里面加个属性就好了,但是代码可读性非常差,只有你知道这个ParmClass1在这个方法中用了哪几个参数。然后你一定反驳说,可以注释写得详细一点嘛,我认为注释、配置一概都算代码工作量,注释的工作量一算进去,还不如参数扁平化直观呢。 一般也就比较内聚的接口才会考虑用用“参数打闷包”,大模块之间的接口,一般是不会这样的。 我觉得这样参数打包也没有什么不好的 具体问题具体分析了 有的时候构造一个参数类比一串String 做参数好 我使用过一个公司提供的api,竟然需要16个参数,真的不晓得他们是怎么设计的 |
|
发表时间:2008-05-27
基本的东西!学习了!
|
|
发表时间:2008-05-27
曾经在看基础书的时候也看见过这样的问题.
但是在实际中,我想是不会写这样程序的. |
|
发表时间:2008-05-27
lzmhehe 写道 引用 你说的第2条有点问题,各有优缺点的。
JDK的很多方法都是这样重载的,一方面没什么不好,另一方面重构的时候扩展一般都是这样扩展的,老接口定义的方法怎么能随便动。 我来告诉你ParmClass1会有什么问题,你这种方式我取个名字叫“参数打闷包”,自己用起来非常方便,要加个参数,类里面加个属性就好了,但是代码可读性非常差,只有你知道这个ParmClass1在这个方法中用了哪几个参数。然后你一定反驳说,可以注释写得详细一点嘛,我认为注释、配置一概都算代码工作量,注释的工作量一算进去,还不如参数扁平化直观呢。 一般也就比较内聚的接口才会考虑用用“参数打闷包”,大模块之间的接口,一般是不会这样的。 我觉得这样参数打包也没有什么不好的 具体问题具体分析了 有的时候构造一个参数类比一串String 做参数好 我使用过一个公司提供的api,竟然需要16个参数,真的不晓得他们是怎么设计的 至少这样的接口不容易出错,重构也没问题。 你再仔细想想,如果你定义一个ParmClass的参数类,其实是很死的,不灵活的,因为你发布新版的时候你很难保证这个ParmClass不变,有时候这个ParmClass行为改变带来的困扰会远远超过16个参数。 16个参数就是多了点,但是还是很清楚的嘛。 从代码上来看,你新建一个ParmClass,调用16次set方法,和直接调用16个参数的代码分16行对齐,差不多的嘛,不满意自己封装一下也行的啊。 再举个例子,比如JS框架EXT,你看看它的参数方式,拓展一下思路。 |