多态性:一个事物的多种形态;
1.何为多态性?
对象的多态性,父类的引用指向子类对象;换句话就是说:向上转型;看例子;
1 public class Day12Polymorphism17 { 2 3 public static void main(String[] args) { 4 Persons4 person = new Persons4(); 5 //person.eat(); 6 7 Man man = new Man(); 8 //man.eat(); 9 man.age = 25; 10 //man.earnMony(); 11 //对象的多态性,父类的引用指向子类的对象; 12 Persons4 p1 = new Man(); 13 Persons4 p2 = new Woman(); 14 p1.eat(); 15 p1.walk(); 16 //p1.earnMony();只能掉用父类方法,运行的是子类发方法;由于变量声明为父类类型,导致编译时,只能调用父类声明的属性,子类的属性和方法不能调用 17 p2.eat(); 18 System.out.println(p1.id); 19 20 } 21 }
这里Persons4 是父类,Man是子类,Persons4 p1 = new Man(); 也就是向上转型;new Man()为子类对象;p1是引用;所以就是 父类的引用指向子类对象;
附上相关代码:
1 class Persons4{ 2 String name; 3 int age; 4 int id = 1001;//身份证号 5 6 public Persons4() { 7 } 8 public Persons4(String name, int age) { 9 this.name = name; 10 this.age = age; 11 } 12 13 public void eat() { 14 System.out.println("吃饭"); 15 } 16 public void walk() { 17 System.out.println("走了"); 18 } 19 } 20 21 class Man extends Persons4{ 22 boolean isSmoking; 23 int id = 1002;//身份证号 24 public void earnMony() { 25 System.out.println("男人负责挣钱养家"); 26 } 27 public void eat() { 28 System.out.println("男人多吃饭"); 29 } 30 } 31 32 class Woman extends Persons4{ 33 boolean isBeauty; 34 public void goShopping(){ 35 System.out.println("女人,喜欢购物"); 36 } 37 public void eat() { 38 System.out.println("女人吃的少"); 39 }
当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法;虚拟方法调用;也就是说 p1.eat(); 结果是:男人多吃饭 p1.walk()结果是:“走了”
2.多态的使用:虚拟方法调用
有了对象的多态性以后,我们只能在编译器,只能调用父类中声明的方法,但是在执行期,我们实际执行的是子类重写的父类的方法;
总结:方法:编译看左边,执行看右边;
属性 编译和执行都看左边;
4.多态的使用前提:
a.要有类的继承关系;
b.要有方法的重写;
5.对象的多态性只适用于方法,不适合用属性;
p1.id 这里的结构还是1001
6.多态是运行时方法;
这里,多态的使用时为了让代码更加简洁,让参数统一化;比如在方法的参数可以接受父类参数,那么如果你传入子类也可以,就可以简化代码了。那么这里就会又引入另外一个问题,如果方法参数是父类形参,当传入子类参数时,处理这个形参时,如何把 父类转换为子类对象呢?这样就引入了向下转型;向下转型符号 即强制类型转换符 “()”;
1 public static void main(String[] args) { 2 Persons4 person = new Persons4(); 3 Persons4 p1 = new Man();//多态 4 Man man = (Man)p1;//向下类型转换 使用强制类型转换,可能异常; 14 if(p1 instanceof Woman) { 15 System.out.println("是女人,不可以强转"); 16 }else if(p1 instanceof Man) { 17 System.out.println("是男人,可以强转"); 18 } 19 //相关问题; 20 //编译过,运行不过; 21 Persons5 p2 = new Woman1(); 22 Man1 m2 = (Man1)p2; 23 24 Persons5 p3 = new Persons5(); 25 Man1 m3 = (Man1)p3; 26 27 //编译过,运行也过 28 Object obj = new Woman1(); 29 Persons5 p4 = (Persons5) obj; 30 31 //编译不通过 32 //Man1 m5 = new Woman1(); 33 34 }
instanceof 关键字的使用说明:
a instanceof A:判断对象a是否是类A的实例,如果是,返回true,否则false;
B 是 A 的父类,如果 a instanceof A: 返回true,b instanceof A:返回也是true;
为了避免出现classcaseException的异常,我们在向下转型之前,先进行instanceof的判断,