Java學習 (23) 對象篇(03)封裝&繼承&多態
目錄
封裝
-
我們程序設計要追求“高內聚,低耦合”
- 高內聚:就是類的內部數據操作細節自己完成,不允許外部干涉
- 低耦合:僅暴露少量的方法給外部使用
-
通常,應禁止直接訪問一個對象中數據的實際表示,而應通過操作接口來訪問,這稱為信息隱藏
-
屬性私有,get/set
- get作用是獲得相應數據
- set是給get獲得數據賦予值
-
封裝很基礎,易懂,需牢牢掌握
語法實例
public class Student {
//屬性私有
private String name;
private int age;
private String sex;
//提供可操作方法
//獲得相應數據
public String getName(){
return this.name;
}
//賦予相應數據的值
public void setName(String name){
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 100 || age <= 0){
System.out.println("不存在!");
}else {
this.age = age;
}
}
public String getSex(){
return sex;
}
public void setsex(String sex){
this.sex = sex;
}
}
import com.luo.oop.demo03.Student;
public class Application {
public static void main(String[] args){
Student s1 = new Student();
s1.setName("楓葉");
System.out.println(s1.getName());
s1.setAge(101);
System.out.println(s1.getAge());
s1.setsex("男");
System.out.println(s1.getSex());
}
}
/*run:
楓葉
不存在!
0
男
*/
具體講解視頻(狂神說Java)
繼承
- 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模
- extends 的意思是“擴展”。子類是父類的擴展
- JAVA中類只有單繼承,沒有多繼承
- 繼承是類和類之間的一種關系。除此之外,類和類之間的關系還有依賴、組合、聚合等
- 繼承關系的倆個類,一個為子類(派生類).一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。子類和父類之間,從意義上講應該具有"is a"的關系
Object 類
- object 類是最高級別的類,高于任何類
語法實例
public class Person {
//public
//protected
//default
//private
public String say = "你屬豬";
private int money = 10_0000_0000;
public int getMoney(){
return money;
}
public void setMoney(int money){
this.money = money;
}
}
public class Student extends Person{}
import com.luo.oop.demo04.Student;
public class Application {
public static void main(String[] args){
Student student = new Student();
System.out.println(student.getMoney());
System.out.println(student.say);
}
/*run:
1000000000
你屬豬
*/
具體講解視頻(狂神說Java)
Super 關鍵字
super注意點:
- super調用父類的構造方法,必須在構造方法的第一個
- super 必須只能出現在子類的方法或者構造方法中
- super和 this 不能同時調用構造方法
語法實例
public class Person {
public Person(){
System.out.println("Person無參調用");
}
public void print(){
System.out.println("Person");
}
protected String name = "楓葉";
}
public class Student extends Person{
// private String name = "fengye";
public Student(){
/*隱藏代碼
super();
*/
System.out.println("Student無參調用");
}
public void print(){
System.out.println("Student");
}
public void text1(){
print();
this.print();
super.print();
}
public void text(String name){
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
public class Application {
public static void main(String[] args) {
Student student = new Student();
//student.text("小楓");
//student.text1();
}
}
super 與 this 不同點
- super
- 代表父類對象的應用前提
- 只能在繼承條件才可以使用構造方法
- 基于父類的構造
- this
- 本身調用者這個對象
- 沒有繼承也可以使用
- 是基于本類的構造
具體講解視頻(狂神說Java)
重寫
-
需要有繼承關系,子類重寫父類的方法
-
重寫規則
- 方法名必須相同
- 參數列表列表必須相同
- 修飾符:范圍可以擴大但不能縮小
- 拋出的異常:范圍,可以被縮小,但不能擴大
- 子類的方法和父類方法必要一致,方法體不同
-
跟多態一樣,同一件事(方法),父親(父類)和兒子(子類)的處理方式不同,就相當于各有各的想法
-
重寫:方法名和參數都一樣,實現過程隨意
-
重載:方法名相同,參數必須不同
具體講解視頻(狂神說Java)
多態
-
即同一方法可以根據發送對象的不同而采用多種不同的行為方式
-
一個對象的實際類型是確定的,但可以指向對象的引用的類型有很多
-
多態存在條件
- 有維承關系
- 子類重寫父類方法
- 父類引用指向子類對象
-
注意事項:
- 多態是方法的多態,屬性沒有多態
- 類之間必須有聯系
- 存在必須是繼承關系,方法需要重寫,父類引用指向子類對象,輸出的是子類方法
語法實例
public class Person {
public void run(){
System.out.println("run");
}
}
public class Student extends Person{
public void run(){
System.out.println("sun");
}
}
public class Application {
public static void main(String[] args){
//父類的引用可以指向子類的類型
//對象執行方法主要看對象左邊是否有相關方法,與右邊關系不大
//student 能調用的方法都是自己的或者繼承父類的
Student s1 = new Student();
//Person 父類可以指向子類,但是不能調用子類的方法
Person s2 = new Student();
Object s3 = new Student();
//由于子類調用了父類的方法,所以輸出父類時將會執行子類的方法(重寫方法)
s2.run();
s1.run();
}
}
具體講解視頻
instanceof 和轉換類型
**instanceof **
- instanceof 可以判斷兩個類是否存在父子及相關關系
public class Person {}
public class Student extends Person{}
public class Teacher extends Person{}
public class Application {
public static void main(String[] args) {
//Object >String
//Object >Person >Teacher
//Object >Person >Student
//同級或者處于不同父子關系的類則沒有聯系
Object s1 = new Student();
System.out.println(s1 instanceof Object); //true
System.out.println(s1 instanceof Person); //true
System.out.println(s1 instanceof Student); //true
System.out.println(s1 instanceof Teacher); //false
System.out.println(s1 instanceof String); //false
System.out.println("=================================");
Person s2 = new Student();
System.out.println(s2 instanceof Object); //true
System.out.println(s2 instanceof Person); //true
System.out.println(s2 instanceof Student); //true
System.out.println(s2 instanceof Teacher); //false
//System.out.println(s2 instanceof String); //編譯報錯,同級不能比較
System.out.println("=================================");
Student s3 = new Student();
System.out.println(s3 instanceof Object); //true
System.out.println(s3 instanceof Person); //true
System.out.println(s3 instanceof Student); //true
//理解方式:我雖然和你一個班級,但我倆沒直接聯系
//System.out.println(s3 instanceof Teacher); //編譯報錯,同級不能比較
//System.out.println(s3 instanceof String); //編譯報錯,不存在聯系
}
}
轉換類型
- 父類引用指向子類的對象
- 把子類轉換為父類,向上轉型,但會失去自己的方法
- 把父類轉換為子類,向下轉型,,需要強制轉換方便方法的調用,減少重復的代碼
浙公網安備 33010602011771號