【Java愚公】java基类和派生类

本文详细介绍了Java中的基类(父类)概念,如何通过`extends`关键字创建派生类,并展示了基类和派生类的构造器调用规则,以及它们在实例化过程中的作用。通过实例代码,探讨了属性访问权限、构造方法调用和覆盖行为。
摘要由CSDN通过智能技术生成

什么是基类

基类就是父类,Object类是所有类的父类,子类继承父类,继承并重写父类的方法和非私有成员变量。

比如我下面定义一个基类,如下图:

package;

import java.io.Serializable;
import java.sql.Timestamp;

public class BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /** 创建者 */
    private String createBy;

    /** 创建时间 */
    private Timestamp createTime;

    /** 更新者 */
    private String updateBy;

    /** 更新时间 */
    private Timestamp updateTime;

    /** 备注 */
    private String remark;
    
}

什么是派生类

派生类是在继承父类及基础上增添了新的东西,派生是依存于继承的,子类在拿来父类的东西去使用的同时,可以增添新的东西或者对继承来的东西进行覆写让其适用于子类。

父类的派生类,如下图:

package;

public class Book extends BaseEntity {
    /** 书籍名称 */
    private static String bookName;
}

基类和派生类的使用

使用如下:

package;

public class People {
    public People() {
        System.out.println("我是人");
    }
}
package;

public class Student extends People {
    public Student() {
        System.out.println("我是学生");
    }

}

class Test {
    public static void main(String[] args) {
        new Student();
    }
}

输出结果:
我是人
我是学生

可以发现基类的构造器先被初始化

但是当构造器有参数时,那就必须使用关键字super现实地编写调用基类构造器的代码。

package;

public class People {

    private static String name;

    public People(String name) {
        System.out.println("我是" + name + "的人");
    }
}
package;

public class Student extends People {

    private static String name;

    public Student(String name) {
        super(name);
        System.out.println("我是叫" + name + "的学生");
    }

}

class Test {
    public static void main(String[] args) {
        new Student("张三");
    }
}

输出结果:
我是张三的人
我是叫张三的学生

如果注释掉上面的super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化,所以派生类没有调用基类构造器会报错。

如果给基类加无参构造方法就不会报错,代码如下:

package;

public class People {

    private static String name;

    public People() {
        System.out.println("我是人");
    }

    public People(String name) {
        System.out.println("我是" + name + "的人");
    }
}
package;

public class Student extends People {

    private static String name;

    public Student(String name) {
        System.out.println("我是叫" + name + "的学生");
    }

}

class Test {
    public static void main(String[] args) {
        new Student("张三");
    }
}

输出结果:
我是人
我是叫张三的学生

所以在们写代码的时候要养成好习惯给类加上无参构造方法,增加程序的健壮性。

派生类继承了基类的所有public和protected属性和方法,代码如下:

package;

public class People {
    public String name;
    protected Integer age;
    private String sex;

    public People() {
    }

    public People(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public String getSex() {
        return sex;
    }
}

输出结果:
name = 张三
age = 16

这里无法使用student.sex,编译报错,因为基类的sex属性被private私有化了,只能通过student.getSex()获取。

如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法
,代码如下:

package;

public class Student extends People {
    public String name;
    protected Integer age;
    private String sex;

    public Student(String name, Integer age, String sex) {
        super(name, age, sex);
    }
}

class Test {
    public static void main(String[] args) {
        Student student = new Student("张三", 16, "男");
        String name = student.name;
        Integer age = student.age;
        //String sex = student.sex;
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        //System.out.println("sex = " + sex);
    }
}

输出结果:
name = null
age = null

只有当派生类的属性也被实例化时,才会得到属性的值,代码如下:

package;

public class Student extends People {
    public String name;
    protected Integer age;
    private String sex;

    public Student(String name, Integer age, String sex) {
        super(name, age, sex);
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}

class Test {
    public static void main(String[] args) {
        Student student = new Student("张三", 16, "男");
        String name = student.name;
        Integer age = student.age;
        //String sex = student.getSex();
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        //System.out.println("sex = " + sex);
    }
}

输出结果:
name = 张三
age = 16

要注意的是,super必须在构造器的最前面,不然会报错。

如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java愚公

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值