日期:2014-05-20  浏览次数:20713 次

很简单的多态的问题,求解答
package Diversify;

import static Test_purview.print.*;
import Test_initalized.neum;

public class Test_diversifyTest1 {
public static void main(String[] args){
Cycle c = new Cycle();
print(" 车轮数:"+c.ride(neum.Bicycle).wh);
Unicycle c1 = new Unicycle();
print(" 车轮数:"+c1.ride(neum.Unicycle).wh);
}
}
class Cycle{
int wh = 0;
public Cycle(){
print("This is in The class Cycle!");
}
public Cycle ride(Object o){
print("Class: "+ this);
return this;
}
}

class Unicycle extends Cycle{
int wh = 4;
public Unicycle(){
print("This is in The class Unicycle!");
}
}
class Bicycle extends Cycle{
int wh = 2;
public Bicycle(){
print("This is in The class Bicycle!");
}
}
class Tricycle extends Cycle{
int wh = 3;
public Tricycle(){
print("This is in The Tricycle!");
}
}




结果:

This is in The class Cycle!
Class: Diversify.Cycle@61de33
 车轮数:0
This is in The class Cycle!
This is in The class Unicycle!
Class: Diversify.Unicycle@ca0b6
 车轮数:0


为什么第二个车轮数不是4呢?求解求解。。。。

------解决方案--------------------
程序输出的变量wh是父类Circle的。
------解决方案--------------------
ride()返回的是父类Cycle对象,然后.wh当然是父类的wh
如果在子类中重写ride()并且返回该子类对象,那么调用的是该子类的wh变量,如果该子类没有wh变量,那么取的还是父类wh变量。
明白了吗?
------解决方案--------------------

这种upcast(向上造型) 
1.域:调用父类属性 
2.方法:调用子类方法 

在java多态中重写,只是子类重写父类方法并覆盖,而属性这不存在多态。。即变量在子类,父类中都是独立存在的。。。调用规则如上:这是sun公司的规定,必须是这样的语法。。。使用者只要会用就ok了,
《thinking in java 4th》
------解决方案--------------------
因为子类Unicycle没有重写父类的ride()方法,于是调用到的就是父类的ride方法,而父类的ride方法返回的是父类的wh,于是,它就是0而不是4了
------解决方案--------------------
属性, 声明谁的,就是谁的.



------解决方案--------------------
遵循就近原则,导出类中有wh就使用导出类的,没有就找基类的。你的例子返回的是基类对象肯定是用基类的wh了。
探讨

属性不存在多态?是就是说所有导出类的对象中要是使用wb的话都是基类的呀?

------解决方案--------------------
探讨
属性, 声明谁的,就是谁的.

------解决方案--------------------
探讨
属性不存在多态?是就是说所有导出类的对象中要是使用wb的话都是基类的呀?

------解决方案--------------------
对的,在导出类中重写ride方法就可以了
探讨

那怎样才能返回4呢?就是说调用导出类的wh