封装、继承、多态是面向对象的三大特征,在Java中什么是多态?
Java引用变量有两种类型,分别是编译时类型和运行时类型。何为编译时类型,编译时类型就是由声明该变量时使用的类型决定,而运行时类型是由实际赋给该变量的对象决定
的,也就是说如果编译时类型和运行时类型不一致时,就可能出现上面提到的多态。
我们看下下面的程序:
class BaseClass { public String name = "BaseClass"; public void base() { System.out.println("父类的方法"); } public void test() { System.out.println("父类的方法,等会儿会被子类重写"); } } public class Main extends BaseClass { public String name = "Main"; public void test() { System.out.println("子类重写父类的方法"); } public void main() { System.out.println("子类的方法"); } public static void main(String[] args) { BaseClass mainClass = new Main();//1 System.out.println(mainClass.name);//2 mainClass.test();//3 // mainClass.main();//4(报错) } }
上面定义一个父类BaseClass,子类Main继承了父类BaseClass,并在子类中重写了父类的方法test方法。
OK,先看下输出结果:
BaseClass
子类重写父类方法
从上面程序可以很快的看出在创建对象时,编译时类型(BaseClass)和运行时类型(Main)并不相同,在子类Main覆盖了父类的test方法时,调用该引用变量的test方法,实际
执行的是Main类中覆盖后的test方法,这时就出现了多态。子类是一种特殊的父类,因此Java允许把一个子类对象直接赋值给一个父类引用变量,无须任何类型转换,或者被称
为向上转型,向上转型由系统自动完成。在上面的 mainClass引用变量的编译时类型是BaseClass,运行时类型是Main,当运行时调用该引用变量的方法时,其方法行为总是表
现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法是呈现出多种不同的行为特征,这就是多态。在上面代码4处,这行
代码会在编译时报错,这是因为它的编译时类型为BaseClass,因此无法调用main这个方法。
在编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,如果需要让这个引用变量调用它运行时类型的方法的话,可以用强制类型转换成
运行时类型。在进行强制类型转换时需要注意以下几种情况:
1、基本类型之间的转换只能在数值类型之间进行,这边的数值类型包括整型、字符型和浮点型。需要注意的是,数值类型和布尔类型之间不能进行类型转换。
2、引用类型之间的转换只能在具有继承关系的两个类型之间进行。
在进行类型转换之前,通常建议使用instanceof运算符来判断是否可以成功转换,来避免出现ClassCastException异常。instanceof用法如下
if(str instanceof String){
String s=(String)str;
}
instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类也可以是接口。
转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/43868569 情绪控_