目录

1.interface:接口  实际上可以看做是一种规范

2.Java8中关于接口的新规范


1.interface:接口  实际上可以看做是一种规范

   1.1接口使用interface来定义
   1.2Java中,接口和类是并列的两个结构 
   1.3 JDK7及以前:只能定义全局常量和抽象方法
              >全局常量:public static final的.但是书写时,可以省略不写
             >抽象方法:public abstract的            
   1.4JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
   1.5接口中不能定义构造器的!意味着接口不可以实例化
   1.6Java开发中,接口通过让类去实现(implements)的方式来使用.
          如果实现类覆盖了接口中的所抽象方法,则此实现类就可以实例化
          如果实现类没覆盖接口中所的抽象方法,则此实现类仍为一个抽象类
   1.7 Java类可以实现多个接口   --->弥补了Java单继承性的局限性
          格式:class AA extends BB implements CC,DD,EE
   1.8 接口与接口之间可以继承,而且可以多继承
 

接口的具体使用,体现多态性。代码如下:

interface USB{
	//常量:定义了长、宽、最大最小的传输速度等
	
	void start();
	
	void stop();
        //静态方法,默认方法
	
}

class Flash implements USB{

	@Override
	public void start() {
		System.out.println("U盘开启工作");
	}

	@Override
	public void stop() {
		System.out.println("U盘结束工作");
	}
	
}

class Printer implements USB{
	@Override
	public void start() {
		System.out.println("打印机开启工作");
	}

	@Override
	public void stop() {
		System.out.println("打印机结束工作");
	}
	
}
class Computer{
	
	public void transferData(USB usb){
                USB usb = new Flash();  //多态的一种体现 父接口引用指向子类对象
		usb.start();
		
		System.out.println("具体传输数据的细节");
		
		usb.stop();
	}
	
	
}

2.Java8中关于接口的新规范

知识点1:接口中定义的静态方法,只能通过接口来调用。

知识点2:通过实现子类的对象,可以调用接口中的默认方法。
                 如果实现子类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法

知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没重写此方法的情况下,默                 认调用的是父类中的同名同参数的方法。-->类优先原则
知识点4:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,
                那么在实现类没重写此方法的情况下,报错。-->接口冲突。
                这就需要我们必须在实现类中重写此方法

 代码如下:

package InterfaceTest;

public class Test2 implements A,B{
    @Override
    public void show() {
        System.out.println("Test2");
    }
}
interface A{
    default void show(){
        System.out.println("A");
    }
}
interface B{
    default void show(){
        System.out.println("B");
    }
}

            

知识点5:java 8中抽象类与接口的异同

                相同点:1)都是抽象类型;

                              2)都可以有实现方法(以前接口不行);

                              3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

               不同点:1)抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

                              2)抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;

                              3)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 
 

知识点6:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法

具体测试代码:     

父类:

public class Fu {
    public void name(){
        System.out.println("我是爸爸");
    }
    public void eat(){
        System.out.println("我是爸爸 不给饭");
    }
}

 接口:

interface person{
    int age = 100;
    void show();
    //静态方法
    static int getAge(){
        return age;
    }
    //默认方法
    default void learn(){
        System.out.println("我爱学习");
    }
    //默认方法
    default void say(){
        System.out.println("中国加油");
    }
    default void name(){
        System.out.println("我是接口");
    }
    default void eat(){
        System.out.println("我是接口没饭吃");
    }

}
子类:
public class Test1 extends Fu implements person{
    public static void main(String[] args) {
        System.out.println(person.getAge()); //调用接口的静态方法  接口名.静态方法()
        Test1 t1  = new Test1();
        t1.learn();
        t1.say();
        t1.show();
    }
    @Override
    public void show() {
        eat();
        person.super.eat();
        name(); //调用自己的
        super.name(); //调用父类Fu的
        person.super.name(); //调用接口person默认方法   接口名.super.默认方法名();
    }

    @Override
    public void say() {
        System.out.println("武汉加油");
    }

    @Override
    public void name() {
        System.out.println("我是儿子");
    }
}

运行结果:

100
我爱学习
武汉加油
我是爸爸 不给饭
我是接口没饭吃
我是儿子
我是爸爸
我是接口