38-咸鱼学Java-面向对象编程核心之继承

时间:2021-09-22 17:21:44

继承

继承主要是为了代码的复用,其关系如同Is-a,就如同狗是一个动物,狗就是子类,动物就是基类(父类),其就存在一定的继承关系,此篇文章主要讨论父类和子类直接的关系。
父类

/** * 人类(基类) * @author * */
public class Person {
    /** * 姓名 */
    String name ;
    /** * 年龄 */
    int age;
    /** * 性别 */
    String sex;
    /** * 基类构造函数 * @param name * @param age * @param sex */
    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
        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 String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}

子类

/** * 学生类(子类) * @author * */
public class Student extends Person {
    /** * 学号 */
    int num;
    /** * 班级 */
    String classroom;
    /** * 构造方法 * @param name 姓名 * @param age 年龄 * @param sex 性别 * @param num 学号 * @param classroom 班级 */
    public Student(String name, int age, String sex, int num, String classroom) {
        super(name, age, sex);
        this.num = num;
        this.classroom = classroom;
    }
        public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getClassroom() {
        return classroom;
    }
    public void setClassroom(String classroom) {
        this.classroom = classroom;
    }
}

此处用这两个类来进行探讨继承
1.子类继承了父类除构造函数之外的其他数据成员及方法。
2. super(参数列表) 调用父类的构造函数
如:Student的构造函数中的

super(name, age, sex);

super.data调用父类的数据成员
如在Student类中可以通过

super.age

调用年龄
super.func()即super.函数名,调用父类的成员方法。
如Student类中可以通过

super.getAge()

获得年龄

super.setAge(num);

修改年龄
3.子类的构造过程
基类static
(1)子类static
(2)基类 实例代码块
(3)基类构造方法
(4)子类 实例代码块
(5)子类构造方法
ps:在构造的时候,不管是子类还是基类其static类型的代码只初始化一次
此定理可以通过在不同的地方打印相应的语句证明
4.基类数据成员在子类当中的访问权限
38-咸鱼学Java-面向对象编程核心之继承
5.子类和基类直接相互赋值
基类=子类 (√) //只把子类一部分赋值给基类
子类=基类 (×)
编译器支持从大的转小的转换
基类引用派生类对象(多态的基础)

        Student a = new Student("Jiaoyan",19, "nam", 1606, "06");
        Person b = new Person("jiaoyan", 10, "nan");
        a = b; //错误
        b = a;

6.派生类和基类同名方法的关系
overload(重载)
函数名相同,参数不同(返回值无要求)
如Person中加

public void show()
    {
        System.out.println("this is a Person");
    }

在Student中加

    public void show(int i)
    {
        System.out.println("this is"+i+" Student");
    }

这就为重载
在Student对象中调用show()和show(i)就会触发两个不同的函数
override(重写or覆盖)
函数名相同,参数列表不同(返回值相同)
如Person中加

public void show()
    {
        System.out.println("this is a Person");
    }

在Student中加

    public void show()
    {
        System.out.println("this is a Student");
    }

就为重写,在Student对象中调用show()只会触发Student中的Show打印出来this is a Student
7.通过父类(引用)可以调用子类的重写的方法

Student a = new Student("Jiaoyan",19, "nam", 1606, "06");
Person b = new Person("jiaoyan", 10, "nan");
b = a;
b.show();

此时会打印出来this is a Student

方法的调用过程

38-咸鱼学Java-面向对象编程核心之继承
在方法区中每一个类都有一个方法表,方法表中存储着各种方法名称和方法所在的地址,在调用方法的时候先通过类找到其方法表,然后在方法表中找到方法所在的地址,然后再找到方法执行。