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

什么是基類

基類就是父類,Object類是所有類的父類,子類繼承父類,繼承并重寫父類的方法和非私有成員變量。

比如我下面定義一個基類,如下圖:

package;

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

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

    /** 創(chuàng)建者 */
    private String createBy;

    /** 創(chuàng)建時間 */
    private Timestamp createTime;

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

    /** 更新時間 */
    private Timestamp updateTime;

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

什么是派生類

派生類是在繼承父類及基礎(chǔ)上增添了新的東西,派生是依存于繼承的,子類在拿來父類的東西去使用的同時,可以增添新的東西或者對繼承來的東西進行覆寫讓其適用于子類。

父類的派生類,如下圖:

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("我是學(xué)生");
    }

}

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

輸出結(jié)果:
我是人
我是學(xué)生

可以發(fā)現(xiàn)基類的構(gòu)造器先被初始化

但是當構(gòu)造器有參數(shù)時,那就必須使用關(guān)鍵字super現(xiàn)實地編寫調(diào)用基類構(gòu)造器的代碼。

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 + "的學(xué)生");
    }

}

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

輸出結(jié)果:
我是張三的人
我是叫張三的學(xué)生

如果注釋掉上面的super(name);將會報錯。原因是派生類必須調(diào)用基類構(gòu)造器。因為實例化派生類時,基類也會被實例化,如果不調(diào)用基類的構(gòu)造器,基類將不會被實例化,所以派生類沒有調(diào)用基類構(gòu)造器會報錯。

如果給基類加無參構(gòu)造方法就不會報錯,代碼如下:

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 + "的學(xué)生");
    }

}

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

輸出結(jié)果:
我是人
我是叫張三的學(xué)生

所以在們寫代碼的時候要養(yǎng)成好習(xí)慣給類加上無參構(gòu)造方法,增加程序的健壯性。

派生類繼承了基類的所有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;
    }
}

輸出結(jié)果:
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);
    }
}

輸出結(jié)果:
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);
    }
}

輸出結(jié)果:
name = 張三
age = 16

要注意的是,super必須在構(gòu)造器的最前面,不然會報錯。

如下圖:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容