1. 程式人生 > >2017.12.1T19_B2_4.2

2017.12.1T19_B2_4.2

per 內容 構造方法 str 修飾 順序 返回值 同名 權限

package com.xdf.bean;

/**
* Student is a Person
* Teacher is a Person
*
* 子類和父類滿足 is a的關系!
* 學生是人類
* 老師是人類
* 司機是人類
*
* 繼承使用的關鍵字是extends!
*
* 請問:
* 一個人有幾個親生父親?
* 一個類只能有一個父類!
* Student》》》Person》》》Object
*
* 單根性! 單根繼承 多實現
* extends implements
*
*
*
* 01.把Student和Teacher類中公共的代碼 提取到Person類中
* 02.讓Student和Teacher類繼承Person類
*
* 繼承的註意事項:
* 01.無論我們子類中是否調用super(),默認都會先去執行父類的無參構造!
* 除非子類中顯示的調用了父類的帶參構造!
* 02.父類中私有的屬性或者方法,子類不能繼承
* 03.父類的構造方法也不能繼承
*
* 重寫的註意事項:
* 01.有繼承關系
* 02.不在一個類,子類重寫父類的方法
* 03.方法名一致,參數列表一致
* 04.重寫方法的訪問權限修飾符不能嚴於父類
* 05.父類中的靜態方法不允許被重寫,但是子類中可以創建同名的靜態方法
* 06.父類的私有方法 不允許被重寫
* 07.如果父類的方法有返回值,我們子類重寫的時候,可以返回這個值本身,也可以返回值的子類型!
*/
public class Person { // 人類

private int id; // 編號
private String name; // 姓名
private int age; // 年齡

private void showInfo() {
System.out.println("父類的私有方法");
}

public static void testStatic() {
System.out.println("父類的靜態方法");
}

/**
* 父類中睡覺的方法
*/
public void sleep() {
System.out.println("人類在睡覺");
}

public void sleep(String name) {
System.out.println(name + "在睡覺");
}

/**例子:
* 我要去買個動物?
* 小貓
* 小狗
*
* 書寫一個帶有返回值的方法
*/
public Person getPerson() {
return new Person(); // 返回一個人類
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

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 Person(int id, String name, int age) {
System.out.println("Person類中的****帶參構造");
this.id = id;
this.name = name;
this.age = age;
}

public Person() {
super(); // Person已經沒有父類了 所以調用Object
System.out.println("Person類中的****無參構造");
}

@Override
public String toString() {
return "[id=" + id + ", name=" + name + ", age=" + age + "]";

*************************************************************************

package com.xdf.bean;

public class PersonDemo {

/**
* 創建Student對象
Student stu = new Student();
stu.setId(1);
stu.setAge(60);
stu.setName("小黑");
System.out.println(stu); // 為什麽輸出 屬性的值 而不是內存地址
System.out.println("**********************************");
// 創建Teacher對象
Teacher teacher = new Teacher();
teacher.setId(2);
teacher.setAge(18);
teacher.setName("小白");
System.out.println(teacher);
System.out.println("****************驗證類的實例化順序*******************");
Student stu1 = new Student();
System.out.println("****************驗證帶參構造*******************");
Student stu2 = new Student(1, "小黑", 50);
System.out.println(stu2);
*/
public static void main(String[] args) {
// 驗證子類可以繼承的內容
Student stu = new Student();
// stu.showInfo(); 父類中私有的方法
stu.sleep();
Teacher teacher = new Teacher();
teacher.sleep();
/**
* 問題 :
* 無論是哪個子類調用這個sleep方法 都會執行一樣的內容 ? 這樣合理嗎?
*
* 方法的重寫:
* 父類中只是定義了一個方法,具體內容 讓子類去書寫!

********************************************************************

package com.xdf.bean;

/**
* super關鍵字
* 01.只能出現在子類的方法中
* 02.如果是調用父類的構造方法 只能位於子類構造的第一句
* 03. super.屬性 調用父類的屬性
* super.方法 調用父類的方法
*
*/
public class Student extends Person { // 學生類

public Student(int id, String name, int age) {
// super(id, name, age); // 調用父類的 帶參構造方法
System.out.println("Student類中的****帶參構造");
}

public Student() {
// super(); 無論我們有沒有顯示的去調用 父類的 無參構造方法, 都會執行
System.out.println("Student類中的****無參構造");
}

/**
* 重寫父類的方法
*/
@Override
public void sleep() {
System.out.println("學生 在睡覺");
}

/**
* 重寫父類的靜態方法
* shift+alt +s ===> override ==》
* 發現沒有父類的靜態方法
*/
public static void testStatic() {
System.out.println("子類的靜態方法,和父類沒關系! 但是可以同名");
}

/**
* 重寫帶有返回值的方法
*/
@Override
public Person getPerson() {
// return new Student();
return new Teacher();
}

***************************************************************

package com.xdf.bean;

public class Teacher extends Person { // 教師類

public Teacher(int id, String name, int age) {
super(id, name, age); // 調用父類的 帶參構造方法
}

public Teacher() {
super();// 調用父類的 無參構造方法
}

/**
* 重寫父類的方法
*/
@Override
public void sleep() {
System.out.println("教師 在睡覺");

2017.12.1T19_B2_4.2