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呢?求解求解。

解决方案 »

  1.   

    程序输出的变量wh是父类Circle的。
      

  2.   

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

  3.   


    这种upcast(向上造型) 
    1.域:调用父类属性 
    2.方法:调用子类方法 在java多态中重写,只是子类重写父类方法并覆盖,而属性这不存在多态。。即变量在子类,父类中都是独立存在的调用规则如上:这是sun公司的规定,必须是这样的语法使用者只要会用就ok了,
    《thinking in java 4th》
      

  4.   

    因为子类Unicycle没有重写父类的ride()方法,于是调用到的就是父类的ride方法,而父类的ride方法返回的是父类的wh,于是,它就是0而不是4了 
      

  5.   

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

  6.   

    属性不存在多态,毋庸置疑。。使用的属性(wh),是基类还是之类这要看你是用基类对象调用属性,还是用子类对象调用属性你的ride()方法不管你传入的是哪个对象,返回的对象都是Cycle,这个你可能没注意到(这个你可以这样试下Unicycle 里面的wh改成wh1 然后再System.out.println(" 车轮数:"+c.ride(new Bicycle()).wh1);
    编译都通不过,,说明这个属性不是他拥有的)这样可以得到这个结果:
    This is in The class Cycle!
    This is in The class Cycle!
    This is in The class Bicycle!
    Class: Cycle@d9f9c3
     车轮数:2
    This is in The class Cycle!
    This is in The class Unicycle!
    This is in The class Cycle!
    This is in The class Unicycle!
    Class: Unicycle@1a46e30
     车轮数:4
    public static void main(String[] args){
    Cycle c = new Cycle();
    System.out.println(" 车轮数:"+((Bicycle)c.ride(new Bicycle())).wh);
    Unicycle c1 = new Unicycle();
    System.out.println(" 车轮数:"+((Unicycle)c1.ride(new Unicycle())).wh);
    }
    }
    class Cycle{
    int wh = 0;
    public Cycle(){
    System.out.println("This is in The class Cycle!");
    }
    public Object ride(Object o){
    System.out.println("Class: "+ this);
    return o;
    }
    }
      

  7.   

    对的,在导出类中重写ride方法就可以了