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 }