目录
1、继承概述
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承的格式:
继承的格式
格式:public class 子类名 extends 父类名 {}
范例:public class Child extends Parents {}
Child : 是子类,也被称为派生类
Parents : 是父类,也被称为基类、超类;
继承中子类的特点:
- 子类可以有父类的内容;
- 子类还可以有自己特有的内容。
代码演示:
package ExPackage;
/*父类*/
public class Parents {
public void showParent(){
System.out.println("showParent方法被调用");
}
}
package ExPackage;
/*子类*/
public class Child extends Parents{
public void showChild(){
System.out.println("showChild方法被调用");
}
}
package ExPackage;
/*测试类*/
public class test {
public static void main(String[] args) {
Parents p = new Parents();
p.showParent();
Child c = new Child();
c.showChild();
c.showParent(); //子类调用父类中的方法
}
}
结果:
showParent方法被调用
showChild方法被调用
showParent方法被调用
2、继承的好处和弊端
2.1、继承的好处
- 提高了代码的复用性(多个类相同的成员可以放到同一个类中);
- 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)。
2.2、继承的弊端
- 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类也不得不跟着变化,削弱了子类的独立性;
3.继承中变量的访问特点
在子类方法中访问一个变量:
- 先在子类局部范围找;
- 若找不到,则在子类成员范围找;
- 若还找不到,则在父类成员范围找。
代码演示:
package ExPackage;
/*父类*/
public class Parents {
public int age = 40; //年龄
}
package ExPackage;
/*子类*/
public class Child extends Parents{
public int height = 175; //身高
public int age = 20; //年龄
public void show(){
int age = 30;
System.out.println(age);
System.out.println(height);
//报错,因为weight在本方法、子类、父类中都不存在
//System.out.println(weight);
}
}
package ExPackage;
/*测试类*/
public class test {
public static void main(String[] args) {
Child c = new Child();
c.show();
}
}
结果:
30
175
4、super关键字
super关键字的用法和this关键字的用法相似。
- this:代表本类对象的引用;
- super:代表父类存储空间的标识(可以理解为父类对象引用)。
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this | this.成员变量 访问本类成员变量 | this(...) 访问本类构造方法 | this.成员方法(...) 访问本类成员方法 |
super | super.成员变量 访问父类成员变量 | super(...) 访问父类构造方法 | super.成员方法(...) 访问父类成员方法 |
代码演示:
package ExPackage;
/*父类*/
public class Parents {
public int age = 40; //年龄
}
package ExPackage;
/*子类*/
public class Child extends Parents{
public int age = 20; //年龄
public void show(){
//访问方法内的局部变量age
int age = 0;
System.out.println(age);
//访问本类的成员变量age
System.out.println(this.age);
//访问父类的成员变量age
System.out.println(super.age);
}
}
package ExPackage;
/*测试类*/
public class test {
public static void main(String[] args) {
Child c = new Child();
c.show(); //子类调用父类中的方法
}
}
结果:
0
20
40
5、继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法,因为:
- 子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化;
- 每一个子类构造方法的第一条语句默认都是:super()(即父类的无参构造方法)。
如果父类中没有无参构造方法,只有带参构造方法,那么可以:
- 通过使用super关键字去显式地调用父类的带参构造方法;
- 或在父类中自己提供一个无参构造方法。(推荐使用)
代码演示:
package ExPackage;
/*父类*/
public class Parents {
// public Parents(){
// System.out.println("父类中无参构造方法被调用");
// }
public Parents(int age){
System.out.println("父类中带参构造方法被调用");
}
}
package ExPackage;
/*子类*/
public class Child extends Parents{
public int age = 20; //年龄
public Child(){
super(40); //使用父类的带参构造方法
System.out.println("子类中无参构造方法被调用");
}
public Child(int age){
super(40);
System.out.println("子类中带参构造方法被调用");
}
}
package ExPackage;
/*测试类*/
public class test {
public static void main(String[] args) {
//创建对象
Child c1 = new Child();
Child c2 = new Child(20);
}
}
结果:
父类中带参构造方法被调用
子类中无参构造方法被调用
父类中带参构造方法被调用
子类中带参构造方法被调用
6、继承中成员方法的访问特点
通过子类对象访问一个方法:
- 首先在子类成员范围找;
- 若找不到,则在父类成员范围找;
- 如果都没有,就报错(不考虑父类的父类)。
代码演示:
package ExPackage;
/*父类*/
public class Parents {
public void showParents(){
System.out.println("父中showParents()方法被调用");
}
}
package ExPackage;
/*子类*/
public class Child extends Parents{
public void showChild(){
System.out.println("子中showChild()方法被调用");
}
public void showParents(){
super.showParents();
System.out.println("子中showParents()方法被调用");
}
}
package ExPackage;
/*测试类*/
public class test {
public static void main(String[] args) {
//创建对象,调用方法
Child c = new Child();
c.showChild();
c.showParents(); //子优先调用本类的成员方法
//报错,因为子类和父类都没有该方法
//c.test();
}
}
子中showChild()方法被调用
父中showParents()方法被调用
子中showParents()方法被调用
7、方法重写
7.1、方法重写概述:
子类中出现了和父类中一摸一样的方法声明。
7.2、方法重写的应用场景:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。
7.3、@Override
@Override是一个注解,它可以帮助我们检查重写方法声明的正确性。
7.4、方法重写的注意事项
- 父类中的私有方法,子类无法继承,也就无法重写;
- 子类方法访问权限不能更低(public > 默认 > private);
代码演示:
package phonePackage;
//手机类
public class Phone {
public void call(String name){
System.out.println("给"+name+"打电话");
}
}
package phonePackage;
//新手机
public class NewPhone extends Phone {
@Override //注解,表明该方法对父类方法进行了重写
//声明与父类同名的方法,称为方法重写
public void call(String name) {
System.out.println("开启视频功能");
super.call(name); //使用父类功能
}
}
package phonePackage;
public class Test {
public static void main(String[] args) {
//创建对象,调用方法
Phone p = new Phone();
p.call("张三");
System.out.println();
NewPhone np = new NewPhone();
np.call("张三");
}
}
8、方法中继承的注意事项
- Java中类只支持单继承,不支持多继承;
- Java中类支持多层继承。