前言:java8之后,接口中的抽象方法可以有方法体,这是一个重大的改变。但我个人很少看到有人使用此特性,不过面试有时候会问到相关的问题
1、接口中public修饰的非静态方法并不能写方法体,protected修饰的方法也不行
2、接口中没有private修饰的方法
当然,这不属于java8的新特性,这里只是做一个介绍。原因是我们创建一个接口就是为了让类去实现这个接口,而private修饰的方法只属于当前类,不能被实现,这就与定义冲突了。所有接口中没有private修饰的方法
3、default修饰或者public修饰的静态方法可以写方法体
4、当一个类同时继承类A又实现接口B时,并且A和B中有同名的方法,它会优先调用类中的方法
/**
* Author: 徐志
* Date: 2020/8/2 15:39
*/
public interface MyInterface {
default String getName(){
return "哈哈";
}
}
/**
* Author: 徐志
* Date: 2020/8/2 15:43
*/
public class MyClass {
public String getName(){
return "笨蛋";
}
}
/**
* Author: 徐志
* Date: 2020/8/2 15:43
*/
public class SubClass extends MyClass implements MyInterface {
}
/**
* Author: 徐志
* Date: 2020/8/2 15:43
*/
public class Test {
public static void main(String[] args) {
SubClass sc=new SubClass();
System.out.println(sc.getName());
}
}
运行结果
5、当一个类同时实现接口A和接口B,并且A和B中方法同名,你需要在类中重写该方法
/**
* Author: 徐志
* Date: 2020/8/2 15:39
*/
public interface MyInterface {
default String getName(){
return "哈哈";
}
}
/**
* Author: 徐志
* Date: 2020/8/2 17:25
*/
public interface YourInterface {
default String getName(){
return "熊大";
}
}
/**
* Author: 徐志
* Date: 2020/8/2 17:27
*/
public class SubsClass implements MyInterface,YourInterface {
@Override
public String getName() {
return MyInterface.super.getName();
}
}
/**
* Author: 徐志
* Date: 2020/8/2 17:27
*/
public class Test2 {
public static void main(String[] args) {
SubsClass sc=new SubsClass();
System.out.println(sc.getName());
}
}
6、接口和抽象类的异同
相同点:
- 都不能被直接实例化,如果如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象
- 抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类
不同点:
- 抽象类可以继承一个类实现多个接口;接口只可以继承一个或多个接口
- 接口中的变量默认是public static final修饰。抽象类中的变量为普通变量
- 接口中的方法默认是public abstract 修饰。抽象类中可以含有非抽象方法
- 抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为规范
附上本人微信公众号二维码