2012-07-13 43 views

Trả lời

5

Bạn có thể không quá tải lĩnh vực (chỉ phương pháp có thể bị quá tải), bạn có thể bị nhầm lẫn với trọng lĩnh vực - mà nào là không thể, bạn kết thúc ẩn các lĩnh vực từ superclasses. Hãy xem điều này post.

+1

Tôi nghĩ đây là trường hợp và lúc đầu tôi hơi bối rối khi họ đến với tôi về nó. Tôi mới chỉ lập trình Java được ba năm nay và đã không gặp vấn đề này. Chỉ muốn chắc chắn rằng tôi đã không bỏ lỡ bất cứ điều gì. –

+1

@BrandonWilson không thể thực hiện được – Pooya

0

Tôi tin rằng java hỗ trợ giao diện, và giao diện sẽ có thể giúp bạn đạt được những gì bạn đang cố gắng để đạt được

here's an example i found quick

here's a tutorial

chỉ cần đảm bảo rằng bạn không quá tải các thành viên công cộng theo cách đó.

0

nhìn vào mã này

class A<T> { 
    protected T field1; 
} 

class B extends A<String> { 
    public char field1; 

    public static void main(String[] args) { 
     A a = new B(); 
     a.field1 = 12442; 
    } 
} 

nó chạy mà không cần bất kỳ ngoại lệ, nếu field1 overrided, cần huy động một ngoại lệ, nhưng nó không

và cũng này chạy mà không có bất kỳ ngoại lệ

class A<T> { 
    protected T field1; 
} 

class B extends A<Character> { 
    public char field1; 

    public static void main(String[] args) { 
     A a = new B(); 
     a.field1 = 12442; 
    } 
} 

Không thể

0

Java ngôn ngữ (JLS) không cho phép điều đó, nhưng Java bytecode (JVM) không

Oracle JDK 1.8.0_45 thậm chí dựa vào nó để thực hiện assert. Ví dụ:

public class Assert { 
    static final int[] $assertionsDisabled = new int[0]; 
    public static void main(String[] args) { 
     System.out.println(int.length); 
     assert System.currentTimeMillis() == 0L; 
    } 
} 

tạo ra hai Oracle JDK 1.8.0_45, một rõ ràng (int[]) và một tổng hợp (bool), và là hạnh phúc có thể phân biệt giữa chúng. Nhưng nếu chúng ta đã tuyên bố:

static final boolean $assertionsDisabled = false; 

nó sẽ không biên dịch với:

the symbol $assertionsDisabled conflicts with a compile synthesized symbo 

Xem https://stackoverflow.com/a/31355548/895245 để biết thêm chi tiết.

Có thể lý do tại sao nó không thể

Vấn đề là nó sẽ không thể thực hiện để xác định loại của lĩnh vực này. Hãy xem xét:

void f(int i) { System.out.println("int"); } 
void f(float i) { System.out.println("float"); } 
int i; 
float i; 
// Which overridden method is called? 
void m() { f(i); } 
Các vấn đề liên quan