概念:可以使得子类具有父类的属性(成员变量)和方法(成员方法),还可以在子类中重新定义,追加属性和方法。
继承的格式: public class 子类名 extends 父类名{}
父类:基类、超类 子类:派生类
继承中子类的特点:
public class Animal{
private String name;
public void show(){
System.out.println("你好!");
}
}
// 子类继承父类,可以继承非私有的,
public class Dog extends Animal{
private int age; // 子类自己特有的内容
}
public class Test{
public static void main(String args[]){
// 创建一个狗的对象
Dog d = new Dog();
// 调用方法
d.show(); // 我们看 Dog 类中并无 show() 方法,但是调用并不出错,是因为继承了父类
}
}
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
// 比如人类,和学生、老师、工人
public class Person{
private String name;
private int age;
public void eat(){
System.out.println("吃饭!");
}
}
// 学生继承人类
public class Student extends Person{
}
// 老师继承人类
public class Teacher extends Person{
}
// 工人继承人类
public class Worker extends Person{
}
我们可以看到,学生、老师、工人,都可以继承人类,提高了代码的复用性,我们知道,继承非私有的成员方法和成员变量,都可以继承 eat() 方法,那我们只需要Person类中修改 eat() 方法,那学生、老师、工人继承的也都修改了,这样提高了代码的维护性
在子类中访问一个变量
注意:不考虑父亲的父亲,也就是说,假设子类和其父类中都无这个变量,就报错!
通过子类对象访问一个方法
注意:不考虑父亲的父亲
通过上述的一些特性之后,我们发现,继承是子类和父类的关系,我们涉及到了在子类中访问父类的概念,this 关键字是指代本类对象,我们需要找到一个指代父类对象的关键字–super。
形式 | 作用 |
---|---|
super.age | 访问父类成员变量 |
super.成员方法(…) | 访问父类成员方法 |
super(…) | 访问父类的构造方法 |
注意:括号中的 “…” 是代表参数的意思,参数个数是 从 0 到多个
接下来我们看段代码,来了解下,继承中构造方法的访问特点
public class Animal{
private String name;
private int age;
// 构造方法
public Animal(){
// ③
}
public Animal(String name , int age){ // ④
this.name = name;
this.age = age;
}
}
// 继承动物类
public class Dog extends Animal{ // 产生继承关系
public Dog(){
super(); // ①
}
public Dog(String name , int age){
super(name,age); // ②
}
}
我们先看 ①和③ 的区别,在③中并无 super() 这行代码,根据我们super关键字的学习,我们知道 super() 其实就是调用 父类的 无参构造方法,其实也就是 调用 ③所在的 无参构造方法,那为什么 ③ 这行没写呢,其实自带 super() 只不过我们看不到而已。
根据上述这句话,我们思考一个问题:那 Animal 类中无参构造也有 super() 这行代码,那Animal 明明没有父类啊,那他调用的是谁呢?
// 这个就涉及到我们说的,所有类的祖宗类是谁呢,就是我们的 Object
public class Animal extends Object{ // 原本这行应该这样写,只不过默认不写罢了
}
看完①和③ 的区别之后,我们看 ②和④的区别,那 ②相当于调用了 ④,那④中有没有 super() 这行代码呢,可以根据下面两图,发现,super(),只能在构造方法的第一行
综上所述:
? ①:子类继承父类中的数据,可能使用父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化
? ②:每一个子类构造方法的第一条语句默认都是: super()
Java中类只支持单继承,不支持多继承
Java中类支持多层继承
public class Person{
private String name;
private int age;
public void show(){
System.out.println("我是人类!");
}
// 私有无法被继承
private void eat(){
System.out.println("人类要吃饭!");
}
}
public class Student extends Person{
// 方法重写
public void show(){
System.out.println("我是学生!");
}
}
注意:
? ①:public void show() 就是方法的声明
? ②:public void show(){} 就是方法的定义