编写一个具有两个方法的基类base, 并在第一个方法内调用第二个方法;然后编写一个派生类derived ,并覆盖父类中的第二个方法;产生一个derived类对象,将它向上类型转化(即转化为base类型),并调用第一个方法。验证并解释运行结果!

解决方案 »

  1.   

    产生一个derived类对象向上类型转化(即转化为base类型),调用第一个方法(父类的),在第一个方法中调用了第二个方法(还是父类的)。产生的derived类对象向上类型转化了,当然调父类的方法了啊!
      

  2.   

    刚刚做了一个测试public class Test {
    public static void main(String argc[]){
    ((base)(new derived())).t1();
    }
    }class base{
    public void t1(){ 
    System.out.println("base t1");
    t2();
    }
    public void t2(){
    System.out.println("base t2");
    }
    }class derived extends base{

    public void t2(){
    System.out.println("derived! t2");
    }
    }输出的结果是:
    E:\java>javac Test.javaE:\java>java Test
    base t1
    derived! t2想不通啊!!
      

  3.   


    public class BaseUse {
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Base s = new Derived();
    s.t1(); 
    }
    } class Base{ 
    public void t1(){ 
    System.out.println("base t1"); 
    t2(); 

    public void t2(){ 
    System.out.println("base t2"); 

    } class Derived extends Base{ 
    // public void t1(){ 
    // System.out.println("derived! t1"); 
    // t2(); 
    // } 
    public void t2(){ 
    System.out.println("derived! t2"); 


    1.子类转换成父类不用进行强制转换(楼上的^_^),小变大不用强制转换.
    2.你将子类向上转换成父类,也就相当于父类的引用又指向了子类这个对象,这时实际的对象还是子类!
    3.你先调用的t1();这个方法只是Derived被继承然后隐藏起来了,实际上调用的就是你那继承过来的t1,当你把我上面这个程序屏蔽的部分运行之后,你就会发现它所调用的t1就是自己的t1()(子类的t1());
      

  4.   

    屏蔽时的输出结果:
    base t1 
    derived! t2 
    重写t1()后的输出结果:
    derived! t1 
    derived! t2