接口

1.接口概述与生活举例

2.接口的定义基本格式、接口的抽象方法定义及使用

  • 接口使用步骤:

  • 1.接口不能直接使用,必须有一个“实现类”来“实现”该接口。

  • 格式:

  • public class 实现类名称 implements 接口名称 {

  • //。。。

  • }

  • 2.接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。

  • 实现:去掉abstract关键字,加上方法体大括号。

  • 3.创建实现类的对象,进行使用。

  • 注意事项:如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。

    例子:

    2.1.定义的时候直接用上下键选择接口。

package Demo2401;/** 在任何版本的Java中,接口都能定义抽象方法:* public abstract 返回值类型 方法名称(参数列表);** 注意事项:* 1.接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract* 2.这两个关键字修饰符,可以选择性地省略。(刚学不推荐)* 即两个关键词可以单独省略,也可以全部省略* 3.方法的三要素可以随意定义。* */public interface MyInterfaceAbstract {//这是一个完整的抽象方法public abstract void methodAbs1();//这是去掉public的抽象方法abstract void methodAbs2();//这是去掉abstract的抽象方法public void methodAbs3();//这是public和abstract都去掉的抽象方法void methodAbs4();
}

2.2.定义一个普通的类来实现接口,一般类命名为接口名+Imp。会自动生成覆盖重写接口中所有抽象方法。

package Demo2401;public class MyInterfaceAbstractImpl implements MyInterfaceAbstract{@Overridepublic void methodAbs1() {System.out.println("这是第一个方法");}@Overridepublic void methodAbs2() {System.out.println("这是第二个方法");}@Overridepublic void methodAbs3() {System.out.println("这是第三个方法");}@Overridepublic void methodAbs4() {System.out.println("这是第四个方法");}
}

2.3.在main方法中实现类,调用其中方法。

package Demo2401;/*
* 接口就是多个类的公共规范。
* 接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。
* 定义接口的格式:(接口名称是大驼峰)
* public interface 接口名称 {
*   //接口名称
* }
*
* 备注:换成了关键字interface之后,编译生成的字节码文件仍然是.java-->.class。
*
* 如果是Java7,那么接口可以包含的内容有:
* 1.常量
* 2.抽象方法
*
* 如果是Java8,还可以额外包含有:
* 3.默认方法
* 4.静态方法
*
* 如果是Java9,还可以额外包含有:
* 5.私有方法
*
* 接口使用步骤:
* 1.接口不能直接使用,必须有一个“实现类”来“实现”该接口。
* 格式:
* public class 实现类名称 implements 接口名称 {
*   //。。。
* }
* 2.接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
* 实现:去掉abstract关键字,加上方法体大括号。
* 3.创建实现类的对象,进行使用。
*
* 注意事项:如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。
* */public class Demo01Interface {public static void main(String[] args) {MyInterfaceAbstractImpl myInterfaceAbstract = new MyInterfaceAbstractImpl();myInterfaceAbstract.methodAbs1();myInterfaceAbstract.methodAbs2();myInterfaceAbstract.methodAbs3();myInterfaceAbstract.methodAbs4();}
}

3.接口的默认方法的定义、使用

本来接口中只有methodAbs,在接口A和B中都使用了。但当接口中加入methodAbs2时,A和B要重新覆盖重写methodAbs2,但是在实际生产中是不现实的,因此把method写成默认方法。同时,在实现接口的类中可以重写默认方法。

3.1 接口:

package Demo2402;/*
* 从Java8开始,接口里允许定义默认方法。
* 格式:
* public default 返回值类型 方法名称(参数列表) {
*   方法体
* }
* 备注:接口当中的默认方法,可以解决接口升级的问题。
* */public interface MyInterfaceDefault {//这是抽象方法public abstract void methodAbs();//新添加了抽象方法//public abstract void methodAbs2();//新添加的方法改为默认方法就行public default void methodAbs2(){System.out.println("这是新添加的默认方法");}
}

3.2 接口的实现类A:

package Demo2402;public class MyInterfaceDefaultA implements MyInterfaceDefault{@Overridepublic void methodAbs() {System.out.println("实现方法A");}
}

3.3 接口的实现类B:

package Demo2402;public class MyInterfaceDefaultB implements MyInterfaceDefault {@Overridepublic void methodAbs() {System.out.println("实现方法B");}//可对默认方法进行重写 alt+insert@Overridepublic void methodAbs2() {System.out.println("对默认方法重写");}
}

3.4 main方法:

package Demo2402;/*
* 1.接口的默认方法,可以通过接口实现类对象,直接调用。
* 2.接口的默认方法,也可以通过接口实现类进行覆盖重写。
* */public class Demo02Interface {public static void main(String[] args) {MyInterfaceDefaultA myInterfaceDefaultA = new MyInterfaceDefaultA();myInterfaceDefaultA.methodAbs();myInterfaceDefaultA.methodAbs2();MyInterfaceDefaultB myInterfaceDefaultB = new MyInterfaceDefaultB();myInterfaceDefaultB.methodAbs();myInterfaceDefaultB.methodAbs2();}
}
/*
* 实现方法A
这是新添加的默认方法
实现方法B
这是新添加的默认方法
*
* 实现方法A
这是新添加的默认方法
实现方法B
对默认方法重写
* */

4.接口的静态方法定义、使用。

静态方法与对象无关,与类有关。在接口中,没必要创建实现接口类的对象,直接用接口调用静态方法即可。

4.1 接口:

package Demo2403;/*
* 从Java 8开始,接口当中允许定义静态方法。
* 静态:比如说学生小明用方法A,学生小红也用方法A,那么方法与小明或者小红无关,与学生有关。
*类.静态方法();不是对象.静态方法();
* 格式:
* public static 返回值类型 方法名称(参数列表){
*   方法体
* }
* 提示:就是将abstract或者default换成static即可,带上方法体。
* */public interface MyInterfaceStatic {public static void methodStatic(){System.out.println("这是静态方法");}
}

4.2 多余的实现接口的类:

package Demo2403;public class MyInterfaceStaticImpl implements MyInterfaceStatic{}

4.3 main方法:

package Demo2403;/** 注意:不能通过接口实现类的对象来调用接口当中的静态方法,* 所以创建MyInterfaceStaticImpl是一个错误** 正确写法:通过接口名称,直接调用其中的静态方法。* 格式:* 接口名称.静态方法名称(参数)。* */public class Demo03Interface {public static void main(String[] args) {//创建了实现类的对象//MyInterfaceStaticImpl m = new MyInterfaceStaticImpl();//错误写法//m.methodStatic();//直接通过接口名称调用静态方法MyInterfaceStatic.methodStatic();//这是静态方法}
}

5.接口的私有方法定义和使用

两个方法之间相同的太多了,就需要抽取一把。

5.1 普通私有方法:

package Demo2404;
//因为我是java8,所以这个私有方法并不能正常使用
/*
* 问题描述:
* 我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。
* 但是这个共有方法不应该让实现类使用,应该是私有化的。
*
* 解决方案:
* 从Java9开始,接口当中允许定义私有方法。
* 1.普通私有方法,解决多个默认方法之间重复代码问题
* 格式:
* private 返回值类型 方法名称(参数列表) {
*   方法体
* }
* 2.静态私有方法,解决多个静态方法之间重复代码问题
* 格式:
* private static 返回值类型 方法名称(){
*   方法体
* }
* */public interface MyInterfacePrivateA {public default void methodDefault1(){System.out.println("这是一个默认方法1");//common();}public default void methodDefault2(){System.out.println("这是一个默认方法2");//common();}//    private void common(){//        System.out.println("aaa");
//        System.out.println("bbb");
//        System.out.println("ccc");
//    }
}

5.2 静态私有方法:

package Demo2404;
//静态私有方法
/*
* 问题描述:
* 我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。
* 但是这个共有方法不应该让实现类使用,应该是私有化的。
*
* 解决方案:
* 从Java9开始,接口当中允许定义私有方法。
* 1.普通私有方法,解决多个默认方法之间重复代码问题
* 格式:
* private 返回值类型 方法名称(参数列表) {
*   方法体
* }
* 2.静态私有方法,解决多个静态方法之间重复代码问题
* 格式:
* private static 返回值类型 方法名称(){
*   方法体
* }
* */public interface MyInterfacePrivateB {public static void methodDefault1(){System.out.println("这是一个默认方法1");//common();}public static void methodDefault2(){System.out.println("这是一个默认方法2");//common();}//    private static void common(){//        System.out.println("aaa");
//        System.out.println("bbb");
//        System.out.println("ccc");
//    }
}

因为两个前面的方法中重复的部分太多了,所以抽取到common方法中,如果将common也设置为public的话,那在实现接口类中,一定要重写的,但实质上并不想让其重写,所以将其设置为private类型,只能供本接口中那两个方法使用。

6.接口的常量定义和使用

package Demo2405;/*
* 接口当中也可以定义“成员变量”,但是必须使用public static final三个关键字进行修饰。
* 从效果上看,这其实就是接口的【常量】
* 格式:
* public static final 数据类型 常量名称 = 数据值;
*
* 注意:
* public:大家共有的
* static:可以通过接口名调用
* final:一旦使用final关键字进行修饰,说明不可改变。
*
* 注意事项:
* 1.接口当中的常量,可以省略public static final,注意:不写也照样是这样。
* 2.接口当中的常量,必须进行赋值,不能不赋值。
* 3.接口中常量的名称,使用完全大写的字母,用下划线进行分隔。(推荐命名)
* */public interface MyInterfaceConst {//这其实就是一个常量,一旦赋值,不可以修改。//shift+F6改为大写常量,假设多个单词,下划线连接NUM_OF_MYCLASSpublic static final int NUM = 10;
}
package Demo2405;public class Demo05Interface implements MyInterfaceConst{public static void main(String[] args) {//访问接口中常量System.out.println(MyInterfaceConst.NUM);//10}
}

7.接口小结

第24天学习Java的笔记-接口Interface相关推荐

  1. 学习 Java 8 - 函数式接口 Lambda

    学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...

  2. SV学习(3)——接口interface、modport、时钟块clocking

    SV学习(3)--接口interface.modport.时钟块clocking 1. 接口interface 2. modport 3. 时钟块clocking 3.1. 驱动和采用的竞争问题 3. ...

  3. System Verilog学习笔记—接口interface

    目录 0.interface的直观理解 1.使用端口的TB与DUT通信 2.使用接口的TB与DUT通信 3.使用modport将interface中的信号分组 4.接口中的clocking block ...

  4. 深入学习Java虚拟机笔记

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.走进Java 1.4.2 HotSpot VM 1.4.4 BEA JRockit/IBM J9 VM 1.6.1 ...

  5. 第21天学习Java的笔记-数学工具类Arrays,Math

    27天! 数学工具类 1.1数组工具类Arrays package Demo2101;/* 注意事项:是Arrays进行调用,不是变量进行调用!!!* java.util.Arrays是一个与数组相关 ...

  6. 第18天学习Java的笔记-ArrayList

    还有31天! 对象数组 package Demo1801;public class Person {private String name;private int age;public Person( ...

  7. 第19天学习Java的笔记-String字符串

    29天! 字符串 1.字符串概述和特点.构造方法和直接创建 package Demo1901;/* * java.lang.String类代表字符串. * API当中说,Java程序中的所有字符串字面 ...

  8. 第15天学习Java的笔记(封装性,this,构造方法)

    还有35天! 面向对象三大特征之封装性 package Demo1501;/** 面向对象三大特征:封装.继承.多态** 封装性在Java中的体现:* 1.方法就是一种封装* 2.关键字private ...

  9. 第二天学习Java的笔记

    第五章 变量和数据类型 程序运行期间可以发生改变的量. 基本数据类型 ​ 整数型:byte(1),short(2),int(4),long(8) ​ 浮点型:float(单精度),double(双精度 ...

最新文章

  1. 张口闭口就是焦虑,现在的程序员怎么了?
  2. java 正则提取$ 中内容_JAVA 使用正则从文字中提取想要的内容
  3. 设置Hadoop的 dataNode的单个Map的内存配置
  4. 阴阳师人数最多的服务器,《阴阳师》手游部分服务器合并公告
  5. Java中的三目运算符可能出现的问题
  6. arraylist下标从几开始_漫画:为什么计算机从 0 开始计数,而不是从 1 开始?
  7. 看着自己参与的自测,我简直要疯了…………
  8. springCloud—Eureka知识点总结
  9. winrar去弹窗广告激活办法!!
  10. c语言汉字属于什么类型_带你学习C语言—数据类型
  11. 兰博基尼推出全新混动超跑Revuelto
  12. Mac 怎么修改开机背景详解!
  13. 自媒体怎么快速入门?这几个技巧一定要掌握好
  14. 网络最大流和最小费用流
  15. 【超详细】多元线性回归模型statsmodels_ols
  16. 考眼力的游戏你们玩过什么?
  17. 东京工业大学计算机博士要求,东京工业大学要求
  18. B/S聊天室(websocket)
  19. 兄dei,帮我开一下门吧~
  20. ssd(Single Shot MultiBox Detector)代码之(五) 训练自己的数据集

热门文章

  1. [codevs 1906] 最长递增子序列问题
  2. java广告投放系统_[Spring cloud 一步步实现广告系统] 5. 投放系统配置+启动+实体类...
  3. 倒数日怎么设置起始日_起始价131亿!杭州江河汇流区85万方综合体招标延期
  4. 于python保留字的是_《于》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  5. nginx+keepalived互为主主高可用配置
  6. Android RecyclerView使用GridLayoutManager间距设置
  7. Oracle中查看最近被修改过的表的方法
  8. STL 容器 与 数据结构
  9. 算法录 之 复杂度分析。
  10. AngularJS深入(1)——加载启动