接口就是多个类的公共规范 接口中最重要的就是抽象方法 接口可以包括:
-
常量、抽象方法(Java7)
-
默认方法、静态方法(Java8)
-
私有方法(Java9)
接口的抽象方法
-
接口不能直接使用,必须有一个"实现类"来"实现"该接口
-
接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
public interface My_interface_abstract {
public abstract void method();
}
public class My_interface_abstract_Impl implements My_interface_abstract {
@Override
public void method() {
System.out.println("特朗普");
}
}
public class test {
public static void main(String[] args) {
var impl = new My_interface_abstract_Impl();
impl.method();
}
}
接口的默认方法
设想一个场景
public interface My_interface_default {
public abstract void method();
}
public class My_interface_impl implements My_interface_default{
@Override
public void method() {
System.out.println("特朗普");
}
}
这段代码已经投入使用。但如果想在My_interface_default方法中再添加一个抽象类,那不就又要在已经使用的代码中再覆盖重写新的抽象类了吗?为了避免这种情况,我们就用到了默认方法。
public interface My_interface_default {
public abstract void method();
public default void method1(){
System.out.println("拜登");
}
}
public class My_interface_impl implements My_interface_default{
@Override
public void method() {
System.out.println("特朗普");
}
}
public class test {
public static void main(String[] args) {
var impl = new My_interface_impl();
impl.method();
impl.method1();
}
}
//输出特朗普 拜登
默认方法也可以进行覆盖重写,输出结果是覆盖重写后的结果。
接口的静态方法 注意事项: 静态方法的使用不需要通过对象来调用,而是通过接口名称直接调用其中的静态方法。
public interface My_interface_static {
public static void method(){
System.out.println("特朗普");
}
}
public class test {
public static void main(String[] args) {
My_interface_static.method();
}
}
接口的私有方法 当我们需要抽取一个公有方法用来解决两个默认方法之间重复代码的问题,但这个公有方法不应该让实现类使用,即这个公有方法应该是私有化的。 私有方法,解决多个默认方法之间重复代码问题
public interface My_interface_private {
public default void method() {
System.out.println("默认方法特朗普");
method1();
}
private void method1() {
System.out.println("默认方法拜登");
}
}
public class Cat implements Animal {
}
public class test {
public static void main(String[] args) {
var cat = new Cat();
cat.method(); //输出默认方法特朗普 默认方法拜登
}
}
这样,就可以让method1()只属于method()。
接口中定义“成员变量”,从效果上永远是个常量
继承父类并实现多个接口 若一个类的直接父类中的方法,和接口中的默认方法发生冲突,则优先用父类中的方法。
public class Fu{
public void method(){
System.out.println("特朗普");
}
}
public interface Impl{
public default void method(){
System.out.println("拜登");
}
}
public class Zi extends Fu interface Impl{
}
public class test {
public static void main(String[] args) {
var zi = new Zi();
zi.method(); //输出特朗普
}
}