多态性——对象的多态性

来源:互联网 发布:淘宝宝贝被管控怎么办 编辑:程序博客网 时间:2024/05/17 17:44

一、在java中主要通过以下两种方式实现多态:

1、方法的重载和覆写(具体的请查看以前的文章)

2、对象的多态性


二、对象的多态性

对象的多态性主要分两种类型,向上转型和向下转型

1、对象的向上转型

(1)格式: 父类  父类对象 = 子类实例;

(2)代码示例如下:

package lkp;//定义一个类Aclass A{public void fun1(){System.out.println("A");}public void fun2(){this.fun1();}}//定义一个子类B,继承Aclass B extends A{public void fun1(){//覆写父类中的fun1方法System.out.println("B");}public void fun3(){//子类自己定义的方法System.out.println("C");}}class Test{public static  void main(String args []){B b =new B();//定义子类实例化对象A a = b;  //向上转型  , 子类——》父类a.fun1();//次方法是被子类覆写过}}
(3)注意

使用父类对象调用fun1方法,实际上调用的方法是被子类覆写过的方法

即如果对象发生了向上转型,所调用的方法一定是被子类覆写过的方法


2、对象的向下转型

(1)格式:子类  子类对象 = (子类) 父类实例

(2)代码示例如下:

package lkp;//定义一个类Aclass A{public void fun1(){System.out.println("A——1");}public void fun2(){this.fun1();}}//定义一个子类B,继承Aclass B extends A{public void fun1(){//覆写父类中的fun1方法System.out.println("B——1");}public void fun3(){//子类自己定义的方法System.out.println("B——3");}}class Test{public static  void main(String args []){A a = new B();//向上转型B b = (B)a;//向下转型b.fun1();//调用被覆写的方法b.fun2();//调用父类的方法b.fun3();//调用子类自己定义的方法}}
(3)注意

向上转型,实现的是子类中的方法。

在进行对象的向下转型前,必须首先发生对象的向上转型,否则将出现对象转换异常。

3、对象多态性的应用

package lkp;//定义一个类Aclass A{public void fun1(){System.out.println("A——1");}public void fun2(){this.fun1();}}//定义一个子类B,继承Aclass B extends A{public void fun1(){//覆写父类中的fun1方法System.out.println("B——1");}public void fun3(){//子类自己定义的方法System.out.println("B——3");}}//定义一个子类C,继承Aclass C extends A{public void fun1(){//覆写父类的fun1方法System.out.println("C——1");}public void fun4(){//子类自己定义的方法System.out.println("C——4");}}class Test{public static  void main(String args []){fun(new B());//传递B类的实参,产生向上转型fun(new C());//传递C类的实参,产生向上转型}//未使用多态性//public static void fun(B b){//b.fun1();//}//public static void fun(C c){//c.fun1();//}public static void fun(A a){//接收父类的对象a.fun1();}}
未使用多态性的程序,当产生一个A类的子类时,fun()方法就要重载一次。则每次扩充子类都必修修改类本身

使用多态性的程序,此时由于在fun()方法中使用了对象的多态性,所以可以接受任何的子类对象,这样无论

子类如何增加,fun()方法都不需要做任何修改。因为一旦发生对象的向上转型关系后,调用的方法一定是被子类

覆写过的方法。

0 0
原创粉丝点击