11. 抽象类和接口

抽象类

抽象类概念

当一个类没有什么具体实现的时候,我们通常会把这个类设计成抽象类

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape
的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract
method), 包含抽象方法的类我们称为 抽象类(abstract class).

抽象类语法

//抽象类
public abstract class Shape {
    public int a;
    public static int b ;
    public void func() {
        
    }
    //抽象方法
    abstract public void draw();
}

总结:

  1. 使用 abstract 修饰的方法,叫做抽象方法.
  2. 包含抽象方法的类必须设计为抽象类
  3. 抽象类不能够进行实例化
    Shape shape = new Shape( );
  4. 抽象类当中,可以有和普通类一样的方法,成员.
    和普通类不一样的是,抽象类不可以进行实例化.
  5. 抽象类不可以被实例化,,但是可以被继承.【也就是说抽象类其实就是为了继承】
  6. 当一个普通类继承了抽象类,那么这个普通类就要重写抽象类当中的所以方法,除非把这个普通类也加 abstract 变成抽象类
  7. 如果一个抽象类A继承另一个抽象类B,那么此时这个抽象类A可以不重写B当中的抽象方法
  8. 抽象方法不能是 private 的,static 的, final 的

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

接口(interface)

接口的概念

生活当中的接口比比皆是,手机充电口,插头接口…

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

总结:

  1. 使用 interface 来修饰接口
  2. 接口当中的成员变量,默认都是 public static final 修饰的
  3. 接口当中的成员方法,默认都是抽象方法, public abstract 修饰的
  4. 接口当中的普通成员方法,是不能有具体的实现的
  5. 接口当中的普通成员方法,如果要有具体的实现,必须加上default修饰【从JDK8开始才有的】
  6. 接口当中可以有static修饰的静态的成员方法。但是不管是静态的方法还是 default 方法,都是 public 修饰的
  7. 接口也是不可以进行实例化的
  8. 类和接口的关系使用 i m p l e m e n t s \color{red} { implements } implements 来关联的
  9. 一个接口可以引用具体的实现类 <向上转型>
  10. 接口当中不能有静态代码块,实例代码块,构造方法
  11. 一个抽象类实现一个接口,可以不重写抽象方法。但是,出来混迟早是要还的

那么类与接口通过什么东西去进行绑定呢?

类与接口的关系使用 i m p l e m e n t s \color{red} { implements } implements 进行连接

实例:

请实现笔记本电脑使用USB鼠标、USB键盘的例子

  1. USB接口:包含打开设备、关闭设备功能
  2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
  3. 鼠标类:实现USB接口,并具备点击功能
  4. 键盘类:实现USB接口,并具备输入功能

public interface USB {
    void openDevice();
    void closeDevice();
}

public class KeyBoard implements USB{
    @Override
    public void openDevice() {
        System.out.println("打开键盘");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭键盘");
    }

    public void inPut() {
        System.out.println("键盘输入");
    }
}

public class Mouse implements USB{
    @Override
    public void openDevice() {
        System.out.println("打开鼠标!");
    }

    @Override
    public void closeDevice() {
        System.out.println("关闭鼠标!");
    }

    public void click() {
        System.out.println("鼠标点击");
    }
}

public class Computer {
    public void powerOn() {
        System.out.println("打开笔记本电脑");
    }
    public void powerOff() {
        System.out.println("关闭笔记本电脑");
    }

    public void useDevice(USB usb) {
        usb.openDevice();
        if (usb instanceof Mouse) {
            Mouse mouse = (Mouse) usb;
            mouse.click();
        }else if(usb instanceof KeyBoard) {
            KeyBoard keyBoard = (KeyBoard) usb;
            keyBoard.inPut();
        }
        usb.closeDevice();
    }
}

public class Test {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.powerOn();

        computer.useDevice(new Mouse());

        computer.useDevice(new KeyBoard());

        computer.powerOff();
    }
}



一个接口想要实现多个接口的功能

interface IA {
    void funcA();
}
interface IB {
    void funcB();

}
// 扩展功能
//IC 同时拥有 IA,IB 的功能
interface IC extends IA, IB {
    void funcC();

}
class T implements IC{

    @Override
    public void funcA() {
        
    }

    @Override
    public void funcB() {

    }

    @Override
    public void funcC() {

    }
}

Comparable 接口(比较大小)

两个学生的年龄比较

class Student implements Comparable<Student>{
    String name;
    int age;
    double score;

    public Student (String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        if (this.age>o.age){
            return 1;
        }else if (this.age ==o.age) {
            return 0;
        }else {
            return -1;
        }
    }
}

public class Test {

    public static void main(String[] args) {
        Student student1 = new Student("小帅",12,59.9);
        Student student2 =new Student("张三",19,99.9);
        if (student1.compareTo(student2) > 0) {
            System.out.println(student1.name+" 的年龄比"+student2.name+"大"+(student1.age-student2.age)+"岁");
        }else if (student1.compareTo(student2)==0) {
            System.out.println(student1.name + " 和" + student2.name + "一样");
        }else {
            System.out.println(student1.name + " 的年龄比" + student2.name + "小" + (student2.age - student1.age) + "岁");
        }
    }
}

在这里插入图片描述

感谢银菏学姐的监督与指导!!!🤨🤨🤨

2022年10月7日21:26:55

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱听歌的阿漓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值