zoukankan      html  css  js  c++  java
  • Java

     

    多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

    Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。

    • 继承:在多态中必须存在有继承关系的子类和父类。
    • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
    • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法
    体现:
      1.父类类型的引用  指向  子类的对象
           Person p = new Teacher();
      2.该引用只能调用父类中定义的属性或方法
      3.如果子类中将父类的方法重写,那么调取方法后执行的结果是子类重写之后的那个结果
         如果父类与子类有同名的属性    执行父类的属性
         如果父类与子类有同名的方法(重载) 执行子类重写之后的方法
      4.若想要调用子类中独有的成员
         (强制类型转化)  造型 铸型  (向上/向下转型)
      5.造型时(强制向下转型时) 可能会出现一个运行时异常
     
    public class Animal {
        public String name = "Animal的name属性";
        public void eat(){
    
            System.out.println("Animal的吃饭方法");
        }
        public void sleep()
        {
            System.out.println("Animal的睡觉方法");
        }
    }
    
    public class Person extends Animal{
        public String name = "Person的Name属性";
        public void sleep(){
                System.out.println("Person重写的睡觉方法");
        }
    
        public void eat(){
            System.out.println("Person重写的吃饭方法");
        }
    
        public void talk(){
            System.out.println("Person自己的说话方法");
        }
    }
    
    public class Teacher extends Person{
        public String name = "Teacher的Name属性";
    
        public void eat(){
            System.out.println("Teacher的吃饭方法");
        }
    
        public void teach(){
            System.out.println("Teacher的讲课方法");
        }
    }
    
    public class Student extends Person{
        public String name = "Student的Name属性";
        public void talk(){
            System.out.println("学生遵守礼貌 应该好好说话");
        }
        public void study(){
            System.out.println("好好学习 天天向上");
        }
    }
    
    public class Test {
      public static void main(String[] args){
            Person p = new Teacher();//自动向上转型  Teacher--->Person
            p.eat();
            p.sleep();
            p.talk();
            System.out.println(p.name);
    
      }
    }
    
    运行结果:
    Teacher的吃饭方法
    Person重写的睡觉方法
    Person自己的说话方法
    Person的Name属性
    public class Test {
      public static void main(String[] args){
        
          Object o = new Teacher();
          o.hashCode();
          o.toString();
          System.out.println("------------------------");
          Animal a = (Animal)o;
          a.hashCode();
          a.toString();
          System.out.println(a.name);//animal的name属性
          a.sleep();//没有重写  person重写了 person的sleep
          a.eat();//执行teacher的eat方法
          System.out.println("-----------------------");
          Person p = (Person)o;
          p.hashCode();
          System.out.println(p.name);//person的name属性
          p.sleep();//人类的睡觉
          p.eat();//老师的吃饭
          p.talk();//人类的说话
          System.out.println("----------------------");
          Teacher t = (Teacher)o;
          System.out.println(t.name);//老师的name
          t.eat();//老师的吃饭
          t.sleep();//人类睡觉
          t.talk();//人类说话
          t.teach();//老师的独有方法
          System.out.println("-------------------");
          if(o instanceof Person){//对象是否属于后面类型
              System.out.println("类型匹配  可以造型");
    //            Student s = (Student)o;//运行时异常 ClassCastException
    //            s.study();
          }else{
              System.out.println("对不起 类型不匹配 不帮您造型啦 否则会出问题");
          }
      }
    }
    
    运行结果:
    
    ------------------------
    Animal的name属性
    Person重写的睡觉方法
    Teacher的吃饭方法
    -----------------------
    Person的Name属性
    Person重写的睡觉方法
    Teacher的吃饭方法
    Person自己的说话方法
    ----------------------
    Teacher的Name属性
    Teacher的吃饭方法
    Person重写的睡觉方法
    Person自己的说话方法
    Teacher的讲课方法
    -------------------
    类型匹配  可以造型
  • 相关阅读:
    正经学C#_循环[do while,while,for]:[c#入门经典]
    Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
    asp.net core 获取当前请求的url
    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be
    用orchard core和asp.net core 3.0 快速搭建博客,解决iis 部署https无法登录后台问题
    System.Data.Entity.Core.EntityCommandExecution The data reader is incompatible with the specified
    初探Java设计模式3:行为型模式(策略,观察者等)
    MySQL教程77-CROSS JOIN 交叉连接
    MySQL教程76-HAVING 过滤分组
    MySQL教程75-使用GROUP BY分组查询
  • 原文地址:https://www.cnblogs.com/yyanghang/p/11105972.html
Copyright © 2011-2022 走看看