一.抽象类
1. 抽象类的来源
Java是面向对象的语言。在面向对象的概念中,一切事物都是对象,所有的对象都是用类来描述的。事物有个性和共性。描述事物抽取出来的共性的类就是抽象类。
事物(对象) | 事物的个性 | 事物的共性 |
---|---|---|
类(属性+方法) | 一般类 | 抽象类 |
举例 | 苹果 | 水果 |
2.抽象类的特征
- 抽象类不能实例化。也就是不能创建对象,应该由继承抽象类的子类来进行实例化。抽象类就是为了继承而存在的,天生就是为了当爹。基于这个原因,abstract不能和final并列修饰一个类。
- final修饰的类不能被继承。子类无法继承抽象类进行实例化。
- 抽象类的抽象方法必须由继承它的子类重写。如果继承它的子类没有重写抽象类的抽象方法,那么这个子类也一定是抽象类,因为它含有抽象方法。基于这个原因,抽象方法必须是public和protected修饰的,缺省访问权限修饰符情况下, 默认为public。因为abstract不能和private,static,final或native并列修饰抽象方法。原因是
- private修饰的方法不能被子类继承。子类不能重写这个方法。
- static修饰的方法叫类方法(静态方法)。子类不必重写这个方法。
- final修饰的方法可以被继承不能被重写。子类不能重写这个方法。
- 含有抽象方法的类必然是抽象类。抽象类可以没有抽象方法。
- 子类的抽象方法不能和父类的抽象方法同名。
- 抽象类可以有成员变量, 一般方法, 构造方法,与普通类一样。
3.抽象类的示例代码
public abstract Person{
//属性
String name;
//构造方法
public Person(){
this.name=name;
}
//一般方法
public void displayName(){
System.out.println("名字是:"+name);
}
//抽象方法
public abstract void eat();
}
二.接口
1.接口的来源
- 接口是比抽象类还要抽象。接口是抽象类的延伸。Java为了保证数据安全,一个类不能继承多个类。但是Java使用接口弥补了不能多继承的缺陷。一个类可以实现多个接口,这叫“多实现”。
- 接口和继承共同使用,既能保证数据安全,又可以实现多继承。
- 接口与接口之间是可以多继承的。
//接口继承(inheritance)
interface A{
void method1();
void method2();
}
interface B{
void method3;
}
interface C extends A,B{
void method4();
}
2.接口的特征
- 接口不能实例化。不能使用new操作符实例化一个接口,但是可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(Object instanceof Interface){}。
- 实现接口的非抽象类必须要实现接口中的所有方法。
- 实现接口的抽象类不必实现接口中的所有方法。
- 接口中的变量。接口中的变量会被隐式地指定为public static final修饰,使用其他修饰符修饰编译会报错。一般情况下不在接口中定义变量,而是不可变的常量。
- 接口中的方法。接口中的方法会被隐式地指定为public abstract修饰,使用其他修饰符修饰编译会报错。接口中不存在具体实现的方法,接口中的方法都是抽象方法。
3.接口的示例代码
public interface Demo{
public static final A;
public abstract void method1();
public abstract void method2();
}
三.抽象类和接口的深度剖析
在Java语言中, 抽象类和接口是支持抽象定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。抽象类和接口之间在对于抽象定义的支持方面具有很大的相似性,甚至可以相互替换。
1.语法层次的不同
参考一,二部分。
2.抽象层次的区别
抽象类是对一类事物的抽象。接口是对行为的抽象。
抽象类是对整个类整体的属性,行为进行抽象。
接口是对类局部行为进行抽象。
举例说明:
飞机和鸟是不同的事物,它们拥有共同的行为,会飞。
可以将飞机设计一个类,鸟设计一个类,因为两者都是事物。
但是飞行是个行为特性,不能设计一个类,应该设计成一个接口。
3.描述层次的区别
我们日常生活中可以看到各种”接口”,例如电源插座。制造电源插座的厂商和制造电器的厂两者之间约定了一个生产规则,约定了一个”接口”之后,不同的电器就都能使用电源插座。
由此可知,接口的本质是协议,是对事物之间规则的描述,不是对事物的描述。
在Java中:
1.抽象类也是类,类是对现实事物的描述。
2.接口不是类,接口是用来建立类与类之间的协议。接口是对事物之间规则,行为的描述。
4.设计层次的不同
1.抽象类的设计理念是“is-a”,接口的设计理念是“like-a”,是问题领域不同。
2.抽象类的设计目的是为了提高代码的复用性。是模板式设计。接口的设计目的是为了实现”设计与实现的分离”,降低程序中的耦合性。是辐射式设计。
3.在“缺省适配模式”中,声明类型的工作由Java接口承担。但是同时给出一个Java抽象类,且实现了这个接口。而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。也就是说,在层次结构中,Java接口在最上面,然后紧跟着抽象类,然后是普通类。
4.在面向对象程序设计中,对于接口,有一个核心原则就是Interface Segregation Principle(接口隔离原则): 1)使用多个专门的接口比使用单一的总接口要好。2) 一个类对另外一个类的依赖性应当是建立在最小的接口上的。3)一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
简化总结
抽象类 | 接口 |
---|---|
类 | 不是类 |
对事物描述 | 对事物之间规则描述 |
对类整体抽象 | 对类局部行为抽象 |
模板式设计 | 辐射式设计 |
is-a理念 | like-a理念 |
目的是提高复用性 | 目的是降低耦合性 |
为继承而生 | 为多态而生 |