今日內容
零、 復習昨日
一、作業
二、繼承
三、重寫
四、this和super
五、訪問修飾符
零、 復習昨日
數組創建的兩種方式
- new int[3];
- new int[]{值,值2,…}
- 存值: 數組名[下標] = 值
構造方法什么作用?有參無參構造什么區別?
- 創建對象
- 無參創建出的對象屬性是默認值
- 有參創建出的對象屬性是指定值
創建對象的過程:
- new 調用構造方法
- 先屬性初始化,后再執行構造方法內代碼
this是什么,什么作用?
- this指代當前類的對象
- this.屬性; this.方法(); this();
- this(); 調用自己的無參構造
- this(參數); 調用自己有參構造
解釋重載(Overload)
- 方法名一樣,參數列表不一樣
- 與返回值無關
類封裝的步驟
- 屬性私有private,提供set get方法
public class Square{int l;public Square(){this(1);}public Square(int l){this.l = l;} }
一、作業
3.創建類
創建老師類
創建學生類
老師帶了很多學生
把學生存倒數組中 Student[] stus = new Student[3];
// 學生類
package com.qf.homework;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/3/1* @desc*/
public class Student {private int age;private String name;public Student() {}public Student(int age, String name) {this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
// 老師類
package com.qf.homework;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/3/1* @desc 老師類*/
public class Teacher {private int age;private String name;// 在老師類定義屬性存儲多個學生private Student[] stuArr;public Teacher() {}public Teacher(int age, String name) {this.age = age;this.name = name;}public Teacher(int age, String name, Student[] stuArr) {this.age = age;this.name = name;this.stuArr = stuArr;}public Student[] getStuArr() {return stuArr;}public void setStuArr(Student[] stuArr) {this.stuArr = stuArr;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
// 測試空指針異常
// 演示空指針public static void test() {// 創建老師Teacher teacher = new Teacher(40,"老王");/*** 這里會報空指針異常,即空對象錯誤* 是因為stuArr1數組本身 為空,因為老師對象中根本就沒有數組*/// Student[] stuArr1 = teacher.getStuArr( );// stuArr1[0].getAge();// 創建數組賦值給老師的數組屬性Student[] stuArr = new Student[3];teacher.setStuArr(stuArr);/*** 這里也會報空指針異常,即空對象錯誤* 這里數組確實存在了,但是數組中存儲的是null* 即取出來stuArr2[0]這個null* null.getAge(),所以就報空指針*/Student[] stuArr2 = teacher.getStuArr( );stuArr2[0].getAge();}
// 測試給老師存儲學生數組
public static void main(String[] args) {// 創建老師Teacher teacher = new Teacher(40,"老王");// 創建學生Student s1 = new Student(18, "小王");Student s2 = new Student(19, "小李");Student s3 = new Student(20, "小趙");// 創建數組,存學生Student[] stus = new Student[3];stus[0] = s1;stus[1] = s2;stus[2] = s3;// 將數組交給老師teacher.setStuArr(stus);// 從老師中取出學生,查看效果Student[] stuArr = teacher.getStuArr( );for (int i = 0; i < stuArr.length; i++) {String name = stuArr[i].getName( );int age = stuArr[i].getAge( );System.out.println("學生姓名:"+name+",學生年齡"+age );}}
二、繼承[重點]
2.1 繼承
生活中繼承: 子繼承父的財產
代碼中繼承: 子類繼承父類,使用父類屬性和方法
為什么需要繼承:
- 減少代碼重復
- 是形成多態的前提
語法:
public class A類 extends B類{} A類是子類,B類是父類
要求: java中類的繼承只能是單繼承!!! 類只能繼承一個類!!!
// 演示: 父類Animal
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/3/1* @desc 父類Animal*/
public class Animal {int age;String name;void eat(){System.out.println("吃" );}
}
// 狗類Dog
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/3/1* @desc 狗類繼承動物類* 狗類是子類* 動物類是父類*/
public class Dog extends Animal{// 繼承
}
// 測試
public class TestExtends {public static void main(String[] args) {Dog dog = new Dog( );// Dog類繼承Animal類,就可以父類屬性和方法dog.name = "大黃";dog.eat();// Cat類繼承Animal類,就可以父類屬性和方法Cat cat = new Cat( );cat.age = 2;cat.eat();}
}
2.2 繼承中屬性
子類繼承父類,就可以使用父類屬性
如果給父類設置私有屬性,子類就無法使用父類的屬性
假如子類和父類中有重名的屬性,子類默認使用自己
- ps: 一般情況下不會重復定義
2.3 繼承中方法
繼承中,子類可以使用父類非私有方法
繼承中,子類 調用父類私有方法
子類中有與父類一樣的方法,默認調用自己的
- 這就是重寫!!! 很重要!!! (多態的前提)
- 跳轉第三章詳細了解重寫…
2.4 繼承中構造方法
在Animal類定義無參構造,里面有輸出語句
在Dog類定義無參構造,里面有輸出語句
在Test測試類中創建Dog對象,結果
Animal() Dog()
結論: 創建子類對象時**,先創建父類對象再創建子類對象**
這個結果其實是因為在每個類的每個構造方法內有個**
super()
**,一般super()默認是隱藏的,super是指代父類對象,super()是在調用父類無參構造,所以調用子類構造創建對象時先執行了父類構造創建了父類對象
詳細的關于this和super的知識,看第四章
三、重寫(Override)
重寫,也可以叫做覆寫,它是發生在繼承中,子類重寫父類方法,有要求
- 訪問修飾符一致
- 返回值類型一致
- 方法名一致
- 參數列表一致
為什么需要重寫?
- 原因1:父類的方法子類能用但是不好用不適合子類!重寫后子類執行自己的方法
- 原因2:重寫也是多態的前提
四、this和super
this | super | |
---|---|---|
是什么 | 指代當前類對象 | 父類對象 |
調用屬性 | this.屬性 (調用自己/父類屬性) | super.屬性(只能調用父類) |
調用方法 | this.方法(調用自己/父類方法) | super.方法(只能調用父類) |
構造方法 | this()/this(參數)只能調用自己構造方法 | super()/super(參數)調用父類構造方法 |
注意調用構造方法的語句,必須放在構造方法內,且放在第一行
package com.qf.oop;/*** --- 天道酬勤 ---** @author QiuShiju* @date 2024/3/1* @desc 狗類繼承動物類* 狗類是子類* 動物類是父類*/
public class Dog extends Animal{// int age;String name = "二哈";// 無參構造public Dog(){System.out.println("Dog()" );}/*** 這是注解,告訴編譯器此處是重寫* 就得重寫的規范*/@Overridevoid eat() {System.out.println("狗吃骨頭" );}/*** 演示this和super*/public void show() {// 調用自己或父類屬性nameSystem.out.println(this.name );// 只能調用父類屬性nameSystem.out.println(super.name );this.eat();//調用自己/父類方法super.eat();//調用父類方法}
}
五、練習
pdf6
六、訪問修飾符
訪問修飾符,訪問限定符,訪問控制符,其實限制屬性/方法能不能被訪問到,即能不能被調用
當前類中 | 當前包其他類中 | 其他包子類 | 其他包非子類 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
缺省(默認) | √ | √ | × | × |
private | √ | × | × | × |
訪問修飾符,訪問限定符,訪問控制符,其實限制屬性/方法能不能被訪問到,即能不能被調用