🔖面向對象
📖 Java作為面向對象的編程語言,我們首先必須要了解類和對象的概念,本章的所有內容和知識都是圍繞類和對象展開的!
? 思維導圖1
???類和對象的概念
??? 簡單來說,類就是對具有相同特征的一類事物的描述,而對象是類的具體實例.
????比如說 '車' 就是一個大的概念,它可以具體化為奔馳、寶馬、帕拉梅拉。那么車就是一個類,奔馳車就是以車類為模版的一個實例化對象。
??? 一個類中包含成員變量和成員方法
?上圖程序最終輸出:50W帕拉梅拉 is running
?
??構造方法
??? 構造方法的作用是初始化對象,并且分為無參構造方法和有參構造方法
??? 構造方法的方法名與類名相同,沒有返回值,且不需要void修飾。?
????如果一個類沒有定義構造方法,Java會提供一個默認的無參構造方法
??? ?在一個類中可以有多個構造方法 ( 構造方法可以重載 ).
public class Car {String name;String price;//無參構造方法public Car(){name="帕拉梅拉";price="50W";System.out.println(name+price);}//有參構造方法public Car(String name,String price){this.name=name;this.price=price;System.out.println(name+price);}public static void main(String[] args) {new Car();//輸出: 帕拉梅拉50Wnew Car("奔馳","40W");//輸出: 奔馳40W}
}
?
??方法的重載
??? 當一個類中有多個名字相同的方法時,可以通過參數的個數、類型、順序,在調用時進行區分
????方法的重載與返回值類型無關
public class Car {String name;String price;int count;//有參構造方法public Car(String name,String price){this.name=name;this.price=price;System.out.println(name+price);}//參數的類型不同public Car(String name,int count){this.name=name;this.count=count;System.out.println(name+count);}//參數順序不同public Car(int count,String name){this.name=name;this.count=count;System.out.println(name+count);}public static void main(String[] args) {new Car("奔馳","40W");//輸出: 奔馳40Wnew Car("帕拉梅拉",6);//輸出: 帕拉梅拉6new Car(6, "帕拉梅拉");//輸出: 帕拉梅拉6}
}
?
??this與super關鍵字
??? this在類中表示當前正在訪問的對象,主要是為了區分成員變量和局部變量
??封裝
??? 即為成員變量或成員方法添加一個訪問權限修飾符,使外界不得隨意操作,主動權在類的手中 .
📖訪問權限修飾符
??? public ? ? ? ?公共權限 ------- 修飾的成員在任何地方都可以訪問到. ?
??? protected ?受保護權限 ---- 在本類 / 同包的其他類中可以訪問到,及不同包的子類.
??? default ? ? ? 默認權限 ------- 在本類 / 同包的其他類中可以訪問到.
??? private ? ? ? 私有權限 ?------ 只能在本類訪問到. (常用)
? ? protected和默認(default)的區別就是,protected可以在不同包的子類中訪問?
??? 封裝起來之后,通常是通過類中向外提供的特殊方法進行訪問,這樣就可以加入控制語句
public class Car {private String name;//向外提供set和get方法public String getName() {return name;}public void setName(String name) {//加入控制語句if(name.length()<5){this.name = name;}}
}
??代碼塊
??? 代碼塊就是在類中聲明的一個沒有名字的代碼塊,分為實例代碼塊和靜態代碼塊
??? 實例代碼塊: 在每次創建對象時執行,靜態代碼塊: 在類被加載時自動執行
?格式:?{ ?實例代碼塊內容 ?}? ? ? ? ? ? ? ? ? ?static { ? 靜態代碼塊內容 ? }
📖類什么時候會被加載?
??? 運行類中的main方法時.
??? 訪問類中的靜態成員變量或靜態成員方法時.
??? 創建類的對象時.
public class Car {{System.out.println("實例代碼塊");}static {System.out.println("靜態代碼塊");}public static void main(String[] args) {new Car();new Car();new Car();/*依次輸出:靜態代碼塊實例代碼塊實例代碼塊實例代碼塊*/}
}
?
??static關鍵字
??? ?static靜態的意思,static關鍵字可以修飾類中的成員變量,成員方法,代碼塊,內部類.
? (不能修飾構造方法)
??? static修飾成員變量:
靜態成員變量也稱類變量,在內存中只有一份,所有對象可以共享,一般情況下,將類中所有對象都相同的屬性設置為靜態的。
??? static修飾成員方法:
修飾的成員方法也稱為類方法,可以直接使用類名訪問,在靜態的方法中只能訪問靜態的成員變量,非靜態的方法中可以使用靜態的成員變量。
??? static關鍵字修飾的屬性特點:
? ?隨著類的加載而加載
? ?優先于對象存在
? ?靜態成員被所有對象共享
? ?可以直接使用類名訪問
注意:
??? 靜態的方法中,只能使用靜態的成員變量,因為他們都是隨著類的加載而加載的;
??? 一旦方法中使用了非靜態的成員變量,那么此方法就不能定義為靜態的;但非靜態的方法中可以使用靜態的成員變量
??思維導圖2
📖面向對象的三大特征:封裝,繼承,多態是本章的重點,第二部分將圍繞繼承和多態展開
??繼承?
??? 簡單來說,繼承就是將某一事物的共同屬性抽取出來單獨定義一個類 (父類),其它子類可以繼承父類,這樣不僅實現了代碼的復用,子類也可以擴展自己特有的功能。
?? ?舉個簡單的例子,現在有三個動物:貓,狗,鳥,它們都有一個共同屬性:名字name,那么就可以將name屬性定義在一個Animal動物類中,也就是父類,這樣就不需要在貓,狗,鳥類中分別定義name屬性了,它們只需繼承Animal父類即可。
?? ?繼承具有傳遞性,即一個類只能直接繼承一個類;但可以間接繼承多個類。
??? 繼承使用的是extends關鍵字,子類繼承父類后,擁有了父類的成員變量和成員方法
??? 子類不能繼承父類中的私有屬性
public class Cat extends Animal{//Cat繼承Animal的成員變量和成員方法,但不能訪問私有成員
}
📖當一個類沒有顯示繼承其他類的時候默認繼承object類,Object類是java類體系中最大的? ? ? ?類,Object類之上再也沒有別的類。
?
? 多態
??? 多態的使用前提是兩個類存在繼承關系
??? 多態也稱向上轉型,也就是將子類類型向上轉為父類類型
Animal dog = new Dog();
??? 多態實現了用父類類型表示任意子類類型的對象,利于程序擴展
📖通過一個案例給大家解釋下吧!
public class Animal {public void makeSound() {System.out.println("Animal is making a sound");}
}
public class Dog extends Animal{@Override//方法的重寫public void makeSound() {System.out.println("Dog is barking");}public static void main(String[] args) {Animal dog = new Dog();//現在我們可以使用Animal類的引用來引用Dog對象dog.makeSound(); //輸出Dog is barking}
}
在上述案例中,Animal引用的是一個Dog對象,但是調用的是Dog類中重寫的makeSound()方法,這就是多態的效果!
如果你對這個案例還有疑惑,這里有個小口訣:
編譯看左邊,運行看右邊
Animal dog = new Dog();
意思是:編譯時我們看左邊Animal類中的屬性,運行是看右邊Dog類中的內容
?
? 方法的重寫
在上述多態的案例中我們就用了方法的重寫,在子類Dog中對父類Animal中的makeSound方法進行了重寫,最終運行的是重寫后的方法中的內容。所以方法的重寫也就是當父類中方法的實現不能滿足子類需求時,在子類中對父類的方法進行重寫 / 覆蓋,這樣調用時就會調用子類中重寫的方法.
重寫時需要注意:?
??? 子類重寫的方法結構與父類方法的結果必須一致 ( 即方法名,參數列表,返回值類型必須一致)
????構造方法和靜態方法不能重寫,成員變量不存在重寫。
????使用 @Override 注解標簽
??結語:
? ? ???希望這篇關于對 Java面向對象的基礎知識總結 能對大家有所幫助,歡迎大佬們留言或私信與我交流~~學海漫浩浩,我亦苦作舟!大家一起學習,一起進步!
本人微信:? g2279605572?