一、接口简介1、概述:接口是多个类的公共规范;
代码语言:javascript复制接口是一种规范,实现某一接口就意味着遵循该接口的规范;接口是一种引用类型;
代码语言:javascript复制引用类型:类、接口、数组;接口最重要的内容是其中的抽象方法;
2、接口包含的内容java7
①常量;
②抽象方法;
java8
③默认方法;
④静态方法;
java9
⑤私有方法;
二、接口的使用1、接口抽象方法使用注意①接口中的抽象方法必有两个固定的修饰符,即public和abstract,所以可以省略;
②抽象方法的三要素可以随意定义;
接口抽象方法使用的步骤①接口不能直接使用,必须有一个“实现类”来“实现”该接口;
②接口的实现类必须重写接口中的所有抽象方法(除非该实现类是抽象类);
③创建实现类的对象进行使用;
代码实现(抽象方法):接口:
代码语言:javascript复制public interface myInterface {
public abstract void say();
public abstract void doSth();
public abstract void go();
public abstract void jump();
}实现类:
代码语言:javascript复制public class MyInterfaceImpl implements myInterface {
@Override
public void say() {
System.out.println("say方法");
}
@Override
public void doSth() {
System.out.println("doSth方法");
}
@Override
public void go() {
System.out.println("go方法");
}
@Override
public void jump() {
System.out.println("jump方法");
}
}Test测试类:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
MyInterfaceImpl myInterface = new MyInterfaceImpl();
myInterface.doSth();//doSth方法
myInterface.go();//go方法
myInterface.jump();//jump方法
myInterface.say();//say方法
}
}自己产生的疑问:接口的抽象实现类的子类是不是要实现接口和抽象实现类的所有方法,代码验证结果:是的!
3、接口默认方法的使用注意:①默认方法不强制被重写,但可以被重写;
代码语言:javascript复制备注:
接口 ——> 抽象实现类 ——> 抽象实现类的子类
(下级重写了默认方法会将上级的覆盖掉)②默认方法可以被实现类对象直接调用;
③public是固定修饰符,可以省略;
使用:接口:
代码语言:javascript复制public interface myInterface {
public default void talk(){
System.out.println("talk默认方法");
}
}实现类:
代码语言:javascript复制public class MyInterfaceImpl implements myInterface {
//实现类可以重写默认方法,也可以不重写
@Override
public void talk() {
System.out.println("重写的默认方法");
}
}Test测试方法:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
MyInterfaceImpl myInterface = new MyInterfaceImpl();
myInterface.talk();//重写的默认方法
}
}4、接口静态方法的使用注意:①不能通过接口的实现类对象直接调用静态方法;
②通过接口名称调用接口内的静态方法;
③public可以省略;
④静态方法不能被实现类重写,也不用被实现类重写;
代码语言:javascript复制④静态方法不能被实现类重写,也不用被实现类重写;
备注:
1、接口的抽象实现类写了一个与接口里面一模一样的静态方法,不会对接口里面的静态方法产生影响;
2、接口的抽象实现类的子类写了一个与接口和接口的抽象实现类里面一模一样的静态方法,同样不会对接口和接口的抽象实现类里面的静态方法产生影响;
3、在使用的时候都可以直接使用类名或接口名调取,相互之间不会影响;使用:接口:
代码语言:javascript复制public interface myInterface {
public static void talk(){
System.out.println("talk静态方法");
}
}实现类(可有可无):
代码语言:javascript复制public class MyInterfaceImpl implements myInterface {
//不能重写,也不用重写
}Test测试类:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
//错误写法
// MyInterfaceImpl myInterfaceImpl = new MyInterfaceImpl();
// myInterface.talk();//重写的默认方法
//正确写法:直接使用接口名称调用
myInterface.talk();//talk静态方法
}
}5、接口私有方法的使用简介:在接口中,我们需要抽取出来一个共有方法,来解决多个默认方法和静态方法之间重复代码的问题,但这个不能让实现类使用,这就产生了私有方法。(私有方法是给接口之内默认方法和静态方法调取的方法,其他地方不可使用)
分类:普通私有方法:解决多个默认方法之间重复代码的问题;(注意:普通私有方法不能使用default)
代码语言:javascript复制 //普通私有方法
private String getName01(){
return "";
}静态私有方法:解决多个静态方法之间重复代码的问题;
代码语言:javascript复制 //静态私有方法
private static String getTime01(){
return "";
}使用:接口:
代码语言:javascript复制public interface myInterface {
public static void talk1(){
System.out.println("talk1静态方法");
haha();
}
public static void talk2(){
System.out.println("talk2静态方法");
haha();
}
private static void haha(){
System.out.println("哈哈哈");
System.out.println("呵呵呵");
System.out.println("嘿嘿嘿");
System.out.println("哼哼哼");
}
public default void say1(){
System.out.println("say1默认方法");
hehe();
}
public default void say2(){
System.out.println("say2默认方法");
hehe();
}
//注意:普通私有方法不能使用default
private void hehe(){
System.out.println("哈哈哈");
System.out.println("呵呵呵");
System.out.println("嘿嘿嘿");
System.out.println("哼哼哼");
}
}实现类:
代码语言:javascript复制public class MyInterfaceImpl implements myInterface {
//不能重写静态方法,可以重写默认方法
}测试类:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
MyInterfaceImpl myInterfaceImpl = new MyInterfaceImpl();
myInterfaceImpl.say1();
// say1默认方法
// 哈哈哈
// 呵呵呵
// 嘿嘿嘿
// 哼哼哼
myInterfaceImpl.say2();
// say2默认方法
// 哈哈哈
// 呵呵呵
// 嘿嘿嘿
// 哼哼哼
myInterface.talk1();
// say1静态方法
// 哈哈哈
// 呵呵呵
// 嘿嘿嘿
// 哼哼哼
myInterface.talk2();
// say1静态方法
// 哈哈哈
// 呵呵呵
// 嘿嘿嘿
// 哼哼哼
}
}6、接口中的常量的使用注意:①必须使用public static final修饰,因为是固定的,所以可以省略;
②接口中的常量必须赋值,一旦赋值,不可修改;
③常量名要完全大写;
使用:接口:
代码语言:javascript复制public interface myInterface {
//public static final可以省略
public static final int A = 10;
}Test测试类:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
//直接使用接口名调用
System.out.println(myInterface.A);//10
}
}7、继承父类并实现多个接口的时候注意:①接口是没有静态代码块和构造方法的;
②一个类的直接父类是唯一的,但可以实现多个接口;
③实现类实现了不同接口的同一默认方法,那么实现类必须重写该方法;
④实现类实现了不同接口的同一静态方法,没什么影响,因为静态方法是通过接口名调用的,用谁的就谁调用即可;
⑤实现类必须重写父类以及所实现接口的所有抽象方法,除非实现类本身是抽象类;
8、接口之间的多继承注意:①类与类之间是单继承的,即一个类只能有一个直接父类;
②类与接口之间是多实现的,即一个类可以实现多个接口;
③接口与接口之间是多继承的,即一个接口可以继承多个接口;
代码语言:javascript复制public interface fruit extends fruit01,fruit02{}④实现类必须实现所有的抽象方法;
⑤子接口继承不同接口的同一静态方法不用重写(通过接口名调用,影响不到);
⑥子接口继承不同接口的同一默认方法必须重写;
⑦子接口继承不同接口的同一抽象方法是否重写无所谓;
使用:接口1:
代码语言:javascript复制public interface myInterfaceA {
public default void say(){
System.out.println("myInterfaceA的默认say");
}
public static void say1(){
System.out.println("myInterfaceA的静态say1");
}
public abstract void say2();
}接口2:
代码语言:javascript复制public interface myInterfaceB {
public default void say(){
System.out.println("myInterfaceB的默认say");
}
public static void say1(){
System.out.println("myInterfaceB的静态say1");
}
public abstract void say2();
}接口3:
代码语言:javascript复制public interface myInterface extends myInterfaceA,myInterfaceB {
//say默认方法必须重写
@Override
default void say() {
System.out.println("myInterface重写的默认say");
}
}实现类:
代码语言:javascript复制public class MyInterfaceImpl implements myInterface{
@Override
public void say2() {
System.out.println("实现类MyInterfaceImpl重写的say2");
}
}Test测试类:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
MyInterfaceImpl myInterfaceImpl = new MyInterfaceImpl();
myInterfaceImpl.say();//myInterface重写的默认say
myInterfaceImpl.say2();//实现类MyInterfaceImpl重写的say2
myInterfaceA.say1();//myInterfaceA的静态say1
myInterfaceB.say1();//myInterfaceB的静态say1
}
}9、补充检查一个对象是否实现了某接口代码语言:javascript复制对象名 instanceof 接口名
返回值是布尔值;三、接口相对于抽象类的好处多继承;