什么是基類
基類就是父類,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
