JavaRush /Java Blog /Random-TW /Java中this和super關鍵字的差別
grishin
等級 27
Харьков

Java中this和super關鍵字的差別

在 Random-TW 群組發布
thissuper是 Java 中的兩個特殊關鍵字,分別表示類別及其超類別的當前實例。Java 程式設計師經常混淆這些詞,並且很少意識到它們的特殊屬性,而這些特殊屬性在 Java Core 面試中經常被問到。例如,我立即想到的幾個問題是關於thisand 的super,是否可以為thisJava 中的關鍵字分配不同的意義?thisJava 中的關鍵字和有什麼差別super。不知道?好吧,我不會在這裡給出答案 - 可以在文章末尾找到答案。 Java中this和super關鍵字的差異 - 1所以,正如我一開始所說的, JavathissuperJava 中的主要差異在於,代表的是this類別的當前實例,而super代表的是父類別的當前實例。這是使用變數的一個範例this,並且super- 您可能已經看到了從一個變數呼叫另一個變數的建構函數的範例,即所謂的。在鏈中呼叫建構函數,這可以透過使用關鍵字thisand來實現super。在類別內部,要呼叫其無參構造函數,請使用 use this(),而super()它用於呼叫無參構造函數,或也稱為父類的預設建構函數。順便說一句,透過這種方式,您不僅可以呼叫不帶參數的建構函數,還可以透過向其傳遞適當的參數來呼叫任何其他建構函數。我們很快就會看到這種this用法的範例super。同樣在thisJava中super,它們也用於存取類別實例及其父類別的變數。事實上,可以在沒有前綴super和 的情況下存取它們this,但前提是在當前區塊中這些變數不與其他變數重疊,即 如果它不包含同名的局部變量,否則你將不得不使用帶有前綴的名稱,但這並不重要,因為 在這種形式下,它們更具可讀性。這種方法的一個經典範例是在內部使用this建構函數,該構造函數採用與實例變數同名的參數。在本文後面,我們將了解super和之間還有哪些其他區別this,並查看它們的一些使用範例。

this 和 super 有何相似之處

this在了解關鍵字和之間的差異之前super,讓我們先看看它們的一些相似之處:
  1. thissuper都是非靜態變量,因此它們不能在靜態上下文中使用,這意味著它們不能在 main 方法中使用。這將導致編譯時錯誤“this無法從靜態上下文引用非靜態變數”。如果您在 main 方法中使用關鍵字,也會發生相同的情況super

  2. this, 和都super可以在建構函數內部使用來呼叫鏈中的其他建構函數,例如,this() 和super() 分別呼叫不帶繼承類別和父類別參數的建構子。
在下面的範例中,我們首先將呼叫從類別 B 的無參數建構函式傳遞給同一類別 B 的具有單一型別參數的建構函數,該函式又從超類別呼叫單參數建構Stringsuper("")
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
輸出: 類別 A 的單參建構子 類別 B 的單參建構子 類別 B 的無參構造函數
  1. 在構造函數內部this, 和super必須出現在所有其他表達式之上,在最開始的位置,否則編譯器將發出錯誤訊息。由此可見,一個構造函數不能同時包含this(), 和super()

super 和 this 的區別

現在我們知道如何使用關鍵字superthis了解為什麼需要它們。但是還有另一種使用這些關鍵字的選項,我沒有提到 - 在內部類別中,在它們的幫助下,使用外部表示法形式引用外部類別非常方便。this對於其目前實例和外部。super- 為了他的父母。不要忘記將 Outer 替換為外部類別的名稱。this現在讓我們簡單列出一下關鍵字和關鍵字之間的主要區別super
  1. 變數this指的是使用它的類別的當前實例,而它super指的是父類別的當前實例。

  2. 在沒有明確呼叫其他建構函數的情況下,每個建構函數都會隱式地呼叫super()其父類別的無參數建構函數,但您始終可以選擇使用 、this()或 明確呼叫任何其他建構子super()
這可能就是關於 Java 中關鍵字thisand之間的差異super以及它們在程式中如何使用的全部內容。正如我們所看到的,它們的主要目的是從另一個建構函數呼叫一個建構函數,並引用當前類別及其父類別中聲明的實例變數。不要忘記這些並不完全是普通變量,現在 - 我在第一段中提出的問題的答案。不,不能為變數this分配新值,因為它被聲明為最終的。您可以嘗試在 IDE 中執行此操作 - 您將收到編譯錯誤“您無法為變數分配新值this- 它被聲明為最終值。” 原文在這裡
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION