一、this關鍵字:
在類的內部表示當前這個對象的引用
1.作用
- 調用本類屬性
- 調用本類方法
- 表示當前對象
解析:調用本類屬性
只要在類中⽅法訪問類中屬性,⼀定要加this關鍵字。
當參數與類中屬性同名時,類中屬性⽆法被正確賦值。此時我們加上this關鍵字便可以正確給對象屬性賦值。
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
解析:調用本類方法
調用普通方法:this.方法名稱(參數)
調用構造方法:this(參數)
eg:this.print();//調⽤普通⽅法
public Person(){
System.out.println("********產⽣⼀個新的Person對象********");
}
public Person(String name){
this();//調⽤本類⽆參構造
this.name = name ;
}
public Person(String name,int age){
this(name);//調⽤本類有參構造
this.age = age ;
}
注:this調用構造方法的語句必須在構造方法的首行
使用this調用構造方法時,要留有出口
解析:this表示當前對象
只要對象調用了本類中的方法,這個this就表示當前執行的對象
class Person{
public void print(){
//此時哪個對象調用print方法,this就代表那個對象。
System.out.println("[PRINT]⽅法: "+this);
}
}
public class Test{
public static void main(String[] args) {
Person p1 = new Person();
System.out.println("[MAIN]⽅法: "+p1);
p1.print();
System.out.println("=================");
Person p2 = new Person();
System.out.println("[MAIN]⽅法: "+p2);
p2.print();
}
}
輸出結果:
[MAIN]Demo.Person@1540e19d
[PRINT]方法Demo.Person@1540e19d
======
[MAIN]Demo.Person@677327b6
[PRINT]方法Demo.Person@677327b6
二、static關鍵字:
1.static類屬性
- 傳統屬性特性:保存在堆內存中,且每個對象獨享屬性。
- 描述共享屬性,只需要在屬性前添加static關鍵字即可。
- static屬性⼜稱爲類屬性,保存在全局數據區的內存之中,所有對象都可以進⾏該數據區的訪問
注意:
訪問static屬性(類屬性)應使⽤類名稱.屬性名
所有的⾮static屬性(實例變量)必須在對象實例化後使⽤,⽽static屬性(類屬性)不受對象實例化控制
2.static類方法
- 所有的static⽅法不允許調⽤⾮static定義的屬性或⽅法
- 所有的⾮static⽅法允許訪問static⽅法或屬性
使⽤static定義⽅法只有⼀個⽬的:某些⽅法不希望受到對象的控制,即可以在沒有實例化對象的時候執⾏(⼴泛存在於⼯具類中)
注意事項:
- 靜態方法中不能使用this和super關鍵字
- 靜態方法中不能訪問非靜態成員變量、非靜態成員方法
- 非靜態方法可以訪問靜態
3.【靜態成員變量和非靜態成員變量的區別】
靜態成員變量 | 非靜態成員變量 | |
---|---|---|
語法 | static修飾 | 無static修飾 |
數量 | 內存中只有一份,被類的所有對象共享 | 每創建一個對象都會爲該成員變量分配內存空間,獨享屬性、互不干擾 |
訪問方式 | 可通過對象名訪問、也可通過類名訪問 | 只能通過對象名訪問 |
生命週期 | 跟隨類的加載而創建並初始化,跟隨類的銷燬而銷燬 | 跟隨對象的創建而創建並初始化,跟隨對象的銷燬而銷燬 |
三、super關鍵字:
1.三個作用:
- 在子類的成員方法中,訪問父類的成員變量
- 在子類的成員方法中,訪問父類的成員方法
- 在子類的構造方法中,訪問父類的構造方法(必須位於第一行,且只能執行一次)
⼦類對象實例化操作時,super()的主要作⽤是⼦類調⽤⽗類構造⽅法時才使⽤的。
在進⾏覆寫的操作過程之中,⼦類也可以使⽤super.⽅法()/super.屬性明確調⽤⽗類中的⽅法或屬性
2.【this與super的區別】
區別 | this | super |
---|---|---|
概念 | 訪問本類中的屬性和方法 | 由子類訪問父類中的屬性、方法 |
查找範圍 | 先查找本類、如果本類沒有就調用父類 | 不查找本類,直接調用父類定義 |
特殊 | 表示當前對象 | 無 |
ps:this、super只能在有對象的前提下使用,不能在靜態上下文中使用
能使⽤super.⽅法()⼀定要明確標記出是⽗類的操作。
- ⼦類覆寫⽗類的⽅法是因爲⽗類的⽅法功能不⾜才需要覆寫。
- ⽅法覆寫的時候使⽤的就是public權限
四、final關鍵字:
使⽤final修飾類、⽅法、屬性
1.final修飾類
- final⼀旦修飾⼀個類之後,該類的所有⽅法默認都會加上final修飾。 (不包含成員變量)
- 使⽤final定義的類不能有⼦類(String類便是使⽤final定義)
final class A{} //A類不能有⼦類
2.final修飾方法
- 使⽤final定義的⽅法不能被⼦類所覆寫
class A{
public final void fun(){}
}
3.final修飾變量
- 使⽤final定義的變量就成爲了常量, 常量必須在聲明時賦值,並且不能再次賦值。
- final成員變量必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤
publc final int a = 100 ;
- 定義常量(public static final ),常量全⽤⼤寫字⺟,多個單詞間以_分隔。
public static final int MAX_AGE = 120;