继承

继承同样是是Java的三大特性之一,其本质是对某一批类的抽象,是从已有的类中派生出来的类,具有原类的属性和方法,且能扩展新的数据属性及方法。

继承关系的两个类,一个是子类(或派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示,extends,“扩展” 的意思。子类继承父类,子类就拥有父类的属性和方法。

Java中,类只有单继承,没有多继承。单继承是指每个子类只有一个父类,然一个父类却有多个子类。

继承是类和类之间的关系。除了继承关系,类与类的系统还有依赖组合聚合等系统。

示例:

父类: Person.java
package com.zctou.oop.demo04;

public class Person {
    //封装区
    private String name; //年龄
    protected int age; //年龄
    int height; //身高

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    //方法区
    public void personalInfo() {
        System.out.println("姓名: " + name + " 年龄:" + age + " 身高(CM): " + height );
    }

    public void breathe() {
        System.out.println("Person类吸了口气!");
    }
    public void breathe(String s) {
        System.out.println(s + "吸了口气!");
    }
}
子类:Teacher.java
package com.zctou.oop.demo04;

public class Teacher extends Person{
    //封装区
    private  String school; //所在学校
    private  int seniority ; // 教学年龄
    private  String subject;  // 学科

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    public int getSeniority() {
        return seniority;
    }

    public void setSeniority(int seniority) {
        this.seniority = seniority;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    //方法区
    //覆盖父类方法
    public void breathe() {
        System.out.println("Teacher类吸了口气!");
    }
    public void teacherInfo() {
        System.out.println("姓名: " + getName() + " 年龄:" + age + " 身高(CM): " + height ); //只有private不能继承
        System.out.println("所在学校: " + school + " 教学年龄:" + seniority + " 学科: " + subject );
    }
}
测试文件:Application.java
package com.zctou.oop;

import com.zctou.oop.demo04.Teacher;

public class Application {

    public static void main(String[] args) {
        Teacher teacher = new Teacher(); //Teacher extends Person

        //调用父类提供的公共方法
        teacher.setName("老王");
        teacher.setSchool("华师大");
        teacher.setSubject("语文");
        teacher.setHeight(170);

        System.out.println(teacher.getHeight());
        teacher.breathe(); //子类覆盖父类方法
        teacher.breathe("Teacher类调用Person类"); //调用父类方法'
        teacher.teacherInfo();

    }
}

输出:

所在学校: null 教学年龄:0 学科: null //调用子类自身方法
姓名: null 年龄:0 身高: 0 //调用父类方法
老王 //父类属性
所在学校: 华师大 教学年龄:0 学科: 语文 //调用子类自身方法
姓名: 老王 年龄:0 身高: 0 //调用父类方法
可以看到:

name, age, height都是父类属性,personalInfo()是父类方法。

Teacher作为Person的子类,能继承父类的属性和方法。除了private, 其他属性都能被子类继承。

子类能覆盖父类的方法。

总结

  1. 继承关键字 extends
  2. Java中继承只有单继承,没有多继承,但有多重继承。
  3. Java中虽然有多重继承,但只类只能有一个父类,而父类却能有多个子类。
  4. 私有(private)的属性方法不能被子类继承。
  5. 避免混乱,调用父类用super,调用本类用this。
文章目录