多态中成员变量、成员方法、静态方法访问的特点
特点
-
成员变量:编译看左边(父类),运行看左边(父类)
-
成员方法:编译看左边(父类),运行看右边(子类) (动态绑定)
-
静态方法:编译看左边(父类),运行看左边(父类)(静态和类相同,算不上重写,所以访问还是左边的)
-
总结:只有非静态的成员方法才会编译看左边,运行看右边。
代码
public class Demo2_polymorphic {
public static void main(String[] args) {
Father f = new Son2 ( ); //父类引用指向子类
System.out.println (f.num);
f.print ( );
f.Method ( );
System.out.println ("-----------------");
Son2 son = new Son2 ( );
System.out.println (son.num); //自己有就不用父类的,数据类型是son自己有就输出20
son.print ( );
son.Method ( );
}
}
/*成员变量:编译看左边(父类),运行看左边(父类)
成员方法:编译看左边(父类),运行看右边(子类) 动态绑定
静态方法:编译看左边(父类),运行看左边(父类)(静态和类相同,算不上重写,所以访问还是左边的)
总结:只有非静态的成员方法才会编译看左边,运行看右边*/
class Father { //父类
int num = 10; //成员变量
public void print() { //成员方法
System.out.println ("father");
}
public static void Method() { //静态方法
System.out.println ("father static method");
}
}
class Son2 extends Father { //子类
int num = 20; //成员变量
public void print() { //成员方法
System.out.println ("zilei");
}
public static void Method() { //静态方法
System.out.println ("son static method");
}
}
结果
10
zilei
father static method
-----------------
20
zilei
son static method
内存图方便理解:
成员变量
- 主方法main,父类,子类分别加载进内存。
- 成员变量进堆存,在super调用父类的成员变量,赋地址,this指针由子类成员变量指向父类。
- 主方法进栈,赋地址。
成员方法
附:多态中向上转型和向下转型