ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

五(十)、多态

2020-07-22 21:33:27  阅读:207  来源: 互联网

标签:p1 子类 多态 new 父类 Persons4 Man


多态性:一个事物的多种形态;
  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的判断,


 

标签:p1,子类,多态,new,父类,Persons4,Man
来源: https://www.cnblogs.com/lixiuming521125/p/13363249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有