一.Static
一 定義:
叫靜態,可以修飾成員變量、成員方法
成員變量按有無static修飾,分為兩種:
類變量:有static 修飾,屬于類,在計算機里只有一份,會被類的全部對象共享。
實例變量:無static修飾,屬于每一個對象。
static變量使用:
類變量:
類名.類變量(推薦)
對象名.類變量(不推薦)
實例變量:
對象.實例變量
static方法使用:
類方法(靜態方法):
屬于類,可以直接用類名訪問,也可以用對象訪問
類名.類方法(推薦)
對象名.類方法(不推薦)
無static修飾的成員方法:
實例方法 (對象的方法):
屬于對象,只能用對象訪問
對象名.實例方法
(拓展:main方法也是類方法)
類方法的應用場景
可以用來設計工具類
是什么:工具類中的方法都是類方法,每個類方法都是為了完成一個功能的
好處:提高了代碼的復用性,調用方便,提高了開發效率
對比:實例方法需要創建對象進行調用,會浪費內存
建議:工具類不需要創建對象,建議將工具類的構造器私有化
注意事項
類方法中可以直接訪問類的成員,不可以直接訪問實例成員
實例方法中既可以直接訪問類成員,也可以直接訪問實例成員
實例方法中可以出現this關鍵字,類方法中不可以出現this關鍵字
二 代碼塊的概述
代碼塊是類的5大成分之一(成員變量,構造器,方法,代碼塊,內部類)
代碼塊分為兩種:
靜態代碼塊
格式:static{}
特點:類加載時自動執行,由于類只會加載一次,所以靜態代碼塊也就會執行一次
作用:完成類的初始化,例如:對類變量的初始化賦值
實例代碼塊
格式:{}
特點:每次創建對象時,執行實例代碼塊,并在構造器前執行。
作用:和構造器一樣,都是用來完成對對象的初始化,例如:對實例對象進行初始化賦值。
應用:記錄對象創建的日志
三 單例設計模式
設計模式指的是具體問題的最優解法
確保一個類中只有一個實例
單例要求:
1.把類的構造器私有化,防止外部通過?new
?創建新實例;
2.定義一個類變量存儲類的一個對象;
3.提供一個類方法返回對象
單例應用場景:
任務管理器,獲取運行時的對象
使用單例好處:
可以有效避免浪費內存
餓漢式單例特點:
獲取類的對象時,對象已經創建好了
懶漢式單例特點:
拿對象時才開始創建對象
餓漢式單例代碼
public class Test {public static void main(String[] args) {A a1=A.getObject();A a2=A.getObject();System.out.println(a1);System.out.println(a2);} }
public class A {//1.必須私有類的構造器private A(){}//2.定義一個類變量記住類的一個對象private static A a=new A();//3.定義一個類方法返回類的變量public static A getObject(){return a;} }
懶漢式單例代碼
public class Test2 {public static void main(String[] args) {B b1= B.getInstance();B b2=B.getInstance();System.out.println(b1==b2);} }
public class B {//2.定義一個類變量,用于存儲這個類的一個對象private static B b;//1.把類的構造器私有化private B(){}//3.定義一個類方法,確保這個方法保證第一次調用菜創建一個對象,后面調用時會返回同一個對象public static B getInstance(){if(b==null){System.out.println("第一次創建對象~");b=new B();}return b;}}
注意事項:單例對象頻繁使用時采用餓漢式單例代碼,很少用到時采用懶漢式單例代碼
二.繼承
一 定義:
1.繼承就是extends關鍵字,讓一個類和另一個類建立的一種父子關系
2.子類可以繼承父類的非私有的成員
特點:
子類繼承父類的非私有化成員(成員變量,成員方法)
繼承后對象的創建是子類和父類共同完成的
好處:
減少重復代碼代碼的編寫,提高代碼的復用性
繼承注意事項:
1.Java是單繼承的,一個類只能繼承一個直接父類;Java中的類不支持多繼承,但是支持多層繼承。
2.Object類是Java中所有類的祖宗
二 方法重寫
原因:當子類覺得父類中的某個方法不好用時,或者無法滿足自己的要求時,子類可以重寫一個方法名稱,參數列表一樣的方法,去覆蓋父類的這個方法,這就是方法重寫。
注意:重寫后,方法的訪問,Java會遵循就近原則。
方法重寫其它注意事項:
1.重寫小技巧:使用@Override注解,檢查我們方法重寫的格式是否正確,代碼可讀性也會更好。
2.子類重寫父類方法時,訪問權限必須大于或者等于父類該方法的權限。
3.重寫的方法返回值類型,必須被重寫方法的返回值類型一樣,或者范圍更小。
4.私有方法,靜態方法不能被重寫,如果重寫會報錯。
三 子類訪問成員的方法
在子類中訪問其它成員(成員變量,成員方法),是依照就近原則的。
1.先子類局部范圍找
2.然后子類成員范圍找
3.然后父類成員范圍找,如果父類范圍沒有找到則報錯
如何在子類中優先使用父類成員:
可以通過super關鍵字,指定父類的成員:super.父類成員變量/父類成員方法
四 子類構造器
特點:
子類中的全部構造器,都必須先調用父類構造器,再執行自己。
子類構造器特點代碼
class A { // public A(){ // System.out.println("父類A構造器執行了"); // }public A(String name,int age){} } class Z extends A{public Z(){//super();默認存在super("123",34); //解決父類沒有默認構造器System.out.println("子類Z無參構造器執行了");}public Z(String name){//super();默認存在super("123",34); //解決父類沒有默認構造器System.out.println("子類Z有參構造器執行了");} }public class Test {public static void main(String[] args) {Z z=new Z();Z z1=new Z("名字");} }
應用場景
子類構造器可以通過調用父類構造器,把對象中包含父類這部分的數據先進行初始化賦值,再回來把對象里包含子類這部分的數據頁進行初始化賦值。
補充:this(….)調用兄弟構造器
任意類的構造器中,是可以通過this(…)去調用該類的其他構造器的
this(….)調用兄弟構造器代碼
public class Test2 {public static void main(String[] args) {Student student=new Student("張三",12);System.out.println(student.getName());System.out.println(student.getAge());System.out.println(student.getSchoolName());} } class Student{private String name;private int age;private String schoolName;public Student() {}public Student(String name,int age){this(name,age,"黑馬程序員"); //this(…)調用兄弟構造器}public Student(String name, int age, String schoolName) {this.name = name;this.age = age;this.schoolName = schoolName;}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 String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;} }
注意:super和this不能出現在同一構造器中,且放在第一行