16.继承
继承
继承是对某一批类的抽象,从而更好的分析和理解。
子类继承父类,且拥有父类的实例域和方法。
继承能增加代码的重复利用率
Java中只有单继承,没有多继承

类的继承格式
Java中通过 extends 关键字声明
class 父类 {
}
class 子类 extends 父类 {
}
Objext类是个特殊类,我称之为祖宗类,所有类都默认继承Object类。- 子类具有父类所有字段,之后定义不能和父类重复。
super & this
-
super关键字:-
代表父类,子类调用父类的字段时,用
super.fileldName调用。 -
只能在有继承的情况下才能使用
-
构造方法:
this( );本类的构造器
-
-
this关键字:- 代表自己,指向自己的引用,用
this.fileldName调用。 - 没有继承也可以使用
- 构造方法:
super( );父类的构造器
- 代表自己,指向自己的引用,用
实例:
- 定义一个
Person类
package com.wnaoii.oop.Demo04;
public class Person {
protected String Name = "父类Name";
private int Age = 13
}
- 再定义一个
Student类继承Person类
package com.wnaoii.oop.Demo04;
// 子类
public class Student extends Person {
private String Name = "子类Name";
public void printName(String name) {
System.out.println(name); // 这个 name 调的是形式参数 name
System.out.println(this.Name); // this.name 调的是当前这个类的 Name
System.out.println(super.Name); // super.name 调的是当前这个类父类的 Name
}
}
- 实例化 student 对象查看效果
package com.wnaoii.oop.Demo04;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.printName("参数name");
}
}
结果:
参数name
子类Name
父类Name
super 注意点:
super调用父类构造方法,必须在构造方法的第一个。super必须只能出现在子类的方法或构造方法中。super和 this 不能同时调用构造方法。(因为两者都必须在第一行,有冲突)
protected
- 在继承中,子类无法访问父类的
private字段或者private方法。 protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问。
无法调用:
// 父类
public class Person {
// 定义一个 private name变量
private String name = "父类Name";
}
// 子类
public class Student extends Person {
public void printName() {
System.out.println(super.name); // 编译错误,无法调用
}
}
成功调用:
- 由于
private关键字使得子类无法调用,则可以把private改为protected,这样子类便能调用父类被protected修饰的字段。
// 父类
public class Person {
// 定义一个 protected name变量
protected String name = "父类Name";
}
// 子类
public class Student extends Person {
public void printName() {
System.out.println(super.name); // 子类通过关键字 super 成功调用
}
}
继承中的构造器
- 子类并不继承父类的构造器(构造方法或者构造函数),只是调用(隐式或显式)。
// 父类
public class Person {
// 一个简单的无参构造
public Person() {
System.out.println("已执行Person无参构造!")
}
}
// 子类
public class Student extends Person {
// 此处隐藏了一个调用父类的无参构造
// super();
public Student() {
System.out.println("已执行Student无参构造!")
}
}
// 调用
public class Application {
public static void main(String[] args) {
// 只用 Student 类创建一个对象
Student student = new Student();
}
}
结果:
已执行Person无参构造!
已执行Student无参构造!
当显示调用父类无参构造则必须在子类构造器的第一行。(不写一般都默认调用父类无参构造器)
若父类的构造器带有参数,则必须在子类的构造器中显式地通过
super关键字调用父类的构造器并配以适当的参数列表。若父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

浙公网安备 33010602011771号