面相对象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接口
}
}
。。结果


浙公网安备 33010602011771号