六. 抽象类与接口
- 抽象类
1.1概念
抽象类往往用来表示设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:动物,它只是一个抽象的概念,并没有一个 “东西”叫做 “动物”。所以,它并不能代表一个实体,这种情况下,我们就适合把它定义成抽象类。
1.2语法格式
修饰符 abstract class 类名(){
//……
abstract 方法名();
}
abstract修饰:它修饰类就是抽象类,修饰方法就是抽象方法
含有抽象方法的类,必须是抽象类;抽象类必须被继承,抽象方法必须得重写
抽象方法只需声明,不需写具体实现
抽象类不能被实例化,即不能被new操作 abstract不能与final并列修饰同一类
abstract不能与private,static,final并列修饰同一方法 abstract方法必须位于abstract类中
【示例】
动物类的call()方法是抽象的,它的子类,鸟,狗,猫具体实现抽象方法。
2.接口
2.1概念
Java接口是一些方法声明的集合,一个接口只有方法的声明没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。
作用
1)Java是一种单继承的语言
2)实现多态
2.2语法格式
定义接口
[访问控制符] interface <接口名>{
类型标识符final 符号常量名n = 常数;
返回值类型 方法名([参数列表]);
…
}
实现接口
[访问控制符] class 类名 [implements [,]*],]
{
//类体,必须实现接口中的方法
}
特性
我们可以把接口看作是抽象类的一种特殊情况,在接口中只能定义抽象的方法和常量
接口不可实例化,可结合多态进行使用(接口 对象=new 对象())
接口里的成员属性全部是以 public(公开)、static(静态)、final(最终) 修饰符修饰
接口里的成员方法全部是以 public(公开)、abstract(抽象) 修饰符修饰
接口里不能包含普通方法
子类继承接口必须实现接口里的所有成员方法,除非子类也是抽象类
【示例】
定义动物接口,包含一个call()抽象方法。定义具体实现类-鸟,狗,猫类。
3.抽象类与接口的对比
普通类 抽象类 接口
代表一类实体,可以被实例化 代表一类实体,但不能被实例化 不能代表一类实体,只能代表功能或是属性
单继承 单继承 多实现
已经很具体,没有再抽象的需要 在多个普通类中有共用的方法或属性又有相同方法的不同实现方式 单纯的规范,单纯的功能或属性需要独立体现出来
举个例子
有四个方法:吃饭,穿衣,跑步,开豪车;
吃饭,穿衣,跑步这三件事情,普通人都做得到,可以说是 “共性”的行为,只是具体行为实现不同;开豪车不是普通人可以做到的,比较 “独特”。
吃饭,穿衣,跑步三个行为适合放在抽象类,开豪车适合放在接口。
七. Object类讲解
Object类是所有Java类的祖先,每个类都使用Object作为超类。
所有对象(包括数组)都实现这个类的方法。
在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。
可以使用类型为Object的变量指向任意类型的对象。
重点讲解:toString()、equals()、hashCode()三个方法。
问:toString() 方法实现了什么功能?
答:toString() 方法将根据调用它的对象返回其对象的字符串形式。
问:当 toString() 方法没有被覆盖的时候,返回的字符串通常是什么样子的?
答:当 toString() 没有被覆盖的时候,返回的字符串格式是 类名@哈希值,哈希值是十六进制的。举例说,假设有一个 Employee 类,toString() 方法返回的结果可能是 Empoyee@1c7b0f4d。
问:euqals()函数是用来做什么的?
答:用来检查一个对象与调用这个equals()的对象是否相等。
问:使用Object类的equals()方法可以用来做什么比较?
答:调用它的对象和传入的对象的引用是否相等。也就是说,默认的equals()进行的是引用比较。如果两个引用是相同的,equals()函数返回true;否则,返回false。
问:hashCode()方法是用来做什么的?
答:hashCode()方法返回给调用者此对象的哈希码(其值由一个hash函数计算得来)。这个方法通常用在基于hash的集合类中,像HashMap,HashSet和Hashtable。
问: 在类中覆盖equals()的时候,为什么要同时覆盖hashCode()?
答: 在覆盖equals()的时候同时覆盖hashCode()可以保证对象的功能兼容于hash集合。这是一个好习惯,即使这些对象不会被存储在hash集合中。
八. 类与类之间的关系
请访问天亮教育论坛查看!