多态向上转型向下转型

Posted huxiaobai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多态向上转型向下转型相关的知识,希望对你有一定的参考价值。

 1 package cn.learn.Polymorphism;
 2 
 3 public class Fu 
 4     public void method()
 5         System.out.println(",父类子类都有的方法,父类方法运行");
 6 
 7     
 8     public void methodFu()
 9         System.out.println("父类独有,子类没有的的方法运行");
10     
11 
12     int num=10;    //与子类成员变量重名的情况
13 
 1 package cn.learn.Polymorphism;
 2 
 3 public class Zi extends Fu
 4     public void method() 
 5 
 6         System.out.println("父类子类都有的方法,子类方法运行");
 7     
 8     public void methodZi()
 9         System.out.println("子类独有方法");
10     
11     //成员变量不可覆盖重写
12     int num=20;    //与子类成员变量重名的情况
13 
 1 package cn.learn.Polymorphism;
 2 /*
 3    多态是对象的多态
 4    代码中体现多态性:父类引用指向子类对象
 5     -
 6     对象的向上转型  eg:Animal animal = new Cat();
 7     从小范围转到大范围,安全,但有弊端,子类无法调用子类特有方法如下methodZi()
 8    父类名称 对象名   = new 子类名称();
 9    接口名称 实现类名 = new 实现名称();
10 
11    -
12    对象的向下转型(还原)子类名称 对象名=(子类名称)父类对象
13    注:子类对象要与new的相同,不能向下转型为其他父类对象
14    eg:
15    Fu obj = new Zi();
16    Zi obj = (Zi)obj2  错误,编译不报错,运行报错,抛出 java.lang.ClassCastException
17    Zi obj = (Zi)obj  正确
18    目的:使用Zi类中的特有方法
19 
20    优点:无论右边new的谁,左边调用仍然不变
21 
22  */
23 public class Polymorphism 
24     public static void main(String[] args) 
25         Fu obj =new Zi();  //向上转型
26         obj.method();    //子父同时存在,运行的是子类的,new的是谁就运行谁的
27         obj.methodFu();  //子类没有这个方法就在父类找
28 
29         //成员方法obj.methodZi()不能直接调用,向上转型弊端,需要向下还原
30         //可以判断下,格式:对象名 instanceof 类名称,返回值为Boolean
31         System.out.println(obj instanceof Zi);
32 
33         // 成员方法,多态中,new出的对象,编译在左,运行在右
34         // 成员变量,多态中,对象都看左类的成员变量
35         //如果不知道obj 向下还原成谁,可以用if(obj instanceof 类名称)进行判断再转型
36         ((Zi) obj).methodZi(); //正确 ,向下转型还原
37 
38 
39         /*
40         成员变量访问的两种方式:
41         1.直接访问:等号左边是谁就是谁的成员变量,没有则向上查找
42         2.间接访问:通过成员方法进行访问,该方法属于谁,就用谁。没有同上
43          */
44         System.out.println(obj.num);   //调用的是父类的num 10,不报错这是与成员方法取得区别,向上转型
45         System.out.println(((Zi) obj).num);   //调用的是子类的num 20   向下转型
46 
47     
48 

 

以上是关于多态向上转型向下转型的主要内容,如果未能解决你的问题,请参考以下文章

多态向上转型,向下转型

多态向上转型向下转型instanceof 运算符

多态向上转型向下转型

java 多态二

多态向上转型和向下转型

多态的向上转型和向下转型 2016.12.8