测试: 如果一个方法的返回值类型是父类,那么能否返回一个子类对象.(该父类不管是类,抽象类还是接口)
       返回值类型为什么能是父类

解决方案 »

  1.   

    public class Fu {
    int a= 1;
    public void show(){
    System.out.println("父类的方法");
    }}
    public class Zi extends Fu{
    int a=2;
    public void show(){
    System.out.println("子类的方法");
    }}

    public class Test {
    public static void main(String[] args) {
     Fu f =new Fu();
     Zi z= new Zi(); 
     
     System.out.println(test(z).a);      //打印出来的是子类的对象变量a
     

     
    }

    public static Fu test(Zi zi){
    return zi;
    }}
       
      

  2.   

    我传递进去的参数,不管父类还是子类, 返回的对象变量打印出来永远是父类的对象变量a =1
    System.out.println(test(z).a);      //打印出来的是子类的对象变量a 
      这一段写错了,实际打印出来的是父类的对象变量a,  但我传递进去的是子类的对象z
      

  3.   

    你的test方法返回的是父类类型,打印出来当然是父类的变量。
    如果你想返回子类对象,可以用强制转换
    System.out.println( ((Zi) test(z)).a);
      

  4.   

    return改成Zi
      

  5.   

    楼主对继承的理解稍微有些小偏差,对于子类和父类如果具有相同的变量名,那么父子类之间的变量是相互隐藏的(这个跟函数不同,函数是覆盖,而变量不是),也就是说,父类只能找到父类的a、子类只能看到子类的a。所以当楼主返回一个父类(实际上是子类),再用父类去访问a变量时,由于上面说的隐藏关系,这时父类只能找到父类的a。class Fu {
    public int a = 2;
    public Fu(){
    a = 2;
    }

    public void show(){
    System.out.println(this.a);
    }
    }class Zi extends Fu{
    public Zi(){
    a = 1;
    }
    @Override
    public void show(){
    System.out.println(this.a);
    }
    }楼主可以通过以上方式,实现返回父类,并且再通过父类找到子类的a变量。