class Car{
    public void Car1(){
        System.out.println("this is car fangfa");
    }
    public static void main(String[]args){
    }
    public int  a = 11;
    public int b = 111;
}public class Bmw extends Car{
    public int a =22;
    public int c =222;
    public void Car1(){
        System.out.println("this is bmw fangfa");
    }
    public static void main(String[]args){
        Car t = new Bmw();  //这个我理解,多态.这里感谢下帮助过我的大侠~
        /*
         这个书上说是强制类型转换,我不太理解.
         既然是用m调用Bmw里Car1方法,那直接Bmw m = new Bmw()不更好吗?干嘛要Bmw m =(Bmw)t,这么麻烦呢?
         或者说有什么好处呢?请各位大侠详细解释下.
        */
        Bmw m =(Bmw)t;
        m.Car1()
        

解决方案 »

  1.   

    用Car t = new Bmw();而不直接Bmw m = Bmw ();主要是要利用多态的带来的好处 
    举个例子,有如下代码: 
    Car t = new Bmw(); 
    Car s = new Toyota(); 
    void method(Car car){car.a1;} 
    这时候,利用多态,t和s都可以作为参数传给method方法,然后在method内部去调用各自的a1方法 
    如果没有多态: 
    Bmw t = new Bmw(); 
    Toyota s = new Toyota(); 
    那么这时候,就无法写一个像上面那样的方法来统一调用不同子类的Car的a1方法 另外,强制类型转换前,通常做一个检查比较好: 
    if (t instanceof Bmw) 
        Bmw m = (Bmw)t; 
    这个例子中t和Bmw的关系比较明显,可能不是很有必要做这个检查,但有些复杂情况下还是很有必要的
      

  2.   


    另外,强制类型转换前,通常做一个检查比较好: 
    if (t instanceof Bmw) 
        Bmw m = (Bmw)t; 
    这个例子中t和Bmw的关系比较明显,可能不是很有必要做这个检查,但有些复杂情况下还是很有必要的
    楼上的这个 instanceof只有 向上传型时才 需要。。的
      

  3.   

    楼上,感谢你的热情回复.
    可能我说的不太清楚,我其实是想问,
       Bmw m =(Bmw)t;
            m.Bmw别的方法我好象突然明白了.
    Car t = new Bmw();  
    Bmw m =(Bmw)t
    m.Bmw别的方法
    意思就是说我用t可以调Bmw其余的方法.(也就是说和父类Car不一样的方法,即没有覆盖的方法.)
      

  4.   

    如果父类Car中有Bmw别的方法(即被Bmw重载的父类方法),那么用父类的引用t是可以调用这些方法的,调用的时候根据dynamic method dispatch原理,子类中相应的重载方法会被调用
    如果父类里本身没有Bmw别的方法重载的方法,那么用父类引用t是无法调用这些方法的