继承的含义

子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

 

继承的好处

①提高代码的复用性

②使类与类之间产生了关系

 

继承的格式

class 子类 extends 父类

注:java是单继承的,一个类只能继承一个直接父类

 

案例

 

Human.java

 1 //定义一个Human父类
 2 public class Human {
 3     String name; //姓名
 4     int age; //年龄
 5 
 6     //吃饭方法
 7     public void eat() {
 8         System.out.println("人在吃饭");
 9     }
10     
11     //睡觉方法
12     public void sleep() {
13         System.out.println("人在睡觉");
14     }
15 }

 

Student.java

1 //Student类
2 public class Student extends Human {
3 
4 }

 

Testcher.java

1 //教师类
2 public class Teacher extends Human {
3     double salary; //薪水
4 
5     //教书方法
6     public void teach() {
7         System.out.println("老师在教java");
8     }
9 }

 

 HeadTeacher.java

1 //班主任类
2 public class HeadTeacher extends Human {
3     double salary; //薪水
4 
5     //管理方法
6     public void manage() {
7         System.out.println("班主任在管理班级");
8     }
9 }

 

Test.java

 1 //测试类
 2 public class Test {
 3     public static void main(String[] args) {
 4         //创建Student对象
 5         Student s = new Student();
 6         //继承了Human类,拥有了Human这个父类的非私有成员变量
 7         s.name = "张三";
 8         s.age = 18;
 9         System.out.println("姓名:" + s.name + ",年龄:" +  s.age);
10 
11         //拥有父类的非私有成员方法
12         s.eat();
13         s.sleep();
14 
15         System.out.println("--------------");
16 
17         //创建Teacher对象
18         Teacher t = new Teacher();
19         //父类的属性
20         t.name = "李四";
21         t.age = 20;
22         t.salary = 6666; //Teacher类自己的属性
23         System.out.println("姓名:" + t.name + ",年龄:" +  t.age + ",薪水:" + t.salary);
24 
25         //父类的方法
26         t.eat();
27         t.sleep();
28         //自己的方法
29         t.teach();
30 
31         System.out.println("--------------");
32 
33         //创建HeadTeacher对象
34         HeadTeacher ht = new HeadTeacher();
35         //父类的属性
36         ht.name = "王五";
37         ht.age = 22;
38         ht.salary = 8888; //HeadTeacher类自己的属性
39         System.out.println("姓名:" + ht.name + ",年龄:" +  ht.age + ",薪水:" + ht.salary);
40 
41         //父类的方法
42         ht.eat();
43         ht.sleep();
44         //自己的方法
45         ht.manage();
46     }
47 }

 

运行结果

 

 

 

 

小结:

1、继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。

 2、子类继承父类,就可以直接得到父类的成员变量和方法。

 

子类不能继承的内容

①子类不能继承父类的构造器,因为子类有自己的构造器。

②子类不能继承父类的私有成员(成员变量,方法),但可以通过方法访问父类的私有成员。在内存的角度子类可以看到父类的私有成员。

 

继承后的特点——成员变量

成员变量不重名:如果子类父类中出现不重名的成员变量,这时的访问是没有影响的。

成员变量重名:子父类中出现了同名的成员变量时,子类会优先访问自己对象中的成员变量。如果此时想访问父类成员变量如何解决呢?我们可以使用super关键字。

super访问父类成员变量:super代表的是父类对象的引用,this代表的是当前对象的引用。

 

继承后的特点——成员方法

成员方法不重名:如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。

成员方法重名:如果子类父类中出现重名的成员方法,则创建子类对象调用该方法的时候,子类对象会优先调用自己的方法。

 

方法重写

子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。

 

使用场景和案例

子类继承了父类的方法,但是子类觉得父类的这方法不足以满足自己的需求,子类重新写了一个与父类同名的方法,以便覆盖父类的该方 法。

 

 @Override重写注解

这个注解标记的方法,就说明这个方法必须是重写父类的方法,否则编译阶段报错。

 

注意事项

①方法重写是发生在子父类之间的关系。

②子类方法覆盖父类方法,必须要保证权限大于等于父类权限。

③ 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。

 

继承后的特点——构造器

子类是无法继承父类构造方法的。

子类的构造方法中默认有一个`super()` ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。

子类所有构造器的第一行都会先调用父类的无参构造器,再执行自己。

 

案例演示

 

 

小结:

1、子类构造器执行的时候,都会在第一行默认先调用父类无参数构造器一次。

2、子类构造器的第一行都隐含了一个super()去调用父类无参数构造器,super()可以省略不写

 

super(...)和this(...)

可以借助与super(...)去调用父类构造器,以便初始化继承自父类对象的name和age.

 

super和this的用法格式

 

 

super(...)

super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

super(..)是根据参数去确定调用父类哪个构造器的。

 

this(...)

默认是去找本类中的其他构造器,根据参数来确定具体调用哪一个构造器。

为了借用其他构造器的功能。

 

 

 

小结:

1、super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

2、super(..)和this(...)是根据参数去确定调用父类哪个构造器的。

3、super(..)可以调用父类构造器初始化继承自父类的成员变量的数据。

4、this(..)可以调用本类中的其他构造器。

 

继承的特点

Java只支持单继承,不支持多继承。

一个类可以有多个子类。

可以多层继承。

posted on 2020-04-12 19:09  ⊱风之悟⊰  阅读(227)  评论(0编辑  收藏  举报

Live2D