this,構造器,static,final,單例模式

ihav2carryon發表於2024-06-02

this,構造器,static,final,單例模式

this關鍵字

  • 在java中this是一個引用變數,即指向當前物件地址的引用(指標),→可以把this當作當前物件,便於更好的索引.

  • this() 實際是呼叫了當前物件的構造器

  • 1. 引用當前物件的屬性

    • 當在方法中要訪問當前物件的屬性時,可以用this來區分區域性變數與全域性變數.若區域性變數和全域性變數同名,this指向的屬性是全域性變數
    public class MyClass {  
        private int value;  
      
        public MyClass(int value) {  
            this.value = value; // this.value引用的是成員變數value,而value是引數  
        }  
      
        public void setValue(int value) {  
            this.value = value; // 同樣,this.value引用的是成員變數value  
        }  
      
        public int getValue() {  
            return this.value; // 雖然這裡不使用this也能訪問value,但使用this可以增加程式碼的可讀性  
        }  
    }
    
    1. 呼叫當前物件的其他方法
    • 在方法內部也可以用this來呼叫當前物件的其他方法,(包括構造方法)
    public class MyClass {  
        public MyClass() {  
            this.initialize(); // 呼叫當前物件的initialize方法  
        }  
      
        public void initialize() {  
            // 初始化程式碼...  
        }  
    }
    
  • 3.引用當前物件的構造方法

    • this()可以在構造方法是呼叫同一個類的其他構造方法,但必須放在第一行,這樣的好處是實現構造方法的重寫與複用
    public class MyClass {  
        private int value;  
      
        public MyClass() {  
            this(0); // 呼叫帶有單個引數的構造方法  
        }  
      
        public MyClass(int value) {  
            this.value = value;  
        }  
    }
    
    1. 在事件監聽器中使用

    當在事件監聽器(如ActionListener)中需要引用觸發事件的元件時,可以使用this關鍵字(如果監聽器是內部類並且需要引用外部類的例項)。

  • 5.在匿名內部類中使用

    在匿名內部類(如執行緒、事件監聽器等)中,this關鍵字通常指向外部類的例項,而如果要引用匿名內部類的例項,則沒有直接的this引用,通常需要使用其他方式(如將匿名內部類的例項賦值給一個變數)。


構造器(建構函式)

  • 是建立(new)物件時java會預設呼叫的方法,通常用給物件傳遞引數來賦值,

  • 語法

    1. 建構函式沒有返回值,沒有void,int 等等
    2. 建構函式名必須與類名一致
    3. 在建構函式中要第一所傳入的引數列表→非必須
  • 預設構造器

    許可權修飾符 類名()
    {
      //初始化等功能..
    }
    
  • 帶參構造器(常用)

    許可權修飾符 類名(資料型別 引數)
    {
      //初始化等功能..
    }
    

注意點:

  1. 如果一個類中只有帶參構造器,則預設的構造器就會被覆蓋→消失,如果還有需要預設構造器,則需顯示性定義
  2. 同一個類中的構造器可以相互呼叫,需要用this()來呼叫,this必須放在第一行→無參構造器託付有參構造器進行構造
public class Person {  
    private String name;  
    private int age;  
  
    // 無參建構函式  
    public Person() {  
        this("Unknown", 0); // 使用this()呼叫另一個建構函式  
        //透過this之間呼叫有參建構函式
    }  
  
    // 帶兩個引數的建構函式  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    // 省略getter和setter方法...  
  
    public static void main(String[] args) {  
        Person unknownPerson = new Person(); // 呼叫無參建構函式,實際上會委託給帶兩個引數的建構函式  
        System.out.println("Name: " + unknownPerson.getName() + ", Age: " + unknownPerson.getAge());  
  
        Person knownPerson = new Person("John Doe", 30);  
        System.out.println("Name: " + knownPerson.getName() + ", Age: " + knownPerson.getAge());  
    }  
   
}
  1. 在構造器中呼叫其他構造器,不會建立物件,只會初始化
public class Example {  
    private int x;  
    private String y;  
  
    // 第一個構造器,帶有兩個引數  
    public Example(int x, String y) {  
        this.x = x;  
        this.y = y;  
        System.out.println("Two-argument constructor called.");  
    }  
  
    // 第二個構造器,無引數,透過this()呼叫第一個構造器  
    public Example() {  
        this(10, "Default"); // 使用this()呼叫帶有兩個引數的構造器  
        System.out.println("No-argument constructor called.");  
    }  
  
    public static void main(String[] args) {  
        Example obj = new Example(); // 呼叫無引數構造器  
    }  
}

static關鍵字

記憶體角度分析:當我們執行一個java檔案時,java虛擬機器會優先載入方法區中的內容,若遇到stati程式碼塊,則立即執行.也就是說用static關鍵字修飾的內容在物件還未建立之前就被分配了記憶體空間,這也是我們為什麼能夠直接使用類名.方法或類名.變數名去呼叫類變數和類方法的原因,也是為什麼我們不能在類方法中使用例項變數和普通方法的原因。

  • static一般用來修飾成員變數或者函式
  • 被static修飾的變數名叫類變數,方法叫類方法
  • 被static關鍵字修飾的不需要去建立物件去呼叫,可以直接用類名.呼叫
  • 作用:方便再沒有建立物件的情況下來進行呼叫

簡單理解為被static修飾的方法或變數是存放再方法區與類資訊存放在一起

static比例項化物件先分配記憶體空間


final關鍵字

可用來修飾變數和成員方法以及類

final類

  • 當final修飾類時,該類不可被繼承.

final方法

  • 當一個方法被final修飾時,該方法不可被覆蓋→重寫
  • 應用場景:當你希望如果你希望某個方法的行為在整個類層次結構中保持一致,並且不希望被子類改變,那麼你可以將其宣告為 final

final變數

  1. 例項變數:當一個例項變數被修飾成final時,它只能在宣告時或者構造方法中被賦值,且只能被賦值一次
  2. 靜態變數:與例項變數情況相同,必須在宣告或者靜態語句塊中被賦值,且只能賦值一次
  3. 區域性變數:即方法中的變數,在宣告時可以不要立即賦值,但使用前必須賦值

final引數

  • 當一個方法的引數被final修飾時,在這個方法內部不可再被賦值

單例模式

單例模式:是一種設計模式,它確保一個類只能有一個例項,並提供一個全域性訪問的點來訪問這唯一的例項物件, -這個模式在多執行緒環境和一些需要頻繁建立和銷燬物件但又希望限制這些物件數量的場景中特別有用-。

懶漢式→多執行緒下不安全,但節省記憶體空間

public class Singleton {
	
	private static Singleton singleton; //
	//透過宣告一個靜態的私有成員變數,並且在該類被載入到JVM時立即初始化這個變數
	//我們建立了一個類的唯一例項。由於是靜態的,這個例項與類本身相關聯,而不是與類的某個特定例項相關聯。
	//同時,由於是私有的,外部程式碼無法直接訪問這個變數,只能透過類提供的公共方法來獲取它的值。

	private Singleton() { //將建構函式設為私有化,目的是防止外部程式碼透過new建立例項物件
		//它確保了除了類本身之外,沒有其他程式碼能夠例項化這個類
	}
	
	public static Singleton getSingleton() {
		//外部程式碼可以獲取到類的唯一例項。
		由於這個方法是靜態的,我們不需要先建立類的例項就可以呼叫它。
		在方法內部,我們檢查instance是否已經被初始化(即是否為null)。
		如果是,我們就建立一個新的例項並賦值給singleton;如果不是(即singleton已經被初始化過),我們就直接返回singleton。
		由於我們之前已經將建構函式設定為私有,並且singleton是靜態的且只被初始化一次,
		所以getSingleton()方法將始終返回同一個例項
		if(singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}
  • 懶漢式單例模式在第一次被呼叫時才會建立例項,而不是在類載入時立即建立。

餓漢式→可以適用多執行緒,但消耗記憶體空間

public class Singleton2 {
	Singleton2 類中的靜態成員變數 singleton 在宣告的同時就被初始化了。
	這個初始化是在類被 JVM 載入到記憶體時發生的,且只會發生一次。
	由於是靜態的,所以不需要建立類的例項就可以訪問它
	private static Singleton2 singleton = new Singleton2();

	private Singleton2() {
		//使外部不能建立singleton
	}
	
	public static Singleton2 getSingleton() {
		return singleton;
		etSingleton() 是一個公共的靜態方法,用於返回 Singleton2 類的單例例項。
		由於 singleton 已經在類載入時初始化了,所以無論多少次呼叫 getSingleton(),
		它都會返回同一個例項。
	}
}
  • 餓漢式即無論如何先建立一個例項化物件,接下來無論幾次呼叫都返回同一個物件

相關文章