面相对象7——多态
。Java引用变量类型
。。编译时类型:由声明变量时使用的类型决定
。。运行时类型:由实际赋给该变量的对象决定
。当编译时类型和运行时类型不一致,则可能出现所谓的多态(Polymorphism)
多态性
。示例
package test; import javax.security.auth.Subject; class BaseClass{ public int book=6; public void base() { System.out.println("父类普通方法"); } public void test() { System.out.println("父类被覆盖的方法"); } } public class Test extends BaseClass{ public String book="book1"; public void test() { System.out.println("子类的覆盖父类的方法"); } public void sub() { System.out.println("子类普通方法"); } /** * @description:main方法 * @param args */ public static void main(String[] args) { /*编译时类型与运行时类型相同*/ BaseClass bc=new BaseClass(); System.out.println(bc.book); bc.base();//父类的base方法 bc.test();//父类test方法 System.out.println("---------------"); /*编译时类型与运行时类型相同*/ Test test=new Test(); System.out.println(test.book); test.base();//父类的base方法 test.test();//子类的test方法 System.out.println("---------------"); /*编译时类型(BaseClass)与运行时类型(Test)不同,发生多态*/ BaseClass ploymophicBc=new Test(); System.out.println(ploymophicBc.book);//访问父类对象的实例变量 ploymophicBc.base(); ploymophicBc.test();//执行Test中的test方法,发生多态 ((Test) ploymophicBc).sub();//BaseClass没有提供sub方法,进行强转 } }
。结果
。分析
。。bc和ploymophicBc同样是BaseClass类型,调用同一个方法test(),但在运行时所呈现的结果不同
。。这种相同类型的变量、调用同一个方法时呈现出来多种不同的行为特征,即为多态
。。执行ploymophicBc.sub();时,虽然该引用变量含有sub方法,但其编译时类型BaseClass,则无法调用Test当中的sub方法。
引用变量的强制类型转换
。引用类型就之间的转换只能在具有继承关系的两个类型之间。
。。如上实例当中,若要把一个父类实例转换成子类实例,则该对象必须实际上为父类实例才可以(即编译类型为父类类型(BaseClass),运行时类型为子类(Test))。否则抛出ClassCastException异常
instanceof运算符
。强制类型转换之前,通过instanceof运算符判断能否转换,从而避免ClassCastException异常,进而使程序更加健壮
。引用变量类型 instanceof 类(接口):判断前面的对象是否是后面的类或其子类的实例;如果是返回true,否则返回false
。注意:instanceof前面的操作数的编译时类型与后面的类要么是相同类型,要么与后面的类具有父子继承关系,否则会发生编译错误
。举个例子
。。实例
package test; public class InstanceofTest { public static void main(String[] args) { //hello的编译类型为Object,Object是所有类的父类 Object hello="hello"; System.out.println("字符串是否是Object的实例:"+(hello instanceof Object)); System.out.println("字符串是否是String类的实例:"+(hello instanceof String)); System.out.println("字符串hello是否是Math类的实例:"+(hello instanceof Math)); System.out.println("字符串hello是否是Comparable接口的实例:"+(hello instanceof Comparable));//String实现了Comparable接口 } }
。。结果