• 【JavaSE】抽象类与接口(下篇)


    ✨hello,进来的小伙伴们,你们好呐!✨

    🍱🍱系列专栏:【JavaSE】🍵

    🥞🥞本篇内容:JavaSE部分接口知识从0到1的分享(对准知识点阅读喔!)

    🍊🍊作者简介:一名大二即将升大三的科班编程小白,我很平凡,学会努力!

    🍼🍼码云存放仓库gitee:https://gitee.com/king-zhou-of-java/java-se.git


    接口:

    ✈️✈️一、接口的概念

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

    🍊举例说明:比如电脑的USB接口。

    54309dea318a4802bcae84f65a6f586d.jpeg

    插座的接口。

    676ed3820e4b492380a170e9fdb9792a.jpeg

    ⛵⛵二、语法规则

    接口定义方式:

    🌯🌯1:首先在我们的idea里我们鼠标左键选中src,然后右键新建一个java Class。

    f1799cf78caa49e3ae707fd509d71d27.png

     🍖🍖2.在弹出来的图框中我们选择第二个interface。

    de80995d1cf6400e92588233f8a6b27c.png

    🥐🥐 3.这样我们就新建好了一个接口。

    1. public interface Idemo1 {
    2. // 在接口中上述写法都是抽象方法,推荐方式2,代码更简洁
    3. public abstract void way1();
    4. void way2();
    5. abstract void way3();
    6. }

    🥮🥮4.我们一般创建接口时, 接口的命名一般以大写字母 I 开头,例如我举的例子接口名就是Idemo1。

    ⛴️⛴️三、接口使用

    注意:接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

    比如我们在接口中实现way1();我们会发现,编译器就自动报错了。

    63f21142441a46869c37e24a733e64d7.png

     解决方法:定义一个类实现该接口:

    🥞🥞1.当我们定义了一个类之后,我们没有实现该接口中的抽象方法,我们发现编译器会报错:

    267851543b294c75abe834046d2440e0.png

     解决方案:实现该接口中的方法:

    🥔1.首先我们在这个类中鼠标右键找到generate。

    9b750c8369784f79ab76823933b46c28.png

     🍈2.然后我们点进去,会看到implement methods,接着我们继续点进去。

    a5b9c1d072384f3fbd09124fcd7cae15.png

     🍏3.进去之后我们可以看到有我们要实现的方法,如果有多个方法的话,我们按住键盘上的Ctrl+鼠标左键选中所有的抽象方法,然后点击OK即可。

    e75f5e5bca7d44ed843d97e374fb7c21.png

     🍐4.成品(这个@Override起标识作用,系统会自动添加,不用深究)

    0196188e690d4397a06b5938449a88e5.png

     🍔5.测试使用,我们定义一个主类TestDemo1,然后实例化一个对象t1,调用我们的way1()函数。

    1. public class Testdemo1 {
    2. public static void main(String[] args) {
    3. test1 t = new test1();
    4. t.way1();
    5. }
    6. }

    运行结果:

    1610f6e8dbb344d59782b9ddc76ce5eb.png

     🚟🚟四、接口特性

    🍤1. 接口类型是一种引用类型,但是不能直接new接口的对象。

    4799bca1d770441cbb2327fb28ece733.png

     🌯2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract。

    比如我们写一个protected方法,编译器就会报错。

    2e3c990a859c4459ab80de8d6eb1b4f1.png

    🚰3. 重写接口中方法时,不能使用default访问权限修饰。

    277204f67de64673b582695cd7320974.png

     💊4. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量。

    585530ad9ed246edb8efb7cd6b56739e.png

     🍗5. 接口中不能有静态代码块和构造方法。

    72aedf40dc86457b8b817dcb8d3d5841.png

    补充说明:

    🍔6. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
    🍯7. jdk8中:接口中还可以包含default方法。

    🛰️🛰️五、实现多个接口

    在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。

    1. interface Idemo1 {
    2. public abstract void way1();
    3. }
    4. interface Idemo2{
    5. void way2();
    6. }
    7. class test1 implements Idemo1,Idemo2{
    8. @Override
    9. public void way1() {
    10. System.out.println("实现了第一个接口Idemo1");
    11. }
    12. @Override
    13. public void way2() {
    14. System.out.println("实现了第二个接口Idemo2");
    15. }
    16. }

    🍱🍱这样写代码的好处就是典型的面向对象思想的编程,对比我们的继承思想,继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性 。这样设计有什么好处呢? 时刻牢记多态的好处, 让程序员忘记类型. 有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力。

     🛩️🛩️六、接口间的继承

    在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。

    这里我们就定义了接口Idemo3继承了接口Idemo1和接口Idemo2。

    1. interface Idemo1 {
    2. public abstract void way1();
    3. }
    4. interface Idemo2{
    5. void way2();
    6. }
    7. interface Idemo3 extends Idemo1,Idemo2{
    8. }

     🚞🚞七、 接口使用实例

    我们知道,在我们之前的学习过程中,我们知道整数通过大小来比较,字符串比较首字母的大小顺序,那么我们定义一个学生类,这个学生类有两个属性age和name,把他们放在一起,按照我们之前的理解,idea自带的比较方法Arrays.sort()能否实现比较呢?那么又是根据什么来比较的呢?是姓名还是年龄呢?🍶🍶

    1. class Student {
    2. public String name;
    3. public int age;
    4. public Student(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. @Override
    9. public String toString() {
    10. return "Student{" +
    11. "name='" + name + '\'' +
    12. ", age=" + age +
    13. '}';
    14. }
    15. }

    🍶再定义一个学生数组,对这个对象数组中的元素进行排序。

    1. public class Test1 {
    2. public static void main(String[] args) {
    3. Student[] stu = new Student[3];
    4. stu[0] = new Student("xiaohu",18);
    5. stu[1] = new Student("zhangsan",19);
    6. stu[2] = new Student("xiaoming",20);
    7. Arrays.sort(stu);
    8. System.out.println(Arrays.toString(stu));
    9. }
    10. }

    🍨运行结果:我们发现运行出错,那么带有两个属性的学生类如何比较呢?

    6c4766143dcc4af3b3f7618d00aa2bc7.png

     🍰🍰解决方案;

    让我们的 Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法。

    🍣步骤1:首先我们需要实现 Comparable 接口,注意书写格式,Comparable<类名>。

    d1108625dfa8423eba032d3ba36a1cf6.png

     🍜2.写完之后我们发现编译器还是报错,我们可以在报错的地方鼠标右键。

    372e3a077c2241378d646ef1a999dd69.png

     🍋3.根据提示操作

    c2826963d7a54a03a6ede3418d511a9d.png

     🍌4.点击这里。

    ff92d3269714427db35d53ccdf03dc46.png

     结果:我们可以看到系统自动生成了compare To方法。

    432be1aec8b5443a87c0b76bf9d0fee7.png

     🍞🍞那么生成了这个方法,我们就可以来设计比较的根据,比如这里我们想让学生类通过他们的年龄来比较,我们可以在compareTo 方法里实现我们的想法:

    1. @Override
    2. public int compareTo(Student o){//在这个接口中实现compare To 方法
    3. if(this.age - o.age > 0){
    4. return 1;
    5. }else if(this.age - o.age < 0){
    6. return -1;
    7. }
    8. else{
    9. return 0;
    10. }
    11. }

    运行结果:

    bec990b1d0604c66800c5421deb54959.png

     即我们如果想比较,必须要指定我们的比较根据,比如年龄或者姓名,通过compareTo 方法就很好的实现了我们的功能。

    🚎🚎八、抽象类和接口的区别

    🍏🍏1:成员区别

    抽象类:
    构造方法:有构造方法,用于子类实例化使用。
    成员变量:可以是变量,也可以是常量。
    成员方法:可以是抽象的,也可以是非抽象的。

    接口:
    构造方法:没有构造方法。
    成员变量:只能是常量。默认修饰符:public static final。
    成员方法:jdk1.7只能是抽象的。默认修饰符:public abstract 。
    jdk1.8可以写以default和static开头的具体方法。

    🍊🍊2:类和接口的关系区别
    类与类:
    继承关系,只能单继承。可以多层继承。

    类与接口:
    实现关系,可以单实现,也可以多实现。
    类还可以在继承一个类的同时实现多个接口。

    接口与接口:
    继承关系,可以单继承,也可以多继承。

    🍅🍅3:体现的理念不同
    抽象类里面定义的都是一个继承体系中的共性内容。
    接口是功能的集合,是一个体系额外的功能,是暴露出来的规则。

     

  • 相关阅读:
    Linux进程通信——消息队列
    Java 程序执行
    【Linux驱动开发】设备树详解(二)设备树语法详解
    IS-IS——图解9种报文
    全新升级的AOP框架Dora.Interception[5]: 实现任意的拦截器注册方式
    技术管理进阶——谁能成为Leader,大Leader该做什么
    2022.9.1 SAP RFC
    盘点JAVA中延时任务的几种实现方式
    shadow复习之planar shadow
    java多线程-对象及变量的并发访问
  • 原文地址:https://blog.csdn.net/m0_62426532/article/details/126292787