java中的多态体现在一个变量可以引用多个不同类对象,但前提是这些不同的类必须有相同的父类。从而该变量可以且只能调用每个不同对象之间的公共操作集(方法)。
在java中,父类变量可以引用子类对象,即Person p = new Chinese();
但是变量p只能调用共同的成员属性和方法。当子类中已经覆盖继承的方法时,父类的变量调用的将是子类中已重写(Overriding)的方法,重写Overriding是父类与子类之间多态性的一种表现。
代码:
public class Dog {
private String getName(){
return "Dog";
}
public String bark(){
return "wang-wang";
}
public void call(){
System.out.println("It's "+getName()+" "+bark());
}
}
public class MiniDog extends Dog{
private String getName(){
return "Mini";
}
public String bark(){
return "woo-woo";
}
}
public class Test {
public static void main(String args[]) {
Dog d = new MiniDog();
d.call();
MiniDog md = new MiniDog();
md.call();
}
}
=======================================================================================
运行结果是:
It's Dog woo-woo
It's Dog woo-woo
解释:
(1)d调用的是自己的call()方法和getName()方法,因为bark()被重写覆盖所以调用的是子类的。注意:getName()方法没有被重写,因为是父类私有的,对子类来说是不可见的,被隐藏起来。
(2)第二个名字还是Dog是因为子类没有实现call()方法,用的是父类的call(),在call()里调用的还是父类的getName()。