学习总结:
链接:【Java基础、springboot、springcloud、docker 等,学习目录】
注意:本文所有观点都是针对JDK1.7的,忽略了1.8中接口默认方法及静态方法的情况。
一、接口:
// 定义格式
interface interfaceName {
// 属性 public static final
String name = "Ron";
// 抽象方法 public abstract
String getName();
}
// 使用方式 implements 实现
class User implements interfaceName {
public String getName(){
return interfaceName.name;
}
}
接口的设计思想:
1、拓展功能,哪个类需要改接口的功能,实现就可以了。
2、定义约束规范,接口其实就是暴露出来的规格。
3、程序解耦。
4、解决java单继承的弊端,接口可以多实现。
规范: 父类中定义事物的基本功能,接口中定义事物的拓展功能。
二、注意点:
1、接口是一个特殊的类,编译生成 .class 文件(javap查看)。
2、一个类可以实现多个接口,非抽象类需将接口中所有的方法都实现(JDK1.8中默认方法、静态方法除外),抽象类可实现可不实现。
3、接口中成员变量默认修饰符:public static final(可省略,编译默认加上),即接口中的成员变量都是常量(需赋初始值),调用方式:【接口名·变量】、【接口实现类·变量】、【实现类对象·变量】。
4、接口中成员方法默认修饰符:public abstract(可省略,编译默认加上)。
5、接口不能实例化。
6、接口没有构造方法(成员变量都是常量,方法都是抽象的,注意与抽象类中的构造方法区别,抽象类中的构造方法是给子类创建对象时初始化父类属性的)。
三、类、接口之间的关系:*
class A { }
class B { }
interface C { }
interface D { }
// 以下几种情况:
1、class E extends A, B { } 错误
2、class E implements C, D { } 正确
3、class E extends A implements C, D { } 正确
4、interface F extends C, D { } 正确
// 当某非抽象类实现了F接口,需将C、D、F中的接口全部实现。
问题:单继承、多实现解释:
1、class E extends A, B { } 错误:A、B类中可能出现同名的方法,E继承之后不知道调用哪一个,故java不支持多继承。
2、class E implements C, D { } 正确:C、D接口中若出现同名的方法,都是需要到实现类E中去具体实现的(即,具体的方法体只有一种),当对象在调用该同名的方法时,调用的是实现类中的具体方法,故,java支持多实现。
3、Java8 接口中被default修饰的方法(默认方法)具有方法体,接口实现类可不实现,但是被实现的多个接口中出现了同名的默认方法,其接口实现类需要重写该默认方法。
抽象类和接口的区别:
相同点:
1、都是位于继承的顶端、用于被其他类实现或继承。
2、包含抽象方法,其子类必须重写这些抽象方法才能实例化。
不同点:
推荐一篇抽象类和接口的区别相关文章:(注意相关观点也未涉及到JDK1.8中默认方法)
https://www.cnblogs.com/burns/p/4113527.html