目录
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
我爱学习
武汉加油
我是爸爸 不给饭
我是接口没饭吃
我是儿子
我是爸爸
我是接口