目录
一、为什么要继承?
1.继承的引入
生活中的继承的例子有很多。公交车和货车还有出租车都是车,但是他们分别都有自己独特的功能和属性。
- 公交车继承汽车,但它有拉客和报站独有的功能 ,有最大的载客数量。
- 货车继承汽车,它有拉货独有的功能,有最大载重量。
- 出租车继承汽车,它有拉乘客,打发票独有的功能,有所属公司。
在java中如果有很多类同时拥有相同的方法,把他们分别都写出来就会出现新建很多类,中都会有相同的方法,这样会导致代码重复的有很多,违背了“一次编写,多次使用”的原则。
这个时候就需要把他们共同拥有的东西写成一个类,然后分别让其他的继承这个类,就可以实现“一次编写,多次使用”。
2.继承的概念
继承是面向对象三大特征之一。继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的一般特性(包括属性和行为),使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。还可以在子类中重新定义追加子类特有的属性和方法。
继承实现了IS-A关系
二、如何实现继承
1.extends关键字
用extends关键字来表示一个类继承了另一个类
格式:
public class 子类名 extends 父类名{}
例子:
public class Zi extends Fu{}
Fu:是父类;也被称为基类,超类。
Zi:是子类;也被称为派生类。
Object:一切类的祖先。在java中,所有的Java类都直接或者间接地继承了java.long.Object。
2.继承中子类的特点
- 子类自动继承父类的属性和方法。(继承非私有的属性和方法)
- 子类还可以有自己特有的属性和方法。
3.继承中变量的访问特点
在子类方法中访问一个变量
① 子类局部范围找
② 子类成员范围找
③ 父类成员范围找
④ 如果都没有就报错(不考虑父亲的父亲)
通俗点讲就是在子类方法中访问一个变量的时候,首先会在子类局部范围找(方法内部)其次在子类的成员范围找,然后在到父类的成员范围找,如果都没有找到就会出错。
访问变量的优先级:子类局部范围>子类成员范围>父类成员范围
如图中Zi类继承Fu类,在Demo中生成子类的对象,然后调用print方法,age的值首先会在子类的局部范围中找,没有找到就到子类成员范围找,此时找到了age等于18,虽然Fu类中也有age的值,但是子类成员范围比父类成员范围优先级高,所以age输出的结果为18,height类似的,在Zi类的成员范围找到了。所以最终的输出结果为18和180
4.super关键字
super关键字的用法和this关键字的用法相似
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
this | this.成员变量 访问本来成员变量 | this(...) 访问本来构造方法 | this.成员方法(...) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 | super(...) 访问父类构造方法 | super.成员方法(...) 访问父类成员方法 |
5. 方法重写
5.1 概念
子类中出现了和父类中一模一样的方法声明。也就是说,子类在继承父类中的方法的时候,不需要重新编写相同的方法。但是有时子类并不想原封不动的继承父类的方法,而是想做一些修改,这就需要采用方法的重写。
5.2 重写的特征
- 发生方法重写的两个方法的返回值、方法名、参数列表必须完全一致。重点。
- 子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
- 子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)(public>默认>私有)
5.3实例
如图,老虎类继承动物类,动物类有自己的方法“动物吃饭”,老虎重写动物类的方法,老虎吃肉
[补充] :@Override
- 是一个注解
- 可以帮助我们检查重写方法的方法声明的正确性
5.4 重写的应用
当子类需要父类的功能,而功能主题子类有自己特有内容时,可以重写父类中的方法,这样即沿袭了父类的功能,又定义了子类特有的内容
6.继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法。
- 因为子类会继承父类中的数据,可能还会使用父类的数据。所以子类初始化之前,一定要先完成父类数据的初始化。
- 每一个子类构造方法的第一条语句默认都是super()
如果父类中没有无参构造方法,只有带参构造方法时。
- 通过使用super关键字去显示的调用父类的带参构造方法。
- 在父类中自己提供一个无参构造方法。
推荐:自己给出无参构造方法。
三、继承实例
//重复的内容以便子类使用
public class Teacher {
public String name;
public String schooName;
public void giveLession() {
System.out.println("我是教员,开始授课");
}
public void introduction() {
System.out.println("我是:" + name + ",来自" + schooName);
}
}
public class JavaTeacher extends Teacher {
//父类的方法不满意,改写了(重写)
@Override
public void giveLession() {
System.out.println("打开Idea,开始理论教学!");
}
}
public class NetTeacher extends Teacher {
@Override
public void giveLession() {
System.out.println("打开vs2010,开始授课");
}
}
public class Test {
public static void main(String[] args) {
JavaTeacher jt = new JavaTeacher();
jt.name = "费迪南德";
jt.schooName = "清华大学";
jt.introduction();
System.out.println("-----------------------");
NetTeacher nt = new NetTeacher();
nt.name = "乔布斯";
nt.schooName = "剑桥大学";
nt.introduction();
}
}
输出结果:
四、Java中继承的注意事项。
- 私有方法不能被重写(父类私有成员子类是不能被继承的)
- Java中类只支持单继承,不支持多继承。
- Java中类支持多层继承。