两个继承方面的问题
两个继承方面的问题
1、《core java》中说明了clone()方法是Object的方法,而且只能定义
为protected,而子类定义clone()时必须重新定义其为public,并说这是保护
机制的巧面之处,我不知道巧妙在什么地方?受保护的方法对任何子类都可以使用
那么这里的protrected 和public有什么区别呢?
2、比如父类Employee中有个
public String toString()
{
return getClass().getName()
+"[name="+name
+",salary="+salary
+",hireDay="+hireDay
+"]";
}
而子类Manager中的
public String toString()
{
return super.toString()+ "[bonus="+bonus+"]";
}
我的问题是Manager的对象调用toString时为什么返回的是Manager[name=....]
而不是Employee[name....]? 我的理由是Manager中的toString()中用的是super
这说明是调用的是父类方法那理所应该得到父类Employee的类名?
以上两个问题应该说知道具体结果但理解上模糊,请知道的人知道一下
问题点数:20、回复次数:7Top
1 楼kypfos(不在寻梦)回复于 2003-11-04 12:36:15 得分 0
protected是保护那个包,一个家族的访问权,它的同一个包里的子类可以调用,其他包就不行,避免被别人继承而做clone()操作。Top
2 楼meme5(meme)回复于 2003-11-04 13:23:53 得分 0
谢谢回答,但我还是不理解任何类都是object的子类,那object中的clone()定义为protected有什么意义呢?Top
3 楼truezerg(赵明宇)回复于 2003-11-04 14:02:55 得分 5
我的问题是Manager的对象调用toString时为什么返回的是Manager[name=....]
而不是Employee[name....]? 我的理由是Manager中的toString()中用的是super
这说明是调用的是父类方法那理所应该得到父类Employee的类名?
是调用的父类的方法,但该方法到底应该怎么执行,取决于当前实例,不取决于代码写在哪里(父类还是子类),当前实例是子类,那结果就是子类的结果。Top
4 楼meme5(meme)回复于 2003-11-04 14:38:44 得分 0
谢谢两位的回答,我还是希望听听更多的解释,希望高手赐教!!Top
5 楼kinoviti(-=K.V=-)回复于 2003-11-04 15:24:02 得分 15
首先回答你的第2个问题:
当你覆盖了超类的方法的时候那么在编译过程中程序一定是在完成构造函数之前就已经决定了什么是真正的方法,在你的程序中在对象建立之前他的方法就已经完成了,那么当对象调用toString方法时,当然就是现实自己(当前实例)的名字了。你也可以理解为你那个super.toString()就是一种简写吧。
其次讨论你的第一个问题:
Object.clone()方法定义为保护方式,因为子类也需要限制使用克隆,但是如果把它在Object中就定义为public,则子类根本不能够采取更严格的限制。
Top
6 楼kinoviti(-=K.V=-)回复于 2003-11-04 16:29:04 得分 0
现在回答你的第一个问题。
我们都知道一个新的类多数情况下都是通过 组合(combination) 方式完成的。
举个例子吧:
汽车(Car)类 那么Car的对象---BMW (宝马车)extends Car就有了自己的那些轮胎/车架/发动机,这些东东,这时,夏利 extends Car 也有了相应的基础东东,
(我们都知道 Car extends Object)
1。如果 Object.clone()----public 那么可以想象 只要 夏利 在他的定义内 调用 宝马的clone方法 那么它也能买BMW了,这不就出现了“盗版”!!
2。如果 -----protected 那么 只有夏利 号称 是宝马公司的子公司(继承),或者合作伙伴(同一个包)才能生产宝马,否则 充其量 只能拿来看看但是不能生产。
3。如果是----private 那么这下惨了,在clone()方式中我们不能调用 super.clone()来建立完成克隆,连BMW公司都破产了。
Top
7 楼qinjinhua(秦金华)回复于 2003-11-04 17:04:58 得分 0
楼上的解释真是经典啊Top




