多态&抽象类&接口

一、多态

  1. 多态概述

    同一个对象,在不同时刻表现出来的不同形态

    举例:猫

    我们可以说猫是猫:猫 cat = new cat();

    我们也可以说猫是动物:动物 animal = new cat 猫();

    这里猫在不同的时刻表现出来了不同的形态,这就是多态

    多态的前提和体现

    • 有继承/实现关系
    • 有方法重写
    • 有父类引用指向子类对象
  2. 多态中成员的访问特点

    • 成员变量:编译看左边,执行看右边

    • 成员方法:编译看左边,执行看右边

      为什么成员变量和成员方法的访问不一样?

    • 因为成员方法有重写,而成员变量没有

  3. 多态的好处和弊端

    • 多态的好处:提高了程序的扩展性
      • 具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
    • 多态的弊端:不能使用子类的特有功能
  4. 多态中的转型

    • 向上转型
      • 从子到父(父类引用指向子类对象)
    • 向下转型
      • 从父到子(父类引用转为子类对象)

二、抽象类

  1. 抽象类概述

    在Java中,一个没有方法体的方法应该定义为抽象方法,而累中如果有抽象方法,该类必须定义为抽象类

  2. 抽象类的特点

    • 抽象类和抽象方法必须使用abstract关键字修饰

      ​ public abstract class 类名 {}

      ​ public abstract void eat();

    • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

    • 抽象类不能实例化

      • 参照多态的方式,通过子类对象实例化,这叫抽象列多态
    • 抽象类的子类

      • 要么重写抽象类中的所有抽象方法
      • 要么是抽象类
      package com.heng_01;
      //抽象类
      public abstract class Animal {
          /*
          public void eat(){
              System.out.println("动物吃东西");
          }
           */
      
          //抽象方法
          public abstract void eat();
      
          public void sleep(){
             System.out.println("睡觉");
          }
      }
      
      package com.heng_01;
      
      public class Cat extends Animal{
          @Override
          public void eat() {
              System.out.println("猫吃鱼");
          }
      }
      
      package com.heng_01;
      
      public class AnimalDemo {
          public static void main(String[] args) {
      //        Animal a = new Animal();
              Animal a =new Cat();
              a.eat();
              a.sleep();
          }
      }
      
  3. 抽象类的成员特点

    • 成员变量

      可以是变量,也可以是常

    • 构造方法

      有构造方法,但不能实例化

      作用:用于子类访问父类数据的初始化

    • 成员方法

      可以有抽象方法:限定子类必须完成某些动作

      也可以有抽象方法:提高代码复用性

      ackage com.heng_02;
      
      public abstract class Animal {
      
          private int age = 20;
          private final String city = "北京";
      
          public Animal(){}
      
          public Animal(int age){
              this.age = age;
          }
      
          public void show(){
              age  = 40;
              System.out.println(age);
      //        city = "上海";
              System.out.println(city);
          }
      
          public abstract void eat();
      }
      
      package com.heng_02;
      
      public class Cat extends Animal{
          @Override
          public void eat() {
              System.out.println("猫吃鱼");
          }
      }
      
      package com.heng_02;
      
      public class AnimalDemo {
          public static void main(String[] args) {
              Animal a = new Cat();
              a.show();
              a.eat();
      
          }
      }
      

三、接口

  1. 接口概述

    接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用

    Java中的接口更多地体现在对行为的抽象

  2. 接口的特点

    • 接口用关键字interface修饰

      public interface 接口名{}

    • 类实现接口用implements表示

      public class 类名implements 接口名{}

    • 接口不能实例化

      • 如何实现实例化?参照多态的方式、通过实现类对象实例化,这叫接口多态
      • 多态的形式:具体类多态,抽象类多态,接口多态
      • 多态的前提:有继承或者实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象
    • 接口实现类

      • 重写接口中的所有抽象方法
      • 抽象类
      package com.heng_01;
      /*
          定义了一个接口
       */
      public interface Jumpping {
          public abstract void jump();
      }
      -----------------------------------------
      package com.heng_01;
      
      public class Cat implements Jumpping{
          @Override
          public void jump() {
              System.out.println("猫可以跳高了");
          }
      }
      ------------------------------------------
      package com.heng_01;
      
      public abstract class Dog implements Jumpping{
      }
      -------------------------------------------
      package com.heng_01;
      
      public class JumppingDemo {
          public static void main(String[] args) {
      //        Jumpping j = new Jumpping();
              Jumpping j = new Cat();
              j.jump();
          }
      }
      
      
  3. 接口的成员特点

    • 成员变量

      • 只能是常量
      • 默认修饰符:public static final
    • 构造方法

      接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在

      一个类如果没有父类,默认继承自Object类

    • 成员方法

      • 只能是抽象方法
      • 默认修饰符:public abstract
    package com.heng_02;
    
    public interface Inter {
        public int num = 10;
        public final int num2 = 20;
    //    public static final int num3 = 30;
        int num3 = 30;
    
    //    public Inter(){}
    
    //    public void show(){}
    
        public abstract void method();
        void show();
    }
    ----------------------------------------------
    package com.heng_02;
    
    //public class InterImpl implements Inter{
    
    public class InterImpl extends Object implements Inter{
        public InterImpl(){
            super();
        }
    
        @Override
        public void method() {
            System.out.println("method");
        }
    
        @Override
        public void show() {
            System.out.println("show");
        }
    }
    ----------------------------------------------
    package com.heng_02;
    
    public class InterfaceDemo {
        public static void main(String[] args) {
            Inter i = new InterImpl();
    //        i.num = 20;
            System.out.println(i.num);
    //        i.num2 = 20;
            System.out.println(i.num2);
            System.out.println(Inter.num);
        }
    }
    
  4. 类和接口的关系

    • 类和类的关系
      • 继承关系,只能单继承,但是可以多层继承
    • 类和接口的关系
      • 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
    • 接口和接口的关系
      • 继承关系,可以单继承,也可以多继承
    package com.heng_04;
    
    public interface Inter1 {
    }
    ------------------------------------------
    package com.heng_04;
    
    public interface Inter2 {
    }
    ------------------------------------------
    package com.heng_04;
    
    public interface Inter3 extends Inter1,Inter2{
    }
    ------------------------------------------
    package com.heng_04;
    
    public class InterImpl extends Object implements Inter1,Inter2,Inter3{
    
    }
    
  5. 抽象类和接口的区别

    • 成员区别

      抽象类 变量,常量;有构造方法;有抽象方法,也有非抽象方法

      接口 常量;抽象方法

    • 关系区别

      类与类 继承,单继承

      类与接口 实现,可以单实现,也可以多实现

      接口与接口 继承,单继承,多继承

    • 设计理念区别

      抽象类 对类抽象,包括属性、行为

      接口 对行为抽象,主要是行为

/*
案例:运动员和教练
需求:我们现在有乒乓球运动员和篮球运动员,乓球教练和篮球教练。为了出国交流,跟乓球相关的人员都需要
学习英语。请用所学知识分析,这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现
*/

package com.heng_05;

//抽象人类
public abstract class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}
------------------------------------------------------------------------------

package com.heng_05;
//学习英语的接口
public interface SpeakEnglish {
    public abstract void speak();
}
------------------------------------------------------------------------------

package com.heng_05;

//抽象教练类
public abstract class Coach extends Person{
    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    public abstract void teach();
}
------------------------------------------------------------------------------

package com.heng_05;

//抽象运动员类
public abstract class Athlete extends Person{
    public Athlete() {
    }

    public Athlete(String name, int age) {
        super(name, age);
    }

    public abstract void study();
}
------------------------------------------------------------------------------

package com.heng_05;

public class BasketballCoach extends Coach{
    public BasketballCoach() {
    }

    public BasketballCoach(String name, int age) {
        super(name, age);
    }
    @Override
    public void teach() {
        System.out.println("篮球教练教如何运球和投篮");
    }

    @Override
    public void eat() {
        System.out.println("篮球教练吃羊肉和羊奶");
    }
}
------------------------------------------------------------------------------

package com.heng_05;

public class PingPangCoach extends Coach implements SpeakEnglish{
    public PingPangCoach() {
    }

    public PingPangCoach(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("乒乓球教练教如何发球和接球");
    }

    @Override
    public void eat() {
        System.out.println("乒乓球教练吃小白菜,喝大米粥");
    }

    @Override
    public void speak() {
        System.out.println("乒乓球教练说英语");
    }
}
------------------------------------------------------------------------------

package com.heng_05;

public class BasketballAthlete extends Athlete{
    public BasketballAthlete() {
    }

    public BasketballAthlete(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("篮球运动员学习如何运球和投篮");
    }

    @Override
    public void eat() {
        System.out.println("篮球运动员吃牛肉和牛奶");
    }
}
------------------------------------------------------------------------------

package com.heng_05;

public class PingPangAthlete extends Athlete implements SpeakEnglish{
    public PingPangAthlete() {
    }

    public PingPangAthlete(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员学习接球和发球");
    }

    @Override
    public void eat() {
        System.out.println("乒乓球运动员吃大白菜,喝小米粥");
    }

    @Override
    public void speak() {
        System.out.println("乒乓球运动员说英语");
    }
}
------------------------------------------------------------------------------

package com.heng_05;
/*
    测试类
 */
public class PesonDemo {
    public static void main(String[] args) {
        //创建对象
        PingPangAthlete ppb = new PingPangAthlete();
        ppb.setName("马龙");
        ppb.setAge(32);
        System.out.println(ppb.getName()+","+ppb.getAge());
        ppb.eat();
        ppb.study();
        ppb.speak();
        System.out.println("=======================");

        BasketballAthlete ba = new BasketballAthlete("姚明",42);
        System.out.println(ba.getName()+","+ba.getAge());
        ba.eat();
        ba.study();

        System.out.println("=======================");
        PingPangCoach ppc = new PingPangCoach("刘国梁",45);
        System.out.println(ppc.getName()+","+ppc.getAge());
        ppc.eat();
        ppc.teach();
        ppc.speak();

        System.out.println("=======================");
        BasketballCoach bc = new BasketballCoach();
        bc.setName("李章民");
        bc.setAge(70);
        System.out.println(bc.getName()+","+bc.getAge());
        bc.eat();
        bc.teach();

    }
}
posted @ 2021-09-22 11:10  Skye-Z  阅读(39)  评论(0编辑  收藏  举报