多态:
下面程序中的BaseClass ploymophicBc = new SubClass();,这个ploymophicBc引用变量的编译时类型是BaseClass 而运行时是SubClass,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。
- class BaseClass
- {
- public int book = 6;
- public void base()
- {
- System.out.println("父类的一般方法");
- }
- public void test()
- {
- System.out.println("父类要被继承的方法");
- }
- }
- public class SubClass extends BaseClass
- {
- public String book="haha";
- public void test()
- {
- System.out.println("子类覆盖父类的方法");
- }
- public void sub()
- {
- System.out.println("子类的特有方法");
- }
- public static void main(String[] args)
- {
- BaseClass bc = new BaseClass();
- System.out.println(bc.book);
- bc.base();
- bc.test();
- SubClass sc = new SubClass();
- System.out.println(sc.book);
- sc.base();
- sc.test();
- //**************************************
- BaseClass ploymophicBc = new SubClass();
- System.out.println(ploymophicBc.book);//6
- ploymophicBc.base();//父类的一般方法
- ploymophicBc.test();//子类覆盖父类的方法
- //**************************************
- //因为BaseClass类没有提供sub方法,所以下面代码编译时会出错
- //ploymophicBc.sub();
- }
- }
另注:同一方法中不能定义名字相同的变量,类型不同也不行。
引用变量在编译阶段只能调用编译时类型所具有的方法,但运行时则执行他运行时类型所具有的方法。因此编写java代码时,引用变量只能调用声名该变量时所用类里包含的方法。例如:Object p = new Person(); 这个变量p只能调用Object类中的方法,而不能调用Person类中的方法。
使用引用变量的强制类型转换前,最好先用instanceof运算判断是否可以成功转换,这样更安全(否则产生ClassCastException)
例:
if(objPri instanceof String)
{
String str = (String)objPri;
}
instanceof 运算符的前一个操作数通常是一个引用类型变量,后一个数通常是一个类(也可以是接口),他用于判断的对象是否是后面的类,或者其子类、实现类的实例。
注:
instanceof操作符前面的操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则编译错误。