类的继承
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力
引自百度百科
这句话中提到了一个词 派生 ,编程中的继承并不是现实世界中的继承,比如王思聪和王健林,他们的关系我们可以使用继承,但是同样的这两个人映射到编程中对应的是两个对象而不是类。所以编程中的继承更多的是指派生(即从某一类上衍生出更多的新类)
Java 中两个类之间通过关键字 extends 实现继承关系
public class Animal{
}
public class Person extends Animal{
}
2
3
4
5
6
7
8
9
代码解析
Animal: 称为父类、基类、超类
Person: 称为子类、派生类
派生类的成员方法不能访问基类的私有成员。
# 优缺点
优点:
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
缺点:
- 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
# 方法重写
重写:子类中存在和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
在继承中这种情况是不可避免的,针对这种情况 Java 通过 Override 注解来检测当前方法是否是重写的方法
public class Animal{
public void eat(){
System.out.println("吃");
}
}
public class Person extends Animal{
@Override
public void eat(){
System.out.println("吃饭");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
注意:
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低 (public > 默认 > 私有)
既然存在同名的情况,那么在调用的时候我们就需要用到的后面的关键字
# 关键字 super
super 代表父类存储空间的标识(可以理解为父类对象引用)对象在堆内存中,会单独存在一块 super 区域,用来存放父类的数据
# 关键字 this
this 代表当前调用方法的引用,哪个对象调用的方法,this 就代表哪一个对象
类的对象是可以调用类成员的,所以很多时候我们会看到下面的这样的代码
public class User{
private String uname;
public void setUname(String uname){
this.uname=uname;
}
}
2
3
4
5
6
7
8
9
10
11
代码解析
- 通过本类对象 this 调用类的成员 uname, 再将参数的值赋值给成员。
# 继承中的构造方法
子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
# 小结
和继承相关的内容就这么多了,稍微有点零碎。此外还需要注意的是 Java 中类只支持单继承,不支持多继承