继承
继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
Tips
- 子类拥有父类非private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,单继承就是一个子类只能继承一个父类。
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
- 使用final关键字可以阻止子类继承:final关键字不仅可以声明在类上,也可以生命在类方法上
Object类——所有类的父类
equals方法
用于判断两个对象是否具有相同的引用,代码实现使用的是“==”
1 | public boolean equals(Object obj) { |
重写equals方法应该严格按照规定来做,共5步
hashcode方法
用于返回一个对象的散列值
应用场景:集合Map,不允许出现相同元素,当我们插入一个对象时,如果使用==一个个的去比较是否是同一对象,在数量少的时候,还可以接受,当数量很大时,一个个去比较,显然很不合理,于是我们可以利用hashcode,直接得出为一的标识,去查找目表对象。
toString方法
用于返回对象字符串,常用于打印对象当前的状态信息
cloneable接口
用于标识类是可以被复制的,用protected声明
首先我们先理解一下 浅拷贝和 深拷贝
- 浅拷贝:对象中的深一层对象,采用的是同一个实例引用
- 深拷贝:对象中的深层对象,采用的是不用的实例引用
实现深拷贝的方法:
实现cloneable接口,并自定义clone方法(比较麻烦)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher implements Cloneable {
String name;
Integer age;
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MyClass implements Cloneable {
Teacher teacher;
Integer Number;
@Override
public String toString() {
return "MyClass{" +
"teacher=" + teacher.toString() +
", Number=" + Number +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.teacher = (Teacher) teacher.clone();
return cloned;
}
}
public static void main(String[] args) throws Exception {
Teacher teacher = new Teacher("王华", 32);
MyClass a = new MyClass(teacher, 100);
MyClass b= (MyClass) a.clone();
System.out.println(a.toString());
System.out.println(b.toString());
a.teacher.age=11;
System.out.println(a.toString());
System.out.println(b.toString());
}使用对象的串行化
使用已有的工具包
浅谈多继承的优缺点
C++支持多继承,而很多语言例如,java不支持多继承,“不支持”并不是说技术上难以实现,而是多继承存在一些问题
优点:
- 有利于类的复用,方便与扩展
缺点:
- 二义性:如果多个父类的方法名相同,则不知道要调用谁的方法
接口
接口的概念
接口(英文:Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过实现接口,从实现对应的功能。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
- 接口定义:接口是对类的一组需求的描述,这些类要遵从接口的描述进行定义
- 接口中的所有方法自动的属于public,因此不需要提供关键字public
- 接口不能被实例化,但可以声明接口的变量
- 接口中可以定义常量(但不推荐使用),接口中定义的常量应为所有类频繁使用的常量, 但并不是每个类都使用了接口中定义的所有常量,建议常量定义在实现类中
- JAVA只能单继承,但是可以实现多个接口
- 接口中可以定义静态方法
- 接口中,使用
default
关键字定义的方法,可在接口中实现方法体,并且实现该接口的类,可以选择是否重写该接口
接口和继承
- 继承:继承是一种泛化的过程,使一个抽象的类更加生动具体,更专注于整个类的定义。
- 实现接口:接口的实现,像是一种功能的补充,至于功能怎么实现,取决于实现该接口的类。