示例代码:
package org.zeng.duotai;
public class Test {
public static void main(String args[]) {
Animal animal = new Animal();
Dog dog = new Dog();
animal.getName();
Animal.getWeight();
System.out.println("---------------------------------------------");
dog.getName();
Dog.getWeight();
System.out.println("------------下面是多态的现象------------------------");
Animal a = new Dog(); // 父类引用指向子类对象
a.getName();
a.getWeight();
System.out.println("============下面是对态的应用=====================");
test(a);
}
public static void test(Animal a) {
a.getName();
}
}
class Dog extends Animal {
public static void getWeight() { // 重写父类方法,静态方法
System.out.println("The Class is Dog! and method is static");
}
public void getName() { // 重写父类方法,成员方法
System.out.println("The Class is Dog! and method is dynamic");
}
}
class Animal {
public static int weight = 100; // 静态属性
public String name = "animal"; // 成员属性
public static void getWeight() { // 静态方法
System.out.println("The Class is Animal! and method is static");
}
public void getName() { // 成员方法
System.out.println("The Class is Animal! and method is dynamic");
}
}
运行结果为:
The Class is Animal! and method is dynamic
The Class is Animal! and method is static
---------------------------------------------
The Class is Dog! and method is dynamic
The Class is Dog! and method is static
------------下面是多态的现象------------------------
The Class is Dog! and method is dynamic
The Class is Animal! and method is static
============下面是对态的应用=====================
The Class is Dog! and method is dynamic
总结:产生多态的三个条件:继承、重写、父类引用指向子类对象
1.成员变量:编译看左边(父类,一定要有),运行时(调用时)看左边(父类,子类覆盖了父类的成员变量时,打印出的就是父类的变量值)
2.成员方法:编译看左边(父类,一定要有),运行时(调用时)看右边(子类,子类覆盖了父类的成员方法时,调用的是子类的方法);
3.静态方法:编译看左边(父类,一定要有)(重写), 运行时(调用时)看左边(父类的)
也就是说,类的属性是没有多态性的(可以自己测试),静态的方法也是没有多态性的,都没有动态绑定,只有成员方法才会有动态绑定,才会产生多台现象(事实上多态性产生的条件之一,重写,就限制了属性不能产生多态)
具体深层次的原因可以从内存分配和java动态绑定机制这2方面入手深究。以后空闲时,再做深究。