1、Java中不支持类的多重继承,有了接口,就可以达到实现多重继承的效果,因为接口可以多继承
2、有时侯,我们需要抽取一些具有共同行为特性的事物,但是它们又没有“is a”的关系,如:手机、电脑、电视机、相机、打印机、摄像头等,它们都支持USB链接。我们想将它们实现USB功能,如果用类继承类去造的话显然就不合适。然而这些电子设备它不是简简单单的USB,这时候我们就可以通过造一个USB接口,将它分装起来,再通过造具体实现类去实现相应接口的功能。
3、接口和类 在Java中,我们可以说是并列的结构,有时候我们也形象的叫接口为接口类
2、接口的好处1、Java类可以实现多个接口>>>><<<<而类继承类只能实现单个继承,接口就弥补了Java中单继承的局限性
2、接口与接口之间可以继承,而且还可以多继承
interface Jiekou{
void run();
public abstract void walk();
static void StaticMethod() {
System.out.println("定义静态方法");
}
default void DefaultMethod() {
System.out.println("定义默认方法");
}
}
interface Jiekou2 extends Jiekou{ //子接口继承父接口
void go();
@Override //还可以重写父接口的方法
default void DefaultMethod() {
Jiekou.super.DefaultMethod();
}
}
interface Jiekou1{
static void StaticMethod() {
System.out.println("定义静态方法");
}
default void DefaultMethod() {
System.out.println("定义默认方法");
}
}
interface Jiekou2 {
void go();
}
interface Jiekou3 extends Jiekou,Jiekou2{//接口多继承
}
3、接口的定义:
1、接口使用interface关键字来定义
2、java中,接口和类是并列的两个结构
3、定义接口,就是定义接口中的成员
interface Jiekou{ //定义接口
int i1= 10;
public static final int i2=100;
//两个全局常量的定义,一个省略了前缀“public static final”,一个没有,都一样,不影响
void run();
public abstract void walk();
//两个抽象方法的定义,一个省略了前缀“public abstract”,一个没有,都一样,不影响
}
拓展:
1、JDK7及以前,接口中只能定义全局常量和抽象方法
全局常量:public static final ... 但是书写时可以省略不写
抽象方法:public abstract... 也可以省略
这里解释一下为什么可以省略不写,因为接口机制已经明确了只能定义“全局”常量,所以如果你定义了常量(不加public static final修饰),它会默认为是全局常量 ,也就是系统它会默认在你的代码前面加一个public static final。抽象方法同理
2、JDK8及之后,除了定义全局常量和抽象方法之外,还可以定义静态(static)方法、默认(default)方法>>>后面会解释
4、静态(static)方法、默认(default)方法(插入解释)1、静态方法只能通过接口名调用,不可以通过实现类或者实现类的对象调用
2、默认方法只能通过接口实现类的对象来调用
3、我们是不能重写静态方法的,重写只对非静态方法有用,但是静态方法可以被继承
4、实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写(看5)
5、如果接口中的默认方法不能满足某个实现类的需要,那么实现类可以覆盖默认方法,也就是重写相应默认方法
6、由于java中一个类支持实现多个接口,如果多个接口存在同样的static和default方法会发生什么?(7、8解释)(注)
7、如果两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时不会产生错误,因为JDK8及以后只能通过接口类来调用接口中的静态方法,所以对于编译器来说是可以区分的(注)
8、如果两个接口中的默认方法定义的一模一样,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败(注)
interface Jiekou{
int i1= 10;
public static final int i2=100;
void run();
public abstract void walk();
static void StaticMethod() { //定义静态方法
System.out.println("定义静态方法");
}
default void DefaultMethod() { //定义默认方法
System.out.println("定义默认方法");
}
}
我遇到的问题(可以直接看第四点):
1、我知道接口中静态方法不能被重写的情况下,我去验证了一下,我在一个子类里面重写了该静态方法,程序没有报错,然后我运行时,它是直接运行的我子类重写的方法
2、我用接口名去调用接口中的方法,输出的是接口中的方法;我用对象名去调用类中所谓“重写”的方法,输出的是类中的方法
3、到现在我的描述你可能有点懵,没事,你不用太懂
4、就是我发现我实现类中所谓“重写”的静态方法可以和接口中的静态方法重名
5、定义接口的注意事项1、接口中不能定义构造器,意味着接口不能实例化对象
2、Java开发中,接口通过造“实现类”的方式来实现(implements)及使用,如果实现类实现(注:覆盖、重写都是不严谨的叫法,原则是implements)了接口中的所有方法,则该实现类就可以实例化,如果实现类没有实现接口中的所有方法,则此实现类仍是一个抽象类(这一点有点类似抽象类继承的知识),编码时,就要在前面加上abstract关键字修饰才不会报错
6、类继承接口的格式:class A extends B implements CC,DD,EE(A是子类,B是父类,CC、DD、EE都是不同的接口)
class ClassSuper{ //定义父类
void show() {
System.out.println("你好呀");
}
}
interface Jiekou{ //定义接口
void run();
public abstract void walk();
}
class ClassSub extends ClassSuper implements Jiekou{ //定义子类,并继承父类以及实现接口
void eat() {
System.out.println("好想干饭");
}
@Override //重写接口方法
public void run() {
System.out.println("我想跑步");
}
@Override //重写接口方法
public void walk() {
System.out.println("我想走路");
}
}
7、接口具体的使用
1、请看我下一篇博客
2、内容:简单工厂模式,抽象工厂模式,代理工厂模式的实际应用
8、接口具体使用的意义:1、体现了多态性
2、接口实际上可以看成是一种规范,接口的主要用途就是被实现类实现
3、项目的具体需求是多变的,我们要以不变应万变才能从容开发,此处的“不变”就是规范,因此,我们开发项目往往都是面向接口编程
4、类继承接口并不是 “是不是”的关系,而是“能不能”的关系,它是继承并实现接口的功能



