目录
一、继承的概念
二、语法
三、继承类型
四、继承的特性
(一)继承的优缺点
(二)继承的特点
(三)继承的成员变量访问特点
五、继承关键字
(一)extends
(二)implements
(三)super 和 this
(四)final
六、构造器
一、继承的概念
继承是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
二、语法
通过extends关键字可实现继承:
class 父类 {
}
class 子类 extends 父类 {
}
三、继承类型
继承类型 | 图形示例 | 语法 |
单继承 | ![]() | ![]() |
多重继承 | ![]() | ![]() |
不同类继承同一个类 | ![]() | ![]() |
注: Java不支持多继承,即不支持一个子类同时继承多个父类。
四、继承的特性
(一)继承的优缺点
1、优点
- 提高了代码的复用性
- 提高了代码的维护性
- 让类与类之间产生了关系,是多态的前提
2、缺点
- 继承是侵入性的
- 降低了代码的灵活性:继承导致子类必须拥有父类非私有属性的方法
- 增强了代码的耦合性:代码与代码之间存在关联可称为“耦合”
(二)继承的特点
- 子类拥有父类非私有的属性和方法;
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展;
- 子类可以用自己的方式实现父类的方法;
- Java不支持多继承;
(三)继承的成员变量访问特点
五、继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
(一)extends
在Java中,一个子类只能继承一个父类,extends只能继承一个父类。
代码实例
public class Animal{}
public class Cat extends Animal{}
(二)implements
使用 implements 关键字可以变相的使Java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
代码实例
public interface A{}
public interface B{}
public class C implements A, B{}
(三)super 和 this
- super:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
- this:指向自己的引用
代码实例
class Animal{
public void eat(){
System.out.println("Animal: eat");
}
public void sleep(){
System.out.println("Animal: sleep");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("Dog: eat");
}
public void eatTest(){
this.eat(); // 调用自己的eat()方法
super.eat(); // 调用父类的eat()方法
}
}
public class Day16 {
public static void main(String[] args){
Animal a = new Animal();
a.eat();
Cat c = new Cat();
c.eatTest();
}
}
输出结果
(四)final
- final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
- final 含义为 "最终的"。
- 使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写。
当我们把父类Animal中的sleep()方法改为final时,此时子类Cat是无法继承该方法的。
六、构造器
- 子类不继承父类的构造器(构造方法或构造函数)
- 若父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
- 若父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
代码实例
// 父类Animal
class Animal{
private int n;
Animal(){
System.out.println("SuperClass: Animal()");
}
Animal(int n){
System.out.println("SuperClass: Animal(int n)");
this.n = n;
}
}
// 子类Cat
class Cat extends Animal{
private int n;
Cat(){ // 自动调用父类的无参数构造器
System.out.println("SubClass: Cat()");
}
public Cat(int n){ // 调用父类中带有参数的构造器
super(10);
System.out.println("SubClass: Cat(int n)");
this.n = n;
}
}
// 子类Dog
class Dog extends Animal{
private int n;
Dog(){ // 调用父类中带有参数的构造器
super(20);
System.out.println("SubClass: Dog()");
}
public Dog(int n){ // 自动调用父类的无参数构造器
System.out.println("Subclass: Dog(int n)" + n);
}
}
public class Day16 {
public static void main(String[] args){
System.out.println("Cat子类继承");
Cat c1 = new Cat();
Cat c2 = new Cat(100);
System.out.println("Dog子类继承");
Dog d1 = new Dog();
Dog d2 = new Dog(1000);
}
}
输出结果