1. 声明方法的存在而不去实现它的类被叫做抽象类,它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能抽象构造函数或抽象静态方法。
(2)abstract类的子类为它们的父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
(3)接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
(4)abstract class里可以有成员变量,可以有非抽象的方法,而interface中的成员变量必须是static,final的,而且没有非抽象的方法。
(5)有这样一个需求,要实现一个门的实例,可以有两种方法定义这个抽象概念:
abstract class Door{
abstract void open();
abstract void close();
}
interface Door{
void open();
void close();
}
完工。可老板看着不满意,又要再加个需求,说我要能报警的门,可以这样实现
abstract class Door{
abstract void open();
abstract void close();
abstract void alarm();
}
interface Door{
void open();
void close();
}
似乎有点不对,是报警是门特有的属性吗,答案当然是否定的,这就违反了ISP(Interface Segregation Principle)接口隔离原则。我们可以将报警功能抽象为另外一个抽象类或者接口,不过由于Java不支持多继承的机制,只能用接口定义了:
abstract class Door{
abstract void open();
abstract void close();
}
interface Door{
void open();
void close();
}
interface Alarm{
void alarm();
}
这样,具有报警功能的门就有两种方法实现了:
Class AlarmDoor extends Door implements Alarm{
void open(){..};
void close(){..};
void alarm(){..};
}
class AlarmDoor implements Door,Alarm{
void open(){..};
void close(){..};
void alarm(){..};
}
Java中继承表示“is a”的关系,接口表示“like a”的关系,弄清楚这两个关系,在我们定义抽象概念的时候就有所选择了。第一种方法表示,这是一个门,且有报警功能;第二种方法表示,这个对象既有门的特点,又有报警功能。
引用
这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。
引用
abstract class和interface是Java语言中的两种定义抽象概念的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。
分享到:
相关推荐
### Java中的Abstract Class与Interface详解 #### 一、面向对象设计的重要性及抽象的概念 面向对象设计的核心在于抽象,这是衡量软件设计质量的关键因素之一。良好的软件设计不仅体现在高效的底层实现上,更重要的...
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性...
### abstract class和interface有什么区别? 在面向对象编程中,`abstract class` 和 `interface` 都是用来实现抽象化的工具,但它们之间存在着重要的差异。理解这些差异有助于开发者更有效地设计和实现软件系统。 ...
在Java编程语言中,`abstract class`(抽象类)和`interface`是两种重要的机制,它们用于实现多态性和抽象性。虽然它们都可以用来定义抽象方法,但它们之间存在显著的差异,这些差异影响了开发者在设计软件时的选择...
在编程领域,`abstract class`(抽象类)和`interface`是两种重要的设计模式,它们在构建可扩展和模块化的软件系统中起着至关重要的作用。这篇文章将深入探讨这两个概念,以及它们在实际开发中的应用。 首先,让...
在Java编程语言中,抽象类(abstract class)和接口(interface)都是用于实现抽象化的重要工具,它们可以帮助程序员更好地组织代码,提高代码的可复用性和扩展性。尽管二者在功能上有一些相似之处,但在实际使用中...
### Interface与Abstract Class的区别及应用场景 #### 一、Interface与Abstract Class的概念理解 在面向对象编程语言中,如Java,接口(Interface)和抽象类(Abstract Class)是两种非常重要的概念,它们都被用来...
Struct 、Class、Interface、Abstract各个的特性、应用场景等对比
#### Abstract Class与Interface的基本概念 1. **Abstract Class**: - 抽象类是一种不能被实例化的特殊类型的类,它可能包含抽象方法(没有实现的方法)和具体方法。 - 抽象类可以拥有构造器、字段、静态方法等...
使用abstract class的方式定义抽象类可以有自己的数据成员,也可以有非abstract的成员方法,而使用interface的方式定义抽象类只能有静态的不能被修改的数据成员,所有的成员方法都是abstract的。从某种意义上说,...
#### 三、Abstract Class 与 Interface 的区别 **1. 实现限制** - **Abstract Class**:一个类可以继承多个抽象类的特性,但在 Java 中,一个类只能继承一个抽象类。 - **Interface**:一个类可以实现多个接口,这...
2.5 abstract class与interface 2.6 公共变量与属性的区别 2.7 参数修饰符params、out和ref的区别 2.8 值类型和引用类型的区别 . 2.9 结构与类的区别 2.10 dispose()和close()、finalize()的区别 ...
2.5 abstract class与interface 2.6 公共变量与属性的区别 2.7 参数修饰符params、out和ref的区别 2.8 值类型和引用类型的区别 . 2.9 结构与类的区别 2.10 dispose()和close()、finalize()的区别 ...
2.5 abstract class与interface 2.6 公共变量与属性的区别 2.7 参数修饰符params、out和ref的区别 2.8 值类型和引用类型的区别 . 2.9 结构与类的区别 2.10 dispose()和close()、finalize()的区别 ...
2.5 abstract class与interface 2.6 公共变量与属性的区别 2.7 参数修饰符params、out和ref的区别 2.8 值类型和引用类型的区别 . 2.9 结构与类的区别 2.10 dispose()和close()、finalize()的区别 ...
### abstract class与interface的区别 `abstract class`可以包含抽象方法和具体实现,主要用于定义类的基本结构和行为;而`interface`则完全由抽象方法组成,用于定义类之间的契约关系,实现多继承的效果。在JAVA中...
4. **abstract class与interface的区别**: - 抽象类(abstract class)可以用`extends`关键字继承,接口(interface)则用`implements`关键字实现。一个类可以实现多个接口,但只能继承一个抽象类。 - 抽象类可以...
【abstract class与interface的区别】 抽象类可以包含字段和方法实现,而接口只能包含常量和抽象方法。一个类可以实现多个接口,但只能继承一个抽象类。 【运行时异常与一般异常】 运行时异常是程序运行时可能发生...