继承的含义
子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。
继承的好处
①提高代码的复用性
②使类与类之间产生了关系
继承的格式
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只支持单继承,不支持多继承。
一个类可以有多个子类。
可以多层继承。