一、接口笔记
1.接口是什么?
一种公共的规范标准
2.接口的数据类型与名称格式?
引用数据类型,大驼峰
3.接口中抽象方法没有方法体,即不包含大括号
4.抽象方法的修饰符必须为固定的两个关键字 public abstract,可以选择性的省略
5.接口不能直接使用,必须要有一个实现类来实现该接口
public class 类名 implements 接口一,接口二
6.接口的实现类要覆盖重写接口中的所有抽象方法
7.对于在idea中,实现类快速实现接口中所有抽象方法:将光标放在实现类上,Alt + Enter 选择第一项,选择所有抽象方法,然后点击OK
8.关于Override?
(1)当做注释用,一般用于覆盖重写,方便阅读
(2)编译器可以帮助验证@Override下面的方法是否是父类或者接口中所有的,如果不是则报错。如果想重写父类中的某个方法,如果没写@Override,而下面的方法又写错了,有时编译器是可以通过的,因为编译器以为这个方法是你子类中自己曾加的方法。
9.实现类要实现接口的所有抽象方法,如果没有,就要将该实现类定义为抽象类型
10java8之后开始支持在接口中定义默认方法,好处在于:在接口升级的时候(升级:为接口添加新的方法),如果添加是抽象方法,则就要去为所有实现该接口的类去添加新的抽象方法的重写覆盖,否则那些类就无法使用了。
11.接口中的默认方法会被实现类继承,也可以被实现类覆盖重写,实现类的对象可以直接调用,优先在当前类中寻找是否存在该方法。
12.java8开始支持接口中添加静态方法,就是可以共享的部分。
13.静态方法的使用一般为类名.静态方法直接完成调用,在接口中的使用方法为:接口名.静态方法。不能通过实现类的对象来调用接口中的静态方法
14.从java9开始,接口中允许定义私有方法。分为两种:
普通私有方法(针对java8的默认方法):解决多个默认方法之间重复代码的问题
private 返回值类型 方法名(参数列表)
静态私有方法:(针对java8的静态方法):解决多个静态方法之间重复代码的问题
private static 返回值类型 方法名(参数列表)
15.对于接口中的常量
定义格式:public static final 数据类型 常量名 = 常量值;
关键字说明:static -> 与对象无关、final -> 不能改变
命名规则:采用完全大写的命名规则,多个单词之间使用下划线连接
---------------------------------------------------------------------------------------------------------------------------------
在java9+版本中,接口的内容:(小结)
1.成员变量实际为常量
[public] [static] [final] 数据类型 常量名称 = 常量值;
注意:常量必须进行赋值,而且一但赋值后不能再改变;常量名完全大写,用下划线分隔
2.接口中最重要的是抽象方法
[public] [abstract] 返回值类型 方法名称(参数列表) {方法体}
注意:实现类要实现接口的所有抽象方法,除非为抽象类
3.从java8开始,接口中允许定义默认方法和静态方法
默认方法:
(1)格式:[public] default 方法名称(参数列表){方法体}
注意:默认方法被实现类继承,可以由实现类的对象直接调用,也可以在实现类中覆盖重写
(2)格式:[public] static 返回值类型 方法名(参数列表){方法体}
注意:静态方法只能通过接口名.方法调用,不能通过实现类对象调用
4.从java9开始,接口中允许定义私有方法:
(1)普通私有方法:private 返回值类型 方法名称(参数列表){方法体}
(2)静态私有方法:private static 返回值类型 方法名称(参数列表){方法体}
注意:private方法只有接口自己能使用,不能被外部调用
---------------------------------------------------------------------------------------------------------------------------------
二、代码部分
PS:一些知识点放在了代码段的注释里:
接口一:
package com.Coding.JavaSE.Demo2;
public interface MyInterfaceAbstract {
//抽象方法的定义
public abstract void methodAbs1();
public void methodAbs2();
abstract void methodAbs3();
void methodAbs4();
//对于方法三要素:返回值、方法名、参数列表 的选取可根据具体情况来定
//但对于关键字只能为 public abstract,可以选择性省略
//默认方法的定义
public default void methodDefault(){
System.out.println("接口中的静态方法!");
}
//静态方法的定义
public static void methodStatic(){
System.out.println("接口中的静态方法!");
//私有方法的定义 因为java9才能使用,但此时我使用的是java8 所以这部分只能注释起来
/* private void methodPDefault(){
System.out.println("接口中的普通私有方法!");
}
private static void methodPStatic(){
System.out.println("接口中的静态私有方法!");
}
*/
}
}
接口二:(为了实现多个接口)
package com.Coding.JavaSE.Demo2;
public interface MyInterfaceAbstract01 {
//定义一个常量
public static final int NUMBER = 99;
//定义一个抽象方法
public abstract void happyNess();
}
实现类:
package com.Coding.JavaSE.Demo2;
/*
对于接口的定义与使用测试
1.接口的定义:
public interface 接口名{
//接口内容
}
大驼峰命名 重点在于接口中的抽象方法
java7接口中可以包括常量、抽象方法 java8可以额外包含默认方法、静态方法 java9还额外包括私有方法
*/
import com.sun.javaws.IconUtil;
/*
实现接口:并完成对象的创建
1.不能直接创建接口的对象,要创建实现类的对象,然后调用覆盖后的抽象方法
2.实现类要覆盖重写接口中的所有抽象方法,如果并没有实现接口的所有方法
则该实现类要设计为抽象类,属于一种继承关系,由继承它的某个子类来实现剩余的抽象方法
从java8开始,支持接口中写默认方法(默认长发可以写方法体)
1.默认方法的定义
public default void 方法名(参数列表){方法体} public可以省略不写,但default不能省略
2.接口中的默认方法可以解决接口升级的问题(升级:接口中添加新的方法)
3.默认方法会被接口的抽象函数继承下去的,可以由接口的实现类的对象直接调用,也可以被实现类覆盖
重写,在实现类调用的时候,有限在当前类中寻找是否有该方法
从java8开始,支持接口中定义静态方法(static 意为共享)
1.静态方法的定义
public static 返回值类型 方法名称(参数列表){方法体}
2.不能通过接口实现类的对象来调用接口中的静态方法,应该通过接口名称.静态方法直接完成调用
从java9开始,接口中允许定义私有方法
1.私有方法的两种类型:
(1)普通私有方法:解决多个默认方法之间重复代码问题
private 返回值类型 方法名称(参数列表)
(2)静态私有方法:解决多个静态方法之间重复代码问题
private static 返回值类型 方法名(参数列表)
2.出现私有方法的原因:为了解决接口中代码块重复问题,如果再定义一个默认方法来存储接口中其
它默认方法的公共部分,则在接口的实现类对象也可以直接调用这个公共部分的默认方法,但开发者
只想让该接口中的方法使用该公共部分的方法,所以就产生了私有方法
3.接口中也可以定义”成员变量“,因为这个变量是静态的,所以可以理解为常量
(1)常量的定义格式: public static final 数据类型 常量名称 = 数据值
可以省略public、static、final,但是不能省略初始化(接口中的常量一定要赋值)
(2)调用方式: 接口名称.常量()
(3)两个关键字:
使用static关键字,说明与对象无关
使用final关键字,说明不能改变
(4)命名规则:常量名使用完全大写的命名规则,如果有多个单词组成,这几个单词之间使用下划线连接
零零散散
1.接口中没有静态代码块,也没有静态方法
2.一个类只能继承一个类,但能实现多个接口
3.对于多个接口中存在相同抽象方法时,在实现类只需要实现一次即可
4.在实现类中要覆盖重写所有抽象方法,否则只能为抽象类
5.有冲突的默认方法一定要覆盖重写
6.如果实现类的父类方法与接口方法出现了冲突:会自动选择有点父类(Java中继承优先于接口实现)
接口之间的多继承
1.格式:public interface 接口子 extends 接口A, 接口B, ...
2.(1)多个父接口的抽象方法重复没有关系,因为没有方法体
(2)多个父接口的默认方法出现重复,子接口一定要将该默认方法覆盖重写,而且不能省略default
*/
public class DemoInterface implements MyInterfaceAbstract, MyInterfaceAbstract01{
@Override
public void methodAbs1() {
System.out.println("小艺小艺,XX是谁儿子?");
}
@Override
public void methodAbs2() {
System.out.println("亲爱的主人,XX是您儿子呀!");
}
@Override
public void methodAbs3() {
System.out.println("小艺小艺,那他的外号叫什么?");
}
@Override
public void methodAbs4() {
System.out.println("嘿嘿,是狗ji呀!");
}
@Override
public void happyNess() {
System.out.println("第二个接口的抽象方法!");
}
public static void main(String[] args) {
//创建实现类的对象
DemoInterface imp = new DemoInterface();
//调用覆盖后的方法
imp.methodAbs1();
imp.methodAbs2();
imp.methodAbs3();
imp.methodAbs4();
imp.happyNess();
//调用接口中的默认方法
imp.methodDefault();
}
}