对Java核心技术卷的一个简单笔记
总结一下基础阶段接口常见的问题
接口 ,由于Java没有多继承,只有单继承,那么需要多个类同时满足一些需求的时候怎么办呢。这就是接口的设计意义,它是希望符合这个接口的类满足的一些需求。可以看作是一种规范。
public interface Comparable {
}
[修饰符] interface 接口名{
// 公共的静态常量
// 公共的抽象方法
// 公共的默认方法(JDK1.8 以上)
// 公共的静态方法(JDK1.8 以上)
// 私有方法(JDK1.9 以上)
}
为什么Java8以后允许公共的静态方法,和默认方法呢
静态方法:
因为之前的标准类库设计中,有很多 Collection/Colletions 或者Path/Paths 这样成对的接口和类,后面的类中都是静态方法,而这些静态方法都是为前面的接口服务的,那么这样设计一对 API,不如把静态方法直接定义到接口中使用和维护更方便。
默认方法:
(1)我们要在已有的老版接口中提供新方法时,如果添加抽象方法,就会涉及到原来使用这些接口的类就会有问题,那么为了保持与旧版本代码的兼容性,只能允许在接口中定义默认方法实现。比如:Java8 中对Collection、List、Comparator 等接口提供了丰富的默认方法。
(2)当我们接口的某个抽象方法,在很多实现类中的实现代码是一样的,此时将这个抽象方法设计为默认方法更为合适,那么实现类就可以选择重写,也可以选择不重写。
Tips:Java9可以用私有方法
使用的的很有限,因为private导致只能在几口本身的方法中使用,用途有限,更多是最为接口中其他方法的辅助方法
(1)接口不是类。不可以用new实例化接口
(2)可以声明接口,用实现了接口的类来实现
(3)可以用instanceof‘判断对象是都属于哪个接口
(4)接口中所有的方法被设置为public,所有变量总是默认为public static final
接口(interface)和抽象类最大的区别是多继承和单继承的问题导致的。引入接口的原因也是因为Java是单继承语言,抽象类有着和接口类似的功能,但是限制于单继承。一个类只能继承一个抽象类但是却可以实现多个接口,这就是接口类似于多继承功能的优势。一般来说能设计成接口尽量设计成接口。抽象类和接口还有一些具体的不同。接口可以继承大多数多继承的优势,同时避免多继承的复杂性和低效性。
(1)接口可以继承多个接口,关键字是extends,
(2)可以同时继承父类和实现接口,继承关键字在前,实现关键字在后
(3)接口与实现类对象构成多态引用,实现类实现接口,类似于子类继承父类.
因此,接口类型的变量与实现类的对象之间,也可以构成多态引用。通过
接口类型的变量调用方法,最终执行的是你 new 的实现类对象实现的方法体。
(4)接口不能直接创建对象,但是可以通过接口名直接调用接口的静态方法和静态常量
(5)对于接口的静态方法,直接使用“接口名.”进行调用即可
也只能使用“接口名."进行调用,不能通过实现类的对象进行调用
对于接口的抽象方法、默认方法,只能通过实现类对象才可以调用
接口不能直接创建对象,只能创建实现类的对象
(1) interface A extends 接口1,接口2 {
}
(2)class B extends C implements 接口1,接口2 {
}
(3)不粘贴具体代码,比较长,自己可以下去谢谢
(4)接口.静态方法名()
接口.静态变量
我们思考一下这个问题,一个类同时可以继承一个父类和实现多个接口。那么,冲突主要来自如下几种情况:
(1)对于父类和接口之间的同名冲突
遵守的是类优先原则,当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的抽象方法重名,子类就近选择执行父类的成员方。
(2)实现的多个接口之间的同名冲突。
当一个类同时实现了多个父接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?
当一个子接口同时继承了多个接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?
(1)当子类继承父类又实现父接口,而父类中存在与父接口常量同名的成员变量,并且该成员变量名在子类中仍然可见。
通过“接口名.变量名"的方法引用父接口的成员变量
(2)当子类同时实现多个接口,而多个接口存在相同同名常量。
此时在子类中想要引用父类或父接口的同名的常量或成员变量时,就会有冲突问题。
通过“super.变量名"的方法引用父类的成员变量