• 五(十)、多态


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


  • 相关阅读:
    Mysql的ONLY_FULL_GROUP_BY
    Redis报错“ OOM command not allowed when used memory > 'maxmemory' ”
    redis发布订阅客户端报错
    使用IDEA远程调试SpringBoot程序
    kafk学习笔记(一)
    Ubuntu中卸载node和npm并重装
    一些常用的类型转换
    一台电脑配置多个GigHub账号
    百度网盘文件直接下载方法(跳过每次需要启动百度网盘下载的方式)
    如何激活IDEA工具,亲测有效
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/13363249.html
Copyright © 2020-2023  润新知