你的位置:首页 > Java教程

[Java教程]java中多态成员的访问特点

多态成员变量的特点:

 1 class DuotaiTest2 2 { 3   public static void main(String[] args)  4   { 5     A a = new A(); 6     A b1 = new B(); 7     B b2 = new B(); 8     System.out.println(a.name); 9     System.out.println(a.a);10     System.out.println(b1.name);11     System.out.println(b1.a);//子类向上转型成父类,再调用子类特有成员变量,编译报错12     System.out.println(((B)b1).name);13     System.out.println(((B)b1).b);14     System.out.println(b2.name);15     System.out.println(b2.b);16   }17 }18 19 class A20 {21   String name = "A";//父子类同名变量22   int a = 1;//父类特有变量23 }24 25 class B extends A26 {27   String name = "B";28   int b = 2;//子类特有变量29 }30 31 /*32 总结:33   调用成员变量时, 类变量.成员变量 语句在执行时依据类变量类型进行选择入口34 */

运行结果:

  

图解:

  

  java中,子类的实例对象在堆内存中的存放应如图所示,既有子类的成员变量,又有父类的成员变量;

  同一对象可以有多态,当父类变量指向时,从A入口进入,可以访问父类的所有成员变量;当子类变量指向时,从B入口进入,可以访问子类的所有成员变量和父类非同名变量;

总结:  调用成员变量时, 类变量.成员变量 语句在执行时依据类变量类型进行选择入口


多态(非静态)成员函数的特点:
  我写了一个“重写”过程的思想本质,那个可以解释多态(非静态)成员函数的特点原理。
图解:

  

  java中,实例对象即使被向上转型成父类,其实其在内存中的存储形式依旧是子类实例对象(转型...有讲),基于这个结论就好解释了

    多态是将子类实例对象向上转型后赋给父类变量,其在内存中依旧是子类实例对象,在通过该变量调用方法时,JVM会通过判断该变量指向的实例对象在内存的形式来确定进入方法区的那块去寻找方法

    因为转型后类型不变,所以JVM还是进入Child的方法区寻找方法,而Child自己定义了show()方法,所以调用了子类的show()

总结:
  (非静态)成员函数的访问原则是通过判断调用对象在内存中的形式而进行的,是子类实例则运行子类方法,是父类示例则运行父类方法,与变量类型无关

多态静态方法的特点:
  
 1 /* 2   需求:设计一个简单的java程序,确定多态中静态方法的访问特点 3   思路:设计一对子父类,创建子类实例,子类变量和父类变量同时指向该实例,通过不同变量调用查看结果 4 */ 5 class DuotaiTest3 6 { 7   public static void main(String[] args)  8   { 9     Child c = new Child();10     Father f = c;11     c.show();12     f.show();13   }14 }15 16 class Father17 {18   static void show(){19     System.out.println("Father show run.");20   }21 }22 23 class Child extends Father24 {25   static void show(){26     System.out.println("Child show run.");27   }28 }29 30 /*31 总结:32   同一个实例对象,不同类型的变量指向,通过不同变量调用会得到不同的结果表明:33   静态方法调用的判断是依据调用者的变量类型而进行的。34   类变量.方法 语句中,类变量类型决定着JVM在静态方法区的入口选择35 */

总结:  同一个实例对象,不同类型的变量指向,通过不同变量调用会得到不同的结果表明:  静态方法调用的判断是依据调用者的变量类型而进行的。  类变量.方法 语句中,类变量类型决定着JVM在静态方法区的入口选择