面向对象特性
一、继承
1、概述:
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
2、格式
通过 extends 关键字,可以声明一个子类继承另外一个父类
1
2
3
4
5
6
|
class
父类 {
...
}
class
子类
extends
父类 {
...
}
|
举例:
01
02
03
04
05
06
07
08
09
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
|
/*
* 定义员工类Employee,做为父类
*/
class Employee {
String name; // 定义name属性
// 定义员工的工作方法
public void work() {
System.out.println("尽心尽力地工作");
}
}
/*
* 定义讲师类Teacher 继承 员工类Employee
*/
class Teacher extends Employee {
// 定义一个打印name的方法
public void printName() {
System.out.println("name=" + name);
}
}
/*
* 定义测试类
*/
public
class
ExtendDemo01 {
public
static
void
main(String[] args) {
// 创建一个讲师类对象
Teacher t =
new
Teacher();
// 为该员工类的name属性进行赋值
t.name =
"小明"
;
// 调用该员工的printName()方法
t.printName();
// name = 小明
// 调用Teacher类继承来的work()方法
t.work();
// 尽心尽力地工作
}
}
|
3、继承的好处
1.提高代码的复用性。
2.类与类之间产生了关系,是多态的前提。
4、继承后的特点
1.成员变量不重名
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class
Fu {
// Fu中的成员变量。
int
num =
5
;
}
class
Zi
extends
Fu {
// Zi中的成员变量
int
num2 =
6
;
// Zi中的成员方法
public
void
show() {
// 访问父类中的num,
System.out.println(
"Fu num="
+num);
// 继承而来,所以直接访问。
// 访问子类中的num2
System.out.println(
"Zi num2="
+num2);
}
}
class
ExtendDemo02 {
public
static
void
main(String[] args) {
// 创建子类对象
Zi z =
new
Zi();
// 调用子类中的show方法
z.show();
}
}
演示结果:
Fu num =
5
Zi num2 =
6
|
2.成员变量重名
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class
Fu {
// Fu中的成员变量。
int
num =
5
;
}
class
Zi
extends
Fu {
// Zi中的成员变量
int
num =
6
;
public
void
show() {
// 访问父类中的num
System.out.println(
"Fu num="
+
super
.num);
// 访问子类中的num
System.out.println(
"Zi num="
+
this
.num);
}
}
class
ExtendsDemo03 {
public
static
void
main(String[] args) {
// 创建子类对象
Zi z =
new
Zi();
// 调用子类中的show方法
z.show();
}
}
演示结果:
Fu num =
5
Zi num =
6
|
注意:
子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用super 关键字,修饰父类成员变量,类似于之前学过的 this 。
使用格式:super.父类成员变量名
3.成员方法不重名
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
class
Fu{
public
void
show(){
System.out.println(
"Fu类中的show方法执行"
);
}
}
class
Zi
extends
Fu{
public
void
show2(){
System.out.println(
"Zi类中的show2方法执行"
);
}
}
public
class
ExtendsDemo04{
public
static
void
main(String[] args) {
Zi z =
new
Zi();
//子类中没有show方法,但是可以找到父类方法去执行
z.show();
z.show2();
}
}
|
4.成员方法重名(重写override)
方法重写:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
5、注意事项
1.子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
2.子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。
3.私有方法不能被重写(父类私有成员子类是不能继承的)
6、super和this
super :代表父类的存储空间标识(可以理解为父亲的引用)。
this :代表当前对象的引用(谁调用就代表谁)。
访问成员:
this.成员变量 -- 本类的
super.成员变量 -- 父类的
this.成员方法名() -- 本类的
super.成员方法名() -- 父类的
7、继承特点
1.Java只支持单继承,不支持多继承。
2.Java支持多层继承(继承体系)。
3.所有的类都直接或者间接继承了Object类,Object类是所有类的父类。