今天看完李刚老师的《疯狂java讲议》,才终于弄明白面向对象的多态概念,分享一下:
//多态(Polymorphism)
多态:相同类型的引用变量,调用同一个方法时呈现出多种不同的行为特征。
对象的实例变量不具备多态性。
Java引用变量有两个类型:编译时类型,运行时类型
编译时类型由声明该变量时使用的类型决定
运行时类型由实际赋给该变量的对象决定
如果编译时类型和运行时类型不一致,就可能出现多态(Polymorphism)
//实例,多态 class BClass{ public int book=6; public void base(){ System.out.println("父类的普通方法"); } public void test(){ System.out.println("父类的被覆盖的方法"); } } public class SClass extends BClass{ public String book="轻量级Java EE"; public void test(){ System.out.println("子类覆盖父类的方法"); } public void sub(){ System.out.println("子类的普通方法"); } public static void main(String[] args){ BClass bc=new BClass(); System.out.println(bc.book); bc.base(); bc.test(); SClass sc=new SClass(); System.out.println(sc.book); sc.base(); sc.test(); //编译时类型(BClass)和运行类型(SClass)不一样,多态发生 BClass ploymophicBc=new SClass(); System.out.println(ploymophicBc.book); ploymophicBc.base(); ploymophicBc.test();//BClass类型的ploymophicBc调用的是子类的test()方法,与同样是BClass类型的bc调用父类test()方法不同,表现出面向对象的多态特征。 //BClass类没有提供sub()方法,下句报错 //ploymophicBC.sub();//可以通过反射来执行该方法 /* ---------- 运行Java程序 ---------- 6 父类的普通方法 父类的被覆盖的方法 轻量级Java EE 父类的普通方法 子类覆盖父类的方法 6 父类的普通方法 子类覆盖父类的方法 输出完毕 (耗时 1 秒) - 正常终止 */ } }