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 }