package com.atguigu.test08;
/*
* 1、Java8对接口进行了修改:
* Java8之前,接口中的成员只有两种:
* (1)全局的静态的常量:public static final,可以省略
* (2)公共的抽象的方法:public abstract,可以省略
*
* Java8之后,接口又增加了两种新成员:
* (3)静态方法:public static,不可以省略
* 调用方式:接口名.静态方法(实参列表)
* (4)默认方法:public default,不可以省略
*
* 2、为什么Java8要允许接口中定义静态方法?
* 是因为JDK发展了一段时间后,发现类库中,多了很多这样的成组的API:
* (1)Path接口和Paths工具类
* (2)Collection接口和Collections工具类
* .....
* 一般工具类中都是静态方法,这些静态方法,基本上都是为前面这个对应接口服务的。
* 这样的话,就会出现很多API,使得程序员的学习成本增加了,使用成本也增加了。
*
* 开始把这样的静态方法,直接挪到接口中定义就好了。减少了这样的工具类的出现。
*
* 3、为什么么Java8要允许接口中定义默认方法?
* 是因为有的时候,一个接口它的大多数实现类对接口的抽象方法的实现代码是一样,那么我们写好几次就太麻烦了。
* 即相当于,默认方法是原来的抽象方法有了一个默认实现。如果实现类的实现和接口一样,就不需要重写,如果不一样就重写即可。
*
* 4、冲突问题
* (1)当一个类同时实现了两个甚至更多个接口时,这些个接口中出现了方法签名相同的默认方法时,
* 那么我们必须在这个实现类中,做出选择。
* 选择一:保留其中一个,放弃另一个
* 选择二:两者都不用,完全重写一个
*
* (2)当一个类同时继承了父类,又实现了接口,那么当父类中出现了和接口中方法签名一样的方法时,怎么办?
* 那么我们怎么选择?
* 选择一:默认选择,编译器默认选择父类
* 选择二:改选保留接口的
* 选择三:完全自己重写
* */
public class TestInterface18 {
public static void main(String[] args) {
MyInter.test();
// MyInter my = new MyInter();//接口不能创建对象
// MyInter my = new InterImpl1();
// my.method();
Son s = new Son();
s.test();
}
}
interface MyInter{
public static void test(){
System.out.println("接口中的静态方法");
}
void fun();
public default void method(){
System.out.println("接口中的默认方法");
}
}
class InterImpl1 implements MyInter{
@Override
public void fun() {
System.out.println("aaaa");
}
}
class InterImpl2 implements MyInter{
@Override
public void fun() {
System.out.println("aaaa");
}
}
class InterImpl3 implements MyInter{
@Override
public void fun() {
System.out.println("bbbb");
}
//在类中,重写接口的默认方法是,default要去掉
@Override
public void method() {
System.out.println("重写接口的默认方法");
}
}
interface A{
public default void test(){
System.out.println("aaa");
}
}
interface B{
public default void test(){
System.out.println("bbb");
}
}
class C implements A,B{
//选择一:保留其中一个,放弃另一个
//在类中,重写接口的默认方法是,default要去掉
/* public void test(){
// A.super.test();//保留A接口的实现
B.super.test();//保留B接口的实现
}*/
public void test(){
System.out.println("ccc");
}
}
class Father{
public void test(){
System.out.println("ffff");
}
}
interface D{
public default void test(){
System.out.println("dddd");
}
}
class Son extends Father implements D{
//选择一:默认选择,保留父类的
//选择二:该选,保留干爹的
// public void test(){
// D.super.test();
// }
//选择三:完全自己重写
public void test(){
System.out.println("ssss");
}
}