cuốn sách gpt4 ai đã làm

Khai báo hàm khi khởi tạo lớp

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-01 21:33:31 25 4
mua khóa gpt4 Nike

Tôi đã xem qua mã java sau nhưng tôi không chắc ý nghĩa của nó. Chúng ta có thể viết mã bằng '{' sau khi khởi tạo một lớp không, ví dụ: new TestClass { */code go here */}

Nhưng khi tôi cố chạy mã, tôi không thấy "Z is 10" ở đầu ra. Ai đó có thể cho tôi một số liên kết để tôi có thể biết thêm thông tin liên quan đến tính năng này của Java không.

lớp TestClass {
int z;
TestClass công khai(){
z=10;
}
int công khai getZ(){
trả về z;
}
public void setZ(int z){
cái này.z=z;
}
}

hạng A
{
public static void main (String[] args) ném java.lang.Exception
{
TestClass TC = TestClass mới() {
public void testprint() {
System.out.println("Z is " + getZ());
}
};
}
}

câu trả lời hay nhất

Đây là một lớp bên trong ẩn danh. Nó tạo ra một đối tượng là một thể hiện của một số lớp là lớp con của TestClass mà bạn không muốn đặt tên cho lớp con đó (vì bạn chỉ cần tạo đối tượng một cách nhanh chóng và không cần sử dụng lớp đó ở bất kỳ nơi nào khác ) .

Mã chỉ khởi tạo đối tượng, bạn không thực sự gọi các phương thức của đối tượng đã tạo, vì vậy bạn không thấy bất kỳ đầu ra nào. Bạn có thể thêm một dòng vào mã của mình

public static void main (String[] args) ném java.lang.Exception
{
TestClass TC = TestClass mới() {
public void testprint() {
System.out.println("Z is " + getZ());
}
};
// <- gọi phương thức mới (>_< phương thức này sẽ không được biên dịch)
TC.testprint();
}

Trừ khi cách này không hiệu quả vì testprint không được định nghĩa là một phương thức trên TestClass, biến cục bộ tham chiếu đối tượng có kiểu TestClass, do đó trình biên dịch mong muốn tìm thấy một phương thức được xác định trên TestClass hoặc một siêu lớp của TestClass. Bạn có thể thêm một phương thức vào TestClass như sau:

lớp trừu tượng TestClass {
int z;
TestClass công khai(){
z=10;
}
int công khai getZ(){
trả về z;
}
public void setZ(int z){
cái này.z=z;
}
// thêm phương thức mới
bản tóm tắt công khai void testprint();
}

Bây giờ trình biên dịch biết mong đợi một đối tượng kiểu TestClass có một phương thức có tên là testprint. Tôi không phải tạo bản tóm tắt TestClass, tôi có thể thêm triển khai in thử vào đó. Tuy nhiên, vì TestClass là trừu tượng nên rõ ràng đối tượng mới không phải là TestClass mà là một trong các lớp con của nó.

Ngoài ra, hãy gọi phương thức này thông qua một phương thức TestClass khác đã được hiển thị. Sử dụng TestClass của bạn không thay đổi, nhưng thay đổi phương thức chính thành:

public static void main (String[] args) ném java.lang.Exception
{
TestClass TC = TestClass mới() {
public void testprint() {
System.out.println("Z is " + super.getZ());
}
// ghi đè Z getter để gọi testprint
@Ghi đè công khai int getZ(){
thử nghiệm();
trả về z;
}
};
TC.getZ(); // <- gọi phương thức trên đối tượng được tạo ở trên
}

testprint phải được thay đổi để gọi phiên bản siêu hạng của getter của Z, vì vậy chúng ta không có đệ quy vô hạn. Bây giờ getter Z trên lớp con ẩn danh gọi phương thức testprint, vì vậy bạn có thể gọi getter và xem kết quả:

Z là 10

Mã này không gán tên cho lớp con nhưng vẫn gán tên. Nếu tôi thêm một dòng vào cuối main để xem lớp ẩn danh được gọi nội bộ:

    System.out.println(TC.getClass());

nó in

hạng A$1

Trong thực tế, không có hạn chế nào khi các phương thức mới được định nghĩa trong các lớp ẩn danh không thể được gọi trực tiếp. Nếu bạn muốn chuyển việc triển khai một lớp sang một phương thức của một số đối tượng khác, bạn cung cấp một lớp ẩn danh, thứ gì đó lấy đối tượng lớp ẩn danh sẽ không biết (và không nên biết, hãy xem LSP ) cách gọi phương thức mới.

Về java - khai báo hàm khi khởi tạo một lớp, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/23294569/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress