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、类继承接口并不是 “是不是”的关系,而是“能不能”的关系,它是继承并实现接口的功能
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)