1. 程式人生 > 其它 >(九)面向物件(補)

(九)面向物件(補)

技術標籤:Java重修之巔峰之路javajava程式語言

面向物件(四)

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.物件.靜態方法()    

靜態方法的特性

  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();