多态

多态

在java里面对于多态的核心表现主要有以下两点:

1.方法的多态性:

  方法的重载:同一个方法名称可以根据参数的类型及个数不同调用不同的方法体;

  方法的覆写:同一个父类方发,可能根据实例化的子类不同也有不同的实现,

2.对象的多态性(前提:方法的覆写):

   【自动 90%】对象的向上转型:父类 父类对象=子类实例化;

   【强制 1%】对象的向下转型:父类 子类对象=(子类)父类实例;

     9%是不进行转型,例如:String,

范例:回顾一个简单程序

 1 class A{
 2     public void print(){
 3         System.out.println("【A】");
 4     }
 5 }    
 6 class B extends A{
 7     public void print(){
 8         System.out.println("【B】");
 9     }    
10 }
11 public class Newbegin{
12     public static void main(String args[]) {
13         B b=new B();//实例化子类对象
14         b.print();//调用被覆写过的方法
15 
16     }    
17 } 

范例:实现向上转型

 1 class A{
 2     public void print(){
 3         System.out.println("【A】");
 4     }
 5 }    
 6 class B extends A{
 7     public void print(){
 8         System.out.println("【B】");
 9     }    
10 }
11 public class Newbegin{
12     public static void main(String args[]) {
13         A a=new B();//向上转型
14         a.print();//调用被覆写过的方法
15     }    
16 } 

 

不管是发生了向上转型,那么其核心的本质还是在于:你使用了那一个子类(new 在哪里)而后你调用的方法是否被子类覆写了。

向下转型:就是将父类对象变为子类对象,但是在这之前需要明确一个核心概念,为什么需要向下转型?

当你需要使用到子类扩充操作的时候就要使用向下转型。

范例:向下转型

 1 class A{
 2     public void print(){
 3         System.out.println("【A】");
 4     }
 5 }    
 6 class B extends A{
 7     public void print(){
 8         System.out.println("【B】");
 9     }    
10     public void funB(){//这个方法只有子类有
11         System.out.println("【B】funB方法执行了");
12     }
13 }
14 public class Newbegin{
15     public static void main(String args[]) {
16         A a=new B();//向上转型
17         a.print();//调用被覆写过的方法
18         //这个时候父类能够调用的方法只能是自己本类定义好的方法,如果想调用子类的方法,。 
19         B b=(B)a;//向下转型
20         b.funB();
21     }    
22 } 

如果想要向下转型,就必须要先向上转型,否则转型会出现:ClassCastException

 

向下转型可能存在隐患,那么就要依靠instanceof关键字来实现了。

instanceof返回的是boolean类型。

范例:观察instanceof的使用

 1 class A{
 2     public void print(){
 3         System.out.println("【A】");
 4     }
 5 }    
 6 class B extends A{
 7     public void print(){
 8         System.out.println("【B】");
 9     }    
10     public void funB(){//这个方法只有子类有
11         System.out.println("【B】funB方法执行了");
12     }
13 }
14 public class Newbegin{
15     public static void main(String args[]) {
16         A a=new B();//实例化父类
17         System.out.println(a instanceof A);
18         System.out.println(a instanceof B);
19         //以后对于子类的特殊操作尽量慎用
20         if(a instanceof B){//避免了ClassCastException的问题,
21             B b= (B)a;
22             b.funB();
23         }
24     }    
25 } 

 

思考一下这种转换,有什么意义?

范例:要求定义一个方法,而这个方法可以接受Person类的所有实例。并调用Person类的方法

 

 1 class Person{
 2     public void takeoff(){//
 3         System.out.println("脱掉****");
 4     }
 5 }
 6 class Student extends Person{
 7     public void takeoff(){//
 8         System.out.println("一件件脱掉****");
 9     }
10 }    
11 class Worker extends Person{
12     public void takeoff(){//
13         System.out.println("直接卷了");
14     }
15 }
16 public class Newbegin{
17     public static void main(String args[]) {
18         in(new Student());
19         in(new Worker());
20 
21     }    
22     public static void in(Person per){
23         per.takeoff();//所有人都要进行。
24     }

 

 

1.操作参数统一,用向上转型来,对象的多态核心在于方法的覆写

2.通过对象的向上转型可以实现,接收参数的统一,而向下转型可以实现子类扩充方法的调用(一般不操作)

3.两个没有关系的是不能进行转型。会ClassCastException。

 

posted on 2019-02-18 22:08  朽木zidiao  阅读(119)  评论(0编辑  收藏  举报

导航