java之多态
1.多态的概述:是面向对象的三大特性之一,封装、继承、多态。
①一个具体的对象有多种形态,老虎既属于猫科动物(因为子父类是相对的,所以猫科动物也可以看做子类),又属于哺乳动物,所以老虎既可以拥有猫科动物的属性,又有哺乳动物的属性。
②Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。
普通类与普通类,抽象类与抽象继承类,接口与接口实现类。
多态中成员变量和成员方法的变化
成员变量 编译和运行都参考等号的左边。编译运行看左边
成员方法(非静态方法) 编译看左边,运行看右边。
静态方法 编译看左边,运行看左边(父类的)
注:多态创建对象与普通类创建对象对成员变量和成员方法的调用互不影响。
多态中创建的对象,在调用成员变量时,必须是父类中具备的,调用成员方法时,必须是父类具备的,但实际调用时是子类的方法。
3.instanceof关键字,返回值是布尔类型true false。比如:父类A,子类B,子类C,B和C是A的子类,当父类类型A 变量名=new 子类类型B();用instanceof检测是否属于A或B时,返回值是TRUE,当检测是否属于C时,返回值是False。但检测A/B/C以外 的类时,编译不成功。
多态的转型
1 父类类型 变量名 = new 子类类型(); 2 如:Person p = new Student();
①多态对象的创建,就是向上转型的过程。此时使用的时父类类型的成员变量(隐藏了子类类型),可以调用各个子类的具体的方法(父类中具有的方法),但不能使用子类中特有的方法。
向上转型用于,父类方法的具体实现,或者使用子类相同方法的不同方法体时。
1 子类类型 变量名 = (子类类型) 父类类型的变量; 2 如:Student stu = (Student) p; //变量p 实际上指向Student对象 3 此时可以使用子类的方法和子类的属性
②向下转型的前提是向上转型,所以使用instanceof 判断具体的对象是否属于父类,再进行向下转型。
向下转型,用于使用子类特有的方法。,当提供的对象属于父类对象,但要使用子类特殊的方法时,向下转型。
1 //描述动物类,并抽取共性eat方法 2 abstract class Animal { 3 abstract void eat(); 4 } 5 6 // 描述狗类,继承动物类,重写eat方法,增加lookHome方法 7 class Dog extends Animal { 8 void eat() { 9 System.out.println("啃骨头"); 10 } 11 12 void lookHome() { 13 System.out.println("看家"); 14 } 15 } 16 17 // 描述猫类,继承动物类,重写eat方法,增加catchMouse方法 18 class Cat extends Animal { 19 void eat() { 20 System.out.println("吃鱼"); 21 } 22 23 void catchMouse() { 24 System.out.println("抓老鼠"); 25 } 26 } 27 28 public class Test { 29 public static void main(String[] args) { 30 Animal a = new Dog(); //多态形式,创建一个狗对象 31 a.eat(); // 调用对象中的方法,会执行狗类中的eat方法 32 // a.lookHome();//使用Dog类特有的方法,需要向下转型,不能直接使用 33 34 // 为了使用狗类的lookHome方法,需要向下转型 35 // 向下转型过程中,可能会发生类型转换的错误,即ClassCastException异常 36 // 那么,在转之前需要做健壮性判断 37 if( !a instanceof Dog){ // 判断当前对象是否是Dog类型 38 System.out.println("类型不匹配,不能转换"); 39 return; //返回最开始调用的地方main 40 } 41 Dog d = (Dog) a; //向下转型 42 d.lookHome();//调用狗类的lookHome方法 43 } 44 }