class Animal {
int num = 10;
static int age = 20;
public void eat() {
System.out.println("动物吃饭");
}
public static void sleep() {
System.out.println("动物在睡觉");
}
public void run(){
System.out.println("动物在奔跑");
}
}
子类Cat
class Cat extends Animal {
int num = 80;
static int age = 90;
String name = "tomCat";
public void eat() {
System.out.println("猫吃饭");
}
public static void sleep() {
System.out.println("猫在睡觉");
}
public void catchMouse() {
System.out.println("猫在抓老鼠");
}
}
测试类Demo_Test1
class Demo_Test1 {
public static void main(String[] args) {
Animal am = new Cat();
am.eat();
am.sleep();
am.run();
//am.catchMouse();这里先注释掉,等会会说明
//System.out.println(am.name);//这里先注释,待会说明
System.out.println(am.num);
System.out.println(am.age);
}
}
以上的三段代码充分体现了多态的三个前提,即: 1、存在继承关系 Cat类继承了Animal类 2、子类要重写父类的方法 子类重写(override)了父类的两个成员方法eat(),sleep()。其中eat()是非静态的,sleep()是静态的(static)。 3、父类数据类型的引用指向子类对象。 测试类Demo_Test1中 Animal am = new Cat();语句在堆内存中开辟了子类(Cat)的对象,并把栈内存中的父类(Animal)的引用指向了这个Cat对象。 到此,满足了Java多态的的必要三个前提。 ---------------------------------------------------华丽的分割线---------------------------------------------------------------------- 如果再深究一点呢,我们可以看看上面测试类的输出结果,或许对多态会有更深层次的认识。猜一猜上面的结果是什么。 可以看出来 子类Cat重写了父类Animal的非静态成员方法am.eat();的输出结果为:猫吃饭。 子类重写了父类(Animal)的静态成员方法am.sleep();的输出结果为:动物在睡觉 未被子类(Cat)重写的父类(Animal)方法am.run()输出结果为:动物在奔跑