Java基础学习——多态
多态是面向对象中的一个重要概念,主要分为以下两种类型:
- 向上转型:
子类对象——>父类对象 - 向下转型:
父类对象——>子类对象
转型格式如下:
对象向上转型:父类 父类对象 = 子类实例;
对象向下转型:子类 子类对象 = (子类)父类对象;
先创建一个父类A
class A{ // 定义类A
public void fun1(){ // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
}
public void fun2(){
this.fun1() ; // 调用fun1()方法
}
}
再创建A的一个子类B
class B extends A{
public void fun1(){ // 此方法被子类覆写了
System.out.println("B --> public void fun1(){}") ;
}
public void fun3(){
System.out.println("B --> public void fun3(){}") ;
}
}
对象的向上转型:
public class PolDemo01{
public static void main(String asrgs[]){
B b = new B() ; // 实例化子类对象
A a = b ; // 向上转型关系
a.fun1() ; // 此方法被子类覆写过
//a.fun3() ;
}
}
这里进行了向上转型,运行结果如下
总结规律:
如果对象发生了向上转型,所调用的方法一定是被子类重写过的方法。如果将//a.fun3() ;这一行取消注释,则会报错,结果如下
对象的向下转型:
public class PolDemo02{
public static void main(String asrgs[]){
A a = new B() ; // 向上转型关系
B b = (B)a ; // 发生了向下转型关系
b.fun1() ;
b.fun2() ;
b.fun3() ;
}
}
结果如下:
这里有一点需要注意:在进行对象的向下转型时,必须首先发生对象的向上转型,否则将出现对象转换异常。
如果将A a = new B() ;改成A a = new A() ;,也就是不先进行向上类型转换,则结果如下
这里可以这样理解,先发生向上类型转换,相当于是由子类去实例化父类的对象,也就是说让父类知道他有这么一个子类,所以再进行向下类型转换不会有问题。
(上面很多知识点引用自《Java开发实战经典》(李兴华著))