JavaRush /Blog Java /Random-VI /Sự khác biệt giữa từ khóa này và siêu từ khóa trong Java
grishin
Mức độ
Харьков

Sự khác biệt giữa từ khóa này và siêu từ khóa trong Java

Xuất bản trong nhóm
thissuperlà hai từ khóa đặc biệt trong Java tương ứng đại diện cho phiên bản hiện tại của một lớp và siêu lớp của nó. Các lập trình viên Java thường nhầm lẫn những từ này và ít nhận thức được các thuộc tính đặc biệt của chúng, những điều thường được hỏi trong các cuộc phỏng vấn về Java Core. Ví dụ: một số câu hỏi hiện lên trong đầu bạn ngay lập tức là về thissuper, Có thể gán một ý nghĩa khác cho một từ khóa thistrong Java không? và sự khác biệt giữa các từ khóa thissupertrong Java là gì. Không biết? Chà, tôi không đưa ra câu trả lời ở đây - nó có thể được tìm thấy ở cuối bài viết. Sự khác biệt giữa từ khóa this và super trong Java - 1Vì vậy, như tôi đã nói lúc đầu, sự khác biệt chính giữa thissupertrong Java là thisthể hiện hiện tại của một lớp đại diện, trong khi superthể hiện hiện tại của lớp cha đại diện. Đây là một ví dụ về cách sử dụng các biến thissuper- bạn có thể đã thấy các ví dụ về cách gọi hàm tạo của cái này với cái gọi là biến khác. gọi các hàm tạo trong một chuỗi, điều này có thể thực hiện được thông qua việc sử dụng từ khóa thissuper. Bên trong một lớp, để gọi hàm tạo không có đối số của nó, được sử dụng this(), trong khi super()nó được dùng để gọi hàm tạo không có đối số, hoặc vì nó còn được gọi là hàm tạo mặc định của lớp cha. Nhân tiện, bằng cách này, bạn có thể gọi không chỉ một hàm tạo mà không có đối số mà còn có thể gọi bất kỳ hàm tạo nào khác bằng cách truyền cho nó các tham số thích hợp. Chúng ta sẽ sớm thấy một ví dụ về thisviệc sử dụng này super. Ngoài ra trong thisJava, superchúng còn được sử dụng để truy cập các biến của một thể hiện của lớp và cha của nó. Trên thực tế, chúng có thể được truy cập mà không cần tiền tố superthis, nhưng chỉ khi trong khối hiện tại, các biến đó không trùng lặp với các biến khác, tức là. nếu nó không chứa các biến cục bộ có cùng tên, nếu không bạn sẽ phải sử dụng tên có tiền tố, nhưng điều này không thành vấn đề, bởi vì ở dạng này chúng thậm chí còn dễ đọc hơn. Một ví dụ kinh điển của phương pháp này là sử dụng nó thisbên trong một hàm tạo lấy tham số có cùng tên với biến thể hiện. Ở phần sau của bài viết, chúng ta sẽ tìm hiểu những khác biệt khác giữa superthisvà xem xét một số ví dụ về cách sử dụng chúng.

Cái này và cái siêu giống nhau thế nào

Trước khi xem xét sự khác biệt giữa từ khóa thissuper, hãy xem xét một số điểm tương đồng của chúng:
  1. Cả hai thissuperđều là các biến không tĩnh, vì vậy chúng không thể được sử dụng trong ngữ cảnh tĩnh, có nghĩa là chúng không thể được sử dụng trong phương thức chính. thisĐiều này sẽ dẫn đến lỗi thời gian biên dịch " không thể tham chiếu biến không tĩnh từ ngữ cảnh tĩnh". Điều tương tự cũng xảy ra nếu bạn sử dụng từ khóa trong phương thức chính super.

  2. Cả this, và supercó thể được sử dụng bên trong hàm tạo để gọi các hàm tạo khác trong chuỗi, ví dụ: this() và super() gọi hàm tạo mà không có đối số tương ứng của lớp kế thừa và lớp cha.
Trong ví dụ bên dưới, trước tiên chúng ta chuyển lệnh gọi từ hàm tạo không có đối số của lớp B sang hàm tạo của cùng lớp B nhận một tham số duy nhất thuộc loại String, sau đó super("")gọi hàm tạo một đối số từ siêu lớp.
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();
    }

}
Đầu ra: Hàm tạo một đối số của lớp A Hàm tạo một đối số của lớp B Hàm tạo không có đối số của lớp B
  1. Bên trong hàm tạo thissuperphải xuất hiện phía trên tất cả các biểu thức khác ngay từ đầu, nếu không trình biên dịch sẽ đưa ra thông báo lỗi. Từ đó, một hàm tạo không thể chứa cả hai this()super().

Sự khác biệt giữa siêu và này

Bây giờ chúng ta đã biết cách sử dụng từ khóa superthishiểu chúng cần thiết để làm gì. Nhưng có một tùy chọn khác để sử dụng những từ khóa này mà tôi chưa đề cập đến - trong các lớp Bên trong, nơi với sự trợ giúp của chúng, sẽ rất thuận tiện khi tham chiếu đến lớp bên ngoài bằng cách sử dụng biểu mẫu ký hiệu Bên ngoài. thischo phiên bản hiện tại của nó và Outer. super- cho bố mẹ anh ấy. Đừng quên thay thế Outer bằng tên của lớp bên ngoài. Bây giờ hãy liệt kê ngắn gọn những khác biệt chính giữa từ khóa thissuper
  1. một biến thisđề cập đến phiên bản hiện tại của lớp mà nó được sử dụng, trong khi nó superđề cập đến phiên bản hiện tại của lớp cha.

  2. Mỗi hàm tạo, trong trường hợp không có lệnh gọi rõ ràng đến các hàm tạo khác, sẽ gọi ngầm super()hàm tạo không có đối số của lớp cha của nó, nhưng bạn luôn có tùy chọn gọi rõ ràng bất kỳ hàm tạo nào khác bằng this(), hoặc super().
Đây có lẽ là tất cả những gì có thể nói về sự khác biệt giữa các từ khóa thissupertrong Java cũng như cách chúng được sử dụng trong các chương trình. Như chúng ta đã thấy, mục đích chính của chúng là gọi hàm tạo này từ hàm tạo khác và tham chiếu đến các biến thể hiện được khai báo trong lớp hiện tại và lớp cha của nó. Đừng quên rằng đây không hẳn là những biến số thông thường, và bây giờ - câu trả lời cho câu hỏi mà tôi đã hỏi ở đoạn đầu tiên. Không, một biến thiskhông thể được gán giá trị mới vì nó được khai báo là giá trị cuối cùng. Bạn có thể thử thực hiện việc này trong IDE - bạn sẽ nhận được lỗi biên dịch "bạn không thể gán giá trị mới cho một biến this- nó được khai báo là cuối cùng." Bài viết gốc ở đây .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION