Java(4)_ 多态,抽象类·,接口

1.多态

1.1多态概述

同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫 cat = new 猫();
我们也可以说猫是动物:动物 animal = new 猫();
这里猫在不同的时刻表现出来了不同的形态,这就是多态

多态的前提和体现

  • 有继承/实现关系
  • 有方法重写
  • 有父类引用指向子类对象

1.2 多态中成员访问特点

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

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

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

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

举个例子:

//父类 动物类
public class Animal {
    public int age=10;
    public void eat(){
        System.out.println("动物吃东西");
    }
}
//子类 猫类
public class Cat extends Animal {

    public int age=20;
    public int weight=20;
    @Override
    public void eat() {
        //super.eat();
        System.out.println("猫吃鱼");
    }

    public void playGame() {
        //super.eat();
        System.out.println("猫玩游戏");
    }

//测试类
public class AnimalDemo {
    public static void main(String[] args) {

        Animal a=new Cat();
        a.eat();
        System.out.println(a.age);
    }
}

运行测试结果发现:image

并且发现a.playGame会报错,因为一开始是Animal a=new Cat();
image

1.3 多态的好处和弊端

  • 多态的好处:提高了程序的扩展性
    具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

image

1.4 多态中的转型

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

举例:

        Animal a = new Cat(); //向上转型
        a.eat();
        System.out.println(a.age);

        /*Cat c =new Cat();
        c.eat();
        c.playGame();*/

        //向下转型
        Cat c = (Cat) a;
        c.eat();
        c.playGame();

1.5 内存图解:

image
image
image
image

2.抽象类

2.1抽象类的概述(理解)

当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!

2.2抽象类的特点(记忆)

  • 抽象类和抽象方法必须使用 abstract 关键字修饰
	 //抽象类的定义
	public abstract class 类名 {}
	//抽象方法的定义
	public abstract void eat();
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象
  • 抽象类不能实例化
    抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
  • 抽象类的子类
    要么重写抽象类中的所有抽象方法
    要么是抽象类

2.3抽象类的成员特点(记忆)

  • 成员的特点

  • 成员变量

    • 既可以是变量
    • 也可以是常量
  • 构造方法

    • 空参构造
    • 有参构造
  • 成员方法

    • 抽象方法
    • 普通方法
  • 代码演示

    • 动物类
    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();
    }
    
    
  • 猫类

    public class Cat extends Animal {
    @Override
    public void eat() {
    System.out.println("猫吃鱼");
    }
    }
    
    
  • 测试类

    public class AnimalDemo {
    public static void main(String[] args) {
    Animal a = new Cat();
    a.eat();
    a.show();
    }
    }
    

3.接口

3.1接口的概述(理解)

接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中的接口更多的体现在对行为的抽象!

3.2接口的特点(记忆)

  • 接口用关键字interface修饰
    public interface 接口名 {}
    
  • 类实现接口用implements表示
    public class 类名 implements 接口名 {}
    
  • 接口不能实例化
    接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
    多态的形式:具体类多态,抽象类多态,接口多态。
  • 接口的子类
    要么重写接口中的所有抽象方法
    要么子类也是抽象类

3.3接口的成员特点(记忆)

  • 成员特点

  • 成员变量
    只能是常量 默认修饰符:public static final

  • 构造方法
    没有,因为接口主要是扩展功能的,而没有具体存在
    成员方法

  • 只能是抽象方法
    默认修饰符:public abstract

  • 代码演示

    • 接口
    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();
    }
    
    
  • 实现类

    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");
    	}
    }
    
    
    
  • 测试类

    public class InterfaceDemo {
    public static void main(String[] args) {
    Inter i = new InterImpl();
    // i.num = 20;
    System.out.println(i.num);
    // i.num2 = 40;
    System.out.println(i.num2);
    System.out.println(Inter.num);
     	}
    }
    
    

3.5类和接口的关系(记忆)

  • 类与类的关系
    继承关系,只能单继承,但是可以多层继承
  • 类与接口的关系
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口与接口的关系
    继承关系,可以单继承,也可以多继承

3.6抽象类和接口的区别(记忆)

  • 成员区别
    • 抽象类
      变量,常量;有构造方法;有抽象方法,也有非抽象方法
    • 接口
      常量;抽象方法
  • 关系区别
    • 类与类
      继承,单继承
    • 类与接口
      实现,可以单实现,也可以多实现
    • 接口与接口
      继承,单继承,多继承
  • 设计理念区别
    • 抽象类
      对类抽象,包括属性、行为
    • 接口
      对行为抽象,主要是行为
posted @ 2021-08-05 14:50  Rouehang  阅读(52)  评论(5编辑  收藏  举报