Human h; if() h = new CH(); else h = new JP();Human 两个子类CH JP : 在运行之前,无法确定h的具体类型。
多态是面向对象最重要的性质。 请楼主看我的代码解释class A { public void dosomething(){ System.out.println("do is done by A"); } }class B extends A{ public void dosomething(){ System.out.println("do is done by B"); } }class C extends A{ public void dosomething(){ System.out.println("do is done by C"); } }public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub A ptr1 = new A(); //ptr1的静态类型为A,动态类型为A ptr1.dosomething(); // (1) ptr1 = new B(); //程序运行至此处,ptr1的动态类型变为B; ptr1.dosomething(); // (2) ptr1 = new C(); //程序运行至此处,ptr1的动态类型变为C; ptr1.dosomething(); // (3) //从程序段(1),(2),(3)中可以看出,调用方法始终不变(ptr1.dosomething),可以认为可以保证客户端代码不变 //你可以修改dosomething的内容的同时不影响客户端代码的变化,这样就将变化和不变的 //内容实现了解耦,具体说来就是将“策略和实现解耦” }}
举个类子:如 张大爷说了句吃饭 张大爷的几个儿子和女儿都来了
相当于 张大爷发出一条通知 张大爷的几个儿子和女儿 自动响应这条消息 这就是多态
人 猫 狗 都是动物
现在调用 动物.吃饭() 的方法 人 猫 狗可以
在调用 动物.sayHello()的方法 人可以,猫、狗不可以
这就是多台的运行期行为
他是随着你的父类的指针指向你子类的引用去决定的
if() h = new CH();
else h = new JP();Human 两个子类CH JP :
在运行之前,无法确定h的具体类型。
请楼主看我的代码解释class A {
public void dosomething(){
System.out.println("do is done by A");
}
}class B extends A{
public void dosomething(){
System.out.println("do is done by B");
}
}class C extends A{
public void dosomething(){
System.out.println("do is done by C");
}
}public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
A ptr1 = new A(); //ptr1的静态类型为A,动态类型为A
ptr1.dosomething(); // (1)
ptr1 = new B(); //程序运行至此处,ptr1的动态类型变为B;
ptr1.dosomething(); // (2)
ptr1 = new C(); //程序运行至此处,ptr1的动态类型变为C;
ptr1.dosomething(); // (3)
//从程序段(1),(2),(3)中可以看出,调用方法始终不变(ptr1.dosomething),可以认为可以保证客户端代码不变
//你可以修改dosomething的内容的同时不影响客户端代码的变化,这样就将变化和不变的
//内容实现了解耦,具体说来就是将“策略和实现解耦”
}}
我知道C++多态的实现就是使用了虚函数指针和对应的虚函数表来实现。至于java,不太清楚。
多态为什么不体现在变量上,直接原因是语言底层没有提供相应的机制,根本原因不知道。
do is done by A
do is done by B
do is done by C
可以看出,语言完全知道那种类型在调用。