多态中类成员调用时的特点

来源:互联网 发布:淘宝首页添加视频代码 编辑:程序博客网 时间:2024/06/05 09:25

先看下面的代码:

class Fu
{
 int age = 5;
 public void method1(){
  System.out.println("fu method1");
 }
 public void method2(){
  System.out.println("fu method2");
 }
}
class Zi extends Fu
{

int age = 8;
 public void method1(){
  System.out.println("zi method1");
 }
 public void method3(){
  System.out.println("zi method3");
 }
}
public class a
{
 public static void main(String aegs[]){
  Zi zi = new Zi();   //没有多态的情况
  zi.method1();
  zi.method2();
  zi.method3();
 }
}

运行结果是什么?

在看有多态的情况一:

public class a
{
 public static void main(String aegs[]){
  Fu fu = new Zi();
  fu.method1();
  fu.method2();
  fu.method3();
 }
}

运行结果是:编译失败

情况二:

public class a
{
 public static void main(String aegs[]){
  Fu fu = new Zi();
  fu.method1();
  fu.method2();
 }
}

运行结果是:zi method1             fu method2

先说情况一,用父类的引用去调用method3,Fu类中并不存在这个方法,编译失败。

情况二,父类的引用指向的是子类对象,在内存中存在的是子类对象,method1被子类覆写过,运行结果是zi method1。

总结:

成员函数在多态调用时的特点

编译时期:参阅引用型变量所属的类是否有该方法。

运行时期:参阅对象实例所属的类。

编译看左边,运行看右边。

 

下面在来看看成员变量的特点:

public class a
{
 public static void main(String aegs[]){
  Fu fu = new Zi();
  System.out.println(fu.age);
 }
}

输出结果是:5

因为在new Zi()的时候,会先实例化父类的实例,那么成员变量已经存在内存中了。

多态中成员变量的调用,编译和运行都看左边。