乐趣区

面向对象特性二

、继承
1、概述:
在 Java 中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。
2、格式
通过 extends 关键字,可以声明一个子类继承另外一个父类
[Java] 纯文本查看 复制代码
?

class 父类 {

...

}
class 子类 extends 父类 {

...

}

举例:
[Java] 纯文本查看 复制代码
?

/*

  • 定义员工类 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. 成员变量不重名
[Java] 纯文本查看 复制代码
?

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. 成员变量重名
[Java] 纯文本查看 复制代码
?

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. 成员方法不重名
[Java] 纯文本查看 复制代码
?

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 类是所有类的父类。

退出移动版