【JavaEE重点知识归纳】第9节:抽象类和接口

目录

一:抽象类

1.概念

2.语法

3.特性

4.作用

二:接口

1.概念

2.语法

3.接口使用

4.特性

5.实现多个接口

6.接口间的继承

7.Comparable接口

8.Clonable接口

9.抽象类和接口的区别


一:抽象类

1.概念

(1)在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

(2)eg:

(3)Animal是动物类,每个动物都有自己的叫声,但是由于Animal不是一个具体的动物,bark()方法无法实现,因此,Animal可以设计为抽象类

2.语法

(1)在Java中,一个类如果被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法可以不用给出具体的实现体

(2)抽象类也是类,内部可以包括普通方法和属性,甚至构造方法

3.特性

(1)抽象类不允许直接实例化对象

(2)既然抽象类不允许实例化,那么要抽象类干嘛------就是为了继承(当一个普通类继承了这个抽象类的时候,需要重写这个抽象类所有的抽象方法)

(3) 抽象方法不能是private的,抽象方法不能被final和static修饰,因为抽象方法要被子类重写

(4)抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类

(5)抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

4.作用

(1)抽象类本身不能被实例化,要想使用,只能在创建该抽象类的子类,然后让子类重写抽象类中的抽象方法

(2)抽象类存在的意义就是为了让编译器更好的校验,像Animal这样的的类我们并不会直接使用,而是使用它的子类,万一不小心创建了Animal的实例,编译器会及时提醒我们

二:接口

1.概念

(1)在现实生活中,接口的例子比比皆是,比如笔记本上的USB接口,电源插座

(2)在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

2.语法

(1)接口关键字interface

public interface 接口名{

//成员变量默认是public static final

//成员方法默认是public abstract

//一般情况下可以不写(阿里约定,保持代码简洁性)

}

(2)创建接口的时,接口命名一般以大写字母I开头;接口命名一般使用形容词性

3.接口使用

(1)接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法

public class 类名 implement 接口名{

}

(2)注意:子类和父类之间是extends继承关系,类和接口之间是implements实现关系

复制代码
public interface USB {
    void openDevice();
    void closeDevice();
}

//鼠标类,实现USB 接口
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("点击鼠标");
    }
}

//键盘类,实现USB接口
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("键盘输入");
    }
}


//笔记本类;使用USB接口
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();
    }
}
4.特性

(1)接口类型是一种引用,但是不可以实例化,就是不能new

(2)接口中的每一个方法都是public修饰的抽象方法

(3)接口中的抽象方法不能在接口中实现,只能有实现接口的类来实现

(4)重写接口中的方法时,不能只用默认default权限,因为接口中的方法为public,不能分配更低的访问权限

(5)接口不能有静态代码块和构造方法

(6)接口不是类,但是接口编译后的字节码文件后缀格式还是.class

5.实现多个接口

(1)在Java中,不允许多继承,但是允许多接口

(2)一个类实现多个接口的时候,每个接口中的抽象方法都要实现,否则类必须设置为抽象类

(3)继承表示is-a的关系,组合表示has-a的关系,接口表示具有xxx特性

6.接口间的继承

(1)在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承

(2)接口可以继承一个或多个接口,达到复用的效果,使用extends关键字(接口之间的继承相当于把多个接口合并在一起 )

interface 接口1 extends 接口2,接口3{

}

7.Comparable接口

(1)给定一个学生对象数组,对这个数组中的元素进行排序(按分数降序)

(2)两个整数是可以直接比较的,大小关系明确,而两个学生对象的大小关系怎么确定?让Student类实现Comparable接口,并实现其中的comparaTo方法

(3)在sort方法中会自动调用comparaTo方法;comparaTo的参数是Object,其实传入的就是student类型的对象

复制代码
import java.util.Arrays;

public class Student implements Comparable{
    private String name;
    private int score;

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

    @Override
    public String toString() {
        return "["+this.name+":"+this.score+"]";
    }

    @Override
    public int compareTo(Object o) {
        Student student=(Student)o;
        if(this.score> student.score){
            return -1;
        }else if(this.score< student.score){
            return 1;
        }else{
            return 0;
        }
    }
}
class Test{
    public static void main(String[] args) {
        Student[] students=new Student[]{
            new Student("张三",98),
            new Student("张四",78),
            new Student("张五",88),
            new Student("张六",90),
        };
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
}
8.Clonable接口

(1)在Java中内置了一些很有用的接口,Clonable就是其中之一

(2)Object类中存在一个clone方法,调用这个方法可以创建一个对象的"拷贝",但是要想合法调用clone方法,必须要先实现Clonable接口,否则会报异常

(3)拷贝

9.抽象类和接口的区别

(1)核心区别:抽象类中可以包含普通变量和普通方法,这样的变量和方法可以被子类直接使用(不必重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法

(2)

|------|-------------------|----------------------------------|
| 区别 | 抽象类 | 接口 |
| 结构组成 | 普通类+抽象方法 | 全局变量+抽象方法 |
| 权限 | 各种权限 | public |
| 关系 | 一个抽象类可以实现若干个接口 | 接口不能继承抽象类,但是接口可以使用extends 继承多个接口 |
| 子类使用 | 使用extends关键字继承抽象类 | 使用implements关键字是实现接口 |
| 子类限制 | 一个类只能继承一个抽象类 | 一个子类可以实现多个接口 |

相关推荐
猷咪16 分钟前
C++基础
开发语言·c++
IT·小灰灰17 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧19 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q19 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳020 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾20 分钟前
php 对接deepseek
android·开发语言·php
vx_BS8133023 分钟前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_9498683623 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计37 分钟前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
qq_177767371 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos