• 【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实现关系

    1. public interface USB {
    2. void openDevice();
    3. void closeDevice();
    4. }
    5. //鼠标类,实现USB 接口
    6. public class Mouse implements USB{
    7. @Override
    8. public void openDevice() {
    9. System.out.println("打开鼠标");
    10. }
    11. @Override
    12. public void closeDevice() {
    13. System.out.println("关闭鼠标");
    14. }
    15. public void click(){
    16. System.out.println("点击鼠标");
    17. }
    18. }
    19. //键盘类,实现USB接口
    20. public class KeyBoard implements USB{
    21. @Override
    22. public void openDevice() {
    23. System.out.println("打开键盘");
    24. }
    25. @Override
    26. public void closeDevice() {
    27. System.out.println("关闭键盘");
    28. }
    29. public void input(){
    30. System.out.println("键盘输入");
    31. }
    32. }
    33. //笔记本类;使用USB接口
    34. public class Computer {
    35. public void powerOn(){
    36. System.out.println("打开笔记本电脑");
    37. }
    38. public void powerOff(){
    39. System.out.println("关闭笔记本电脑");
    40. }
    41. public void useDevice(USB usb){
    42. usb.openDevice();
    43. if(usb instanceof Mouse){
    44. Mouse mouse=(Mouse)usb;
    45. mouse.click();
    46. }else if(usb instanceof KeyBoard){
    47. KeyBoard keyBoard=(KeyBoard) usb;
    48. keyBoard.input();
    49. }
    50. usb.closeDevice();
    51. }
    52. }
    53. public class Test {
    54. public static void main(String[] args) {
    55. Computer computer=new Computer();
    56. computer.powerOn();
    57. computer.useDevice(new Mouse());
    58. computer.useDevice(new KeyBoard());
    59. computer.powerOff();
    60. }
    61. }

    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类型的对象

    1. import java.util.Arrays;
    2. public class Student implements Comparable{
    3. private String name;
    4. private int score;
    5. public Student(String name,int score){
    6. this.name=name;
    7. this.score=score;
    8. }
    9. @Override
    10. public String toString() {
    11. return "["+this.name+":"+this.score+"]";
    12. }
    13. @Override
    14. public int compareTo(Object o) {
    15. Student student=(Student)o;
    16. if(this.score> student.score){
    17. return -1;
    18. }else if(this.score< student.score){
    19. return 1;
    20. }else{
    21. return 0;
    22. }
    23. }
    24. }
    25. class Test{
    26. public static void main(String[] args) {
    27. Student[] students=new Student[]{
    28. new Student("张三",98),
    29. new Student("张四",78),
    30. new Student("张五",88),
    31. new Student("张六",90),
    32. };
    33. Arrays.sort(students);
    34. System.out.println(Arrays.toString(students));
    35. }
    36. }

    8.Clonable接口

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

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

    (3)拷贝

    9.抽象类和接口的区别

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

    (2)

    区别抽象类接口
    结构组成普通类+抽象方法全局变量+抽象方法
    权限各种权限public
    关系一个抽象类可以实现若干个接口

    接口不能继承抽象类,但是接口可以使用extends

    继承多个接口

    子类使用使用extends关键字继承抽象类使用implements关键字是实现接口
    子类限制一个类只能继承一个抽象类一个子类可以实现多个接口

  • 相关阅读:
    AI 引擎系列 1 - 从 AI 引擎工具开始(2022.1 更新)
    robotframework+selenium+ride测试环境搭建和如何把环境迁移到不能连接互联网的环境
    uniapp小程序接入腾讯云【增强版人脸核身接入】
    C/C++ Capstone 引擎源码编译
    南方电网的能源棋局上,蔚来换电扮演什么角色?
    Ubuntu 22.10 UEFI 引导安装在第二块硬盘
    设计模式之【职责链模式】
    vue 3 第三十五章:集成 tailwind Css
    Docker基本管理
    一些性能优化的东西
  • 原文地址:https://blog.csdn.net/m0_74164458/article/details/133695098