上面是理论,下面看几个示例(示例来自网络):

  Java代码

view plaincopy to clipboardprint?
public class Father { 
  public void method() { 
    System.out.println("父类方法,对象类型:" + this.getClass()); 
  } 

   
public class Son extends Father { 
  public static void main(String[] args) { 
    Father sample = new Son();//向上转型 
    sample.method(); 
  } 
}

  声明的是父类的引用,但是执行的过程中调用的是子类的对象,程序首先寻找子类对象的method方法,但是没有找到,于是向上转型去父类寻找

  Java代码

public class Son extends Father { 
  public void method() { 
    System.out.println("子类方法,对象类型:" + this.getClass()); 
  } 
   
  public static void main(String[] args) { 
    Father sample = new Son();//向上转型 
    sample.method(); 
  } 
}

  由于子类重写了父类的method方法,根据上面的理论知道会去调用子类的method方法去执行,因为子类对象有method方法而没有向上转型去寻找

  前面的理论当中已经提到了java的绑定规则,由此可知,在处理java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。

  代码如下:

  Java代码

public class Father { 
 
  protected String name="父亲属性"; 
   
  public void method() { 
    System.out.println("父类方法,对象类型:" + this.getClass()); 
  } 

   
public class Son extends Father { 
  protected String name="儿子属性"; 
   
  public void method() { 
    System.out.println("子类方法,对象类型:" + this.getClass()); 
  } 
   
  public static void main(String[] args) { 
    Father sample = new Son();//向上转型 
    System.out.println("调用的成员:"+sample.name); 
  } 
}

  结论,调用的成员为父亲的属性。