一,抽象类:
用abstract修饰的类称为抽象类;抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类或者接口;抽象类的子类要么是抽象类,要么实现所有父类的抽象方法;
抽象类的成员方法的特点:抽象方法表示的是强制要求子类做的事;非抽象方法表示的是子类继承的事,提高了代码的复用性;
一个抽象类没有抽象方法的目的是:不让其他类创建本类多项,让其子类完成创建对象;
二,接口:
是比抽象类更为抽象的”类”,类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements;接口打破了类的单继承的局限性;
定义格式:interface 接口名{ }
成员变量:只能是常量并且是静态的公共的,final关键字可以不加;默认修饰符:public static final
构造方法:接口中没有构造方法
成员方法:Java 1.8之前只能是抽象方法(之后可以有静态实例方法,默认的实例方法 待认证);默认修饰符 public abstract
类与类,类与接口,接口与接口之间的关系:
类与类:是继承关系,只能单继承,可以多层继承。
类与接口:是实现关系,可以单实现也可以多实现;
接口与接口:是继承关系,可以单继承,也可以多继承;例如 interface A extends B,C
抽象类和接口的区别
抽象类:
成员变量:可以是变量,也可以是常量;
构造方法:有
成员方法:可以是抽象的,也可以是非抽象的;
接口:
成员变量:只能是常量
成员方法:只能是抽象方法
设计理念的区别
抽象类:被继承实现的是:“is a”的关系(继承关系 是一个);抽象类中定义的是该继承系统的共性功能。即父类和派生子类在概念上的本质是相同的(父子关系,血缘联系,很亲密)。例如:玻璃杯、塑料杯都是杯子。
接口:被实现的是:“like a”的关系;接口中定义的是实现体系中扩展功能(组合关系 像一个);即接口与实现类的关系只是实现了定义的行为,并无本质上的联系(契约关系,很淡漠的利益关系)。例如:空调继承于制冷机,但它同时有加热功能,那么你应该把让空调继承制冷机类,并实现加热接口。
说到is-a和like-a 不得不说 has-a
has-a 表示的一种从属关系(聚合关系 有一个)例如:汽车由发动机,底盘,车身,电气设备等组成,那么应该把发动机,底盘这些类聚合成汽车。
类单继承相当于亲爹(亲爹是单继承),接口多实现相当于干爹(干爹多实现);
总结:设计理念的区别从如何选择使用抽象类或者接口的角度阐述的;
三,内部接口
定义类或者接口内部的接口称为内部接口;所以内部接口有两种:一,是定义在类内部的接口;二,是定义在接口内部的接口;
默认情况下,内部接口是静态的,不管是否加了static关键字。
3.1,类中的接口
案例:
public class Demo{
public static void main(String[] args) {
OuterClass oc = new OuterClass();
oc.test(new Inter() {
public void test(String s) {
// TODO Auto-generated method stub
System.out.println(s);
}
});
}
}
class OuterClass {
public interface Inter{
void test(String s);
}
public void test(Inter i){
String s = "内部类中定义的接口";
i.test(s);
}
}
3.2,接口中定义的接口
案例:
public class Demo2 implements OuterInter.InnerInter {
public static void main(String[] args) {
}
public void test() {
// TODO Auto-generated method stub
}
}
interface OuterInter{//外部接口
//接口中嵌套的内部接口
interface InnerInter{
void test();
}
void outMethod();
}
class OuterInterImp implements OuterInter{
class InnerInterImp implements OuterInter.InnerInter{
public void test() {
// TODO Auto-generated method stub
}
}
public void outMethod() {
// TODO Auto-generated method stub
}
}
也就是嵌套接口,例如Map接口中的Entry接口;
public interface Map<K, V> {
//省略其他代码...
public interface Entry<K, V> {
K getKey();
V getValue();
V setValue(V var1);
boolean equals(@RecentlyNullable Object var1);
int hashCode();
static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey() {
throw new RuntimeException("Stub!");
}
static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue() {
throw new RuntimeException("Stub!");
}
static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(@RecentlyNonNull Comparator<? super K> cmp) {
throw new RuntimeException("Stub!");
}
static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(@RecentlyNonNull Comparator<? super V> cmp) {
throw new RuntimeException("Stub!");
}
}
}