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

Java sử dụng tham chiếu đối tượng của kiểu cha để truy cập các thành viên được bảo vệ trong các lớp con trong các gói khác nhau

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

Tôi có đoạn mã sau trong hai tệp riêng biệt.

gói động vật;

lớp công cộng Ếch
{
ribbit void được bảo vệ ()
{
System.out.println("Trong lớp Ếch!");
}
}





gói khác;

nhập khẩu động vật.*;

lớp công khai Nòng nọc mở rộng Ếch

{
ribbit void được bảo vệ ()
{
System.out.println("Trong lớp Nòng Nọc!");
}

public static void main(String[] args)
{
Nòng nọc t = Nòng nọc mới();
t.ribbit();

Ếch f = Nòng nọc mới();
f.ribbit(); // Không biên dịch
}
}

được giao cho con nòng nọc gõ đầu tiên con nòng nọc Đối tượng dường như biên dịch tốt và ribbit() Cuộc gọi sẽ dành cho con nòng nọc của ribbit() hoàn thành. Được tạo và gán cho Con ếch Điều thứ hai được trích dẫn con nòng nọc sự vật. Tuy nhiên, việc gọi ribbit() sẽ gây ra lỗi biên dịch.

Tôi biết rằng nếu bạn tạo một đối tượng lớp con trong một lớp con và gán nó cho một tham chiếu siêu lớp bên ngoài gói lớp con và cố gắng gọi phương thức siêu lớp thì điều này là không được phép. Nhưng trong trường hợp này, vì con nòng nọc Vì đối tượng, tính đa hình không nên thực hiện lệnh gọi "f" tham chiếu đối tượng con nòng nọc của ribbit() phương thức được gán cho nó? Tại sao điều này gây ra lỗi trình biên dịch và tại sao điều này không được phép?

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

Điều này liên quan đến việc truy cậpprotected Quy định thành viên của lớp. Nhìn thấy phần nàyChi tiết từ Đặc tả ngôn ngữ Java, cụ thể:

Gọi C là lớp trong đó a protected thành viên được khai báo. Quyền truy cập chỉ được phép trong phần thân của lớp con S của C.

Ngoài ra, nếu Id biểu thị một trường phiên bản hoặc phương thức phiên bản, sau đó:

  • Nếu quyền truy cập theo tên đủ điều kiện Q.Id hoặc biểu thức tham chiếu phương thức Q :: Id (§15.13), trong đó Q là Tên biểu thức, thì quyền truy cập được phép khi và chỉ khi loại biểu thức Q là S hoặc a lớp con của S.

  • Nếu quyền truy cập được thực hiện bằng biểu thức truy cập trường E.Id hoặc biểu thức gọi phương thức E.Id(...) hoặc biểu thức tham chiếu phương thức E :: Id, trong đó E là biểu thức Chính (§15.8), thì quyền truy cập được phép nếu và chỉ khi loại E là S hoặc một lớp con của S.

Vì thế ở Con ếch Trong một lớp con của , nếu x 是一个 , bạn chỉ có thể truy cập x.ribbit() Con ếch lớp con của(x không thể được khai báo là Con ếch).

Hạn chế này tồn tại ở protected thành viên, nếu không, giả sử Con ếch Có một sự bảo vệ int Lĩnh vực:

lớp công cộng Ếch {
được bảo vệ int a = 1;

...
}

Sau đó bạn có thể Con ếch Xác định một lớp con của công cộng 方法:

lớp công khai TadPole mở rộng Frog {

public int RevealFieldValueOfParent(Ếch ếch) {
return ếch.a; // hãy tưởng tượng điều này ổn
}
}

Sau đó, bất kỳ lớp nào khác (không liên quan) đều có thể được truy cập bằng cách thêm Con ếch Chuyển đến phương thức lớp con để truy cập vào trường:

lớp công khai SomeOtherClass {

public static void main(String[] args) {
Nòng nọc TadPole = TadPole mới();
Ếch Ếch = Ếch mới();
int tiếtValue = nòng nọc.revealFieldValueOfParent(ếch);
// in giá trị tiết lộ
}
}

biên tập:

Lỗi trình biên dịch này không liên quan gì đến tính đa hình. Tính đa hình liên quan đến loại thực tế của đối tượng là một khía cạnh thời gian chạy, trình biên dịch không cố gắng tính đến biến trong thời gian chạy f Có thực sự trích dẫn hay không Con ếch hoặccon nòng nọc. Tất cả những gì trình biên dịch làm ở đây là thực thi protected Quy tắc dành cho người sửa đổi, không có gì hơn.

编辑 2:

Theo ý kiến ​​​​dưới đây,RevealFieldValueOfParent(Ếch ếch) phương pháp thực sự sẽtrình diễn protected giá trị nếu chúng ta thay đổi nó thànhRevealFieldValue(Ếch TadPole), nhưng bạn cũng có thể sử dụng các thành viên riêng tư để hiển thị các thủ thuật (tức là tương tự như các phương thức getter). Trách nhiệm của lớp con là phải biết nó đang làm gì.

Về việc Java sử dụng các tham chiếu đối tượng kiểu cha để truy cập các thành viên được bảo vệ trong các lớp con trong các gói khác nhau, 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/31995632/

26 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