前言:
经过这些天的学习,来到了Java基础内容中关于接口的这一部分,下面分享一下我对接口的理解。
接口的定义:
-
使用关键字 interface 来定义接口
-
继承接口使用关键字 implements
-
在JDK8以前的版本接口内部只允许定义 被public static final 的全局常量,以及抽象方法
-
在JDK8的版本以后,接口中还可以定义静态方法以及默认方法
接口的规范:
- 接口属于定义了一种规范,就像法律一样我们每个人都得遵守,而继承接口的实现类也必须遵守接口的规则
- 接口的实现类如果没有重写接口中的所有抽象方法,那么这个实现类一定是个抽象类,实现类重写了接口中所有的抽象方法,此实现类才能被实例化
- 接口中没有构造器,因为接口不能被实例化,抽象类中也没有构造器
- 当接口被实现类继承时,实现类不能修改接口中的属性,接口中的属性被 public static final 所修饰是不可修改的
- 接口的出现打破了Java定义的单继承,意味着一个类可以同时继承多个接口
接口的使用体现java的多态性:
- 当我们在使用接口去时,继承接口的实现类去new对象赋给接口的引用,去调用接口中被重写的方法。
public class Baseinterfaceuse {
public static void main(String[] args) {
USB usb=new Printer();//多态性
Printer printer=new Printer();
usb.start();
printer.method();
usb.stop();
}
}
interface USB{
public abstract void start();//定义一个USB的启动方法
public abstract void stop();//定义一个USB的停止方法
}
class Printer implements USB {
@Override
public void start() {
System.out.println("USB启动");
}
public void method (){
System.out.println("连接的具体细节");
}
@Override
public void stop() {
System.out.println("USB停止");
}
}
接口的新特性:
- JDK8以后的版本接口中可以定义默认方法和静态方法,接口中定义的静态方法只能通过接口.方法名来调用,而默认方法可以实现类来调用
- 接口中默认方法的调用,如果实现类重写了接口中的默认方法,那么我们可以通过(接口名.+super.+方法名)去调用接口中的被重新的方法
- 如果实现类实现了多个接口,而这多个接口定义了同名同参数的默认方法,在实现类中没有重写这个默认方法时会产生接口冲突
- 类优先原则:(针对方法来说,不针对属性) 如果实现类所继承的父类和实现的接口中声明了同名同参数的方法 那么子类在没有重写此方法的情况下,默认调用父类中的方法,而不是接口中的方法
interface NewInterface {
public static void methhof1() {
System.out.println("NewInterface中的method1");
}
public default void method2() {
System.out.println("NewInterface中的method2");
}
default void method3() {
System.out.println("NewInterface中的method3");
}
}
interface CompareB {
default void method3() {
System.out.println("CompareB中的method3");
}
}
public class Superclass {
public void method3() {
System.out.println("superclass中的method3 "); }
}
}
class Sub extends Superclass implements NewInterface,CompareB{
@Override
public void method2() {
System.out.println("Sub类中重写的method2");
}
@Override
public void method3() {//重写metho3方法
System.out.println("Sub类中重写的method3");
}
public class SubclassText {
public static void main(String[] args) {
Sub sub=new Sub();
sub.method3();//如果Sub类中没有重写 method3这个方法,此时编译器会报错出现接口方法的碰撞,编译器不能识别 ,此时重写和输出的是父类中重写的method3方法
Newinterface.method1;//调用接口中的静态方法 接口中的静态方法不会被继承
}
}
满满的干货呀,希望自己会常来复习这些知识。