(九)面向物件(補)
面向物件(四)
this關鍵字
this關鍵字表示當前物件本身,一般用於類的內部,其內部存在一個地址,指向當前初始化的物件本身.
new 一個物件時,其實產生了兩個引用,兩個引用執行同一記憶體空間(物件) 所以類中用this來表示當前物件,因為不用this,我們是不知道在建立物件時具體的物件名的
用法
1.呼叫成員變數
用於解決成員變數與區域性變數之間二義性
2.呼叫其他例項方法
同一類中非static方法互調
3.呼叫本類其他構造方法
可以呼叫本類的其他構造方法,但是必須寫在第一句
public Person(String name, String gender) {
this.name = name;
this.age = 18;
this.gender =gender;
}
public Person(String name,int age ,String gender){
//this呼叫構造方法,要放在有效程式碼第一行
this(name,gender);
this.gender=gender;
super關鍵字
super表示父類 ,當子類需要訪問父類成員時,可以使用super
super只是一個關鍵字 ,內部沒有引用,不包含地址
用法
1.super訪問父類非私有欄位
2.super訪問父類非私有方法
3.super訪問父類構造方法
- super 呼叫構造方法必須寫在子類構造方法的第一句
- 如果子類構造方法沒有顯示呼叫父類構造方法的話,JVM會預設呼叫父類的無參構造super()
static修飾符
static關鍵字表示靜態,修飾變數稱為靜態變數,修飾方法構成靜態方法.
- 靜態變數:使用static修飾的變數,歸類所有,也被稱為類變數.類的所有例項/物件都可以訪問,被類的所有例項或物件共享
語法: static 資料型別 成員變數 [=初始值]; 靜態變數的訪問 1.類名.靜態變數名(推薦方法) 2.例項.靜態變數名
- 靜態方法:static修飾的方法,歸類所有,也稱類方法
[修飾符] static 返回值型別 方法名(形參){
}
靜態方法的訪問
1.類名.靜態方法() (推薦方法)
2.物件.靜態方法()
靜態方法的特性
- 靜態方法中可以訪問靜態變數和類的其他靜態方法
- 例項方法中可以訪問靜態成員(靜態變數和靜態方法),靜態方法不能訪問例項成員
jvm載入static成員過程
1.當載入一個類時,會進行到靜態區/方法區 ,jvm掃描類名.class位元組碼檔案中的 靜態成員並分配空間初始化
2.jvm載入完class
2.1.讀取位元組碼,讀取欄位,計算欄位未來需要申請的空間
2.2.讀取位元組碼,讀取方法,標記方法簽名
2.3.讀取位元組碼,判斷是否有靜態變數,有,立即分配記憶體空間
3.由於static成員是先載入的,所有靜態方法不能訪問例項成員,原因很簡單,因為靜態方法先載入,這時候例項方法還沒沒建立,所有也就無法訪問了,返回來,物件的例項方法是可以訪問靜態成員的
final修飾符
- final修飾的類:表示最終的類, 該類不能再有子類
- final修飾的方法:最終的方法, 該方法不能被子類覆蓋
- final修飾的變數:表示常量,該變數只能賦值一次,不能再重新賦值
- 基本資料型別:表示的值不能改變
- 引用資料型別:所引用的地址值不能改變
程式碼塊
{} 標記的程式碼稱為程式碼塊
普通程式碼塊
普通程式碼塊{},一般存在於方法中,形成作用域
作用域:
作用域可以進行巢狀,內層作用域可以訪問外層作用域,反之則不能
構造程式碼塊
構造程式碼塊在類中(類的內部,方法外),構造程式碼塊,每new一個物件都會執行一次,在構造方法前執行
靜態程式碼塊
被static修飾的程式碼塊
靜態程式碼塊位於類的內部、方法的外部。 靜態程式碼塊只執行一次,在構造程式碼塊、構造方法前執行。
內部類
- 類與類存在平行關係
一個檔案可以定義多個類,但是隻能存在一個public類,有多少個類,就存在多少份位元組碼
public class Person{
}
class Student{
}
- 類與類存在包含關係
public class Outer {
public class Inner{
}
}
Outer和Inner是包含關係。Outer稱為外部類,Inner稱為內部類。
內部類Inner作為一個Outer的成員而存在。
成員(例項)內部類
內部類Inner作為外部類的一個成員而存在,Inner稱為成員內部類。沒有使用static修飾的內部類,訪問內部類使用外部類的物件來訪問
一般成員內部類的訪問修飾符都是預設訪問許可權(包訪問許可權)
//定義內部類
public class Outer {
[修飾符] class Inner{
}
}
//建立物件
public static void main(String[] args) {
Outer outer = new Outer(); // 建立外部類物件
Outer.Inner inner = outer.new Inner();// 建立內部類物件
inner.showInfo(); //呼叫內部類的方法
}
- 成員內部類特性
成員內部類可以直接訪問 外部類的 私有成員
靜態內部類
成員內部類被static修飾,變成了靜態內部類,作為外部類的一個靜態成員存在
public class Outer {
static class Inner{
}
}
- 靜態內部類特性
靜態內部類可以訪問 外部類的 靜態私有成員
方法(區域性)內部類
方法內部類只能存在於方法中,也只能在方法中建立物件
方法內部類特性
方法內部類可以讀取 方法的區域性變數,但不能修改。
匿名內部類
當一個類只使用一次,可以宣告匿名內部類
但是匿名內部類必須要有 實現 存在
public class Test01 {
public static void main(String[] args) {
Animal animal = new Animal(){
@Override
public void showInfo() {
System.out.println("我是子類匿名內部類");
}
};
animal.showInfo();
new IUsb(){
@Override
public void showInfo() {
System.out.println("我是匿名內部類");
}
}.showInfo();