2013-02-18 50 views
9

Tôi đang học java. Tôi có một nghi ngờ về thừa kế. Khi một lớp con mở rộng lớp cha và lớp cha có một phương thức tham chiếu đến một biến cá thể được khai báo trong cha mẹ. Nhưng lớp con dint ghi đè phương thức này và đã khai báo biến cá thể có cùng tên với cha mẹ. Trong trường hợp này, biến mẫu từ con sẽ được giới thiệu hoặc phụ huynh sẽ được giới thiệu. Dưới đây là đoạn mãGiá trị ghi đè kế thừa thừa kế Java

class parent { 
    int a; 
    parent() { 
     System.out.println("in parent"); 
     a = 10; 
    } 
    void method() { 
     System.out.println(a); 
    } 
} 
class child extends parent { 
    int a; 
    child() { 
     System.out.println("in child"); 
     a = 11; 
    } 
} 

public class Test { 
    public static void main(String args[]) throws IOException { 
     parent p1 = new child(); 
     p1.method(); 
    } 
} 

Kết quả tôi nhận được là

trong mẹ
trong con

Ai đó có thể xin vui lòng làm cho tôi hiểu tại sao dụ tầng lớp phụ huynh giới thiệu mình của biến a và không phải là lớp con của a.

Một nghi ngờ khác là, tôi đã hiểu cách ẩn phương thức, khi có một phương thức tĩnh trong lớp cha và lớp con cũng đã khai báo một phương thức tĩnh có cùng chữ ký. Ở đây ẩn nghĩa là gì? phương pháp nào bị ẩn? Nếu phương pháp cha mẹ của nó, bạn có thể vui lòng giải thích cho tôi?
Cảm ơn bạn trước.

+2

Bạn có chắc là mã của bạn có biên dịch không? Bạn đã chạy mã của bạn chưa? –

+1

Điều này không nên biên dịch, cha mẹ không có phương thức 'method()' –

+0

Xin lỗi đã bị định dạng sai. đã cập nhật mã ngay bây giờ. – Mojoy

Trả lời

17
  1. Biến mẫu Java không thể ghi đè trong lớp con. Thừa kế Java không hoạt động theo cách đó.

  2. Trong ví dụ của bạn, không có phương pháp ẩn (hoặc ghi đè hoặc quá tải) đang diễn ra.

  3. Có ẩn các biến mẫu mặc dù. Trong lớp child, việc khai báo a ẩn tuyên bố của a trong parent và tất cả các tham chiếu đến a trong lớp child tham chiếu đến child.a không phải là parent.a.

Để minh họa điều này rõ ràng hơn, hãy thử chạy này:

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    parent p1 = c1; 

    System.out.println("p1.a is " + p1.a); 
    System.out.println("c1.a is " + c1.a); 
    System.out.println("p1 == c1 is " + (p1 == c1)); 
} 

Nó nên đầu ra:

p1.a is 10 
    c1.a is 11 
    p1 == c1 is true 

này cho thấy rằng có một đối tượng với hai lĩnh vực riêng biệt gọi là a .. và bạn có thể nắm giữ cả hai giá trị của chúng, nếu truy cập cho phép nó.


Cuối cùng, bạn nên học cách tuân theo quy ước định danh Java chuẩn. Tên lớp nên LUÔN LUÔN bắt đầu bằng một chữ cái viết hoa.

2

Instance variables are not overriden in sub-class. Nếu bạn xác định một biến trong lớp của bạn có cùng tên như trong lớp siêu của bạn, nó được gọi là che bóng các biếninheretence and polymorphism không áp dụng cho các biến mẫu. nếu bạn định nghĩa method() trong parent và ghi đè nó trong lớp Child. dưới đây sẽ gọi phương thức của con() do thời gian chạy polymorphism in

parent p1 = new child(); 
  1. gọi constructor Child
  2. với constructor cha mẹ của các siêu() gọi invoke của
  3. In "trong cha mẹ "và khởi tạo Parent's a thành 10
  4. in ở trẻ em và khởi tạo Chils a đến 11

    p1.method();// this invokes Child's method() during run-time 
    
0

Sự cố là bạn đã tạo một phiên bản con và lưu trữ nó trong tham chiếu của phụ huynh. Do đó, khi bạn truy cập thuộc tính của đối tượng, JVM tham chiếu đến giá trị biến của cha.

Trong trường hợp, nó sẽ là biến tham chiếu của lớp con, bạn sẽ nhận được giá trị biến của lớp con.

Ở trên là một tính năng của Java.

0

Khi bạn tạo Instance of Parent. vì vậy trong thời gian chạy trình biên dịch gọi đối tượng cha mẹ, thử mã Dưới đây.

public static void main(String args[]) throws IOException { 
    child c1 = new child(); 
    c1.method(); 
} 
1

Khi bạn làm

P1 Chánh này = Child mới();

gì JVM làm là

   first Initialize Parent() 

         || 

       second Initialize Child() 

Vì vậy, xây dựng Chánh đầu tiên được gọi và sau đó đứa trẻ, nhưng giá trị sản lượng sẽ là 11, vì p1 là đề cập đến đối tượng của trẻ.

1

Khi bạn đang không trọng phương pháp() trong lớp trẻ, khi tuyên bố,

parent p1 = new child(); 

được thực thi, phiên bản mẹ của phương pháp() sẽ được thực thi, và chỉ có một giá trị đã biết đến lớp cha mẹ là riêng của nó a. do đó nó sẽ in a = 10 (vì nó ở trên ngăn xếp tại thời điểm đó).

cuối cùng, bạn chỉ đang ẩn biến từ lớp cha thành lớp con.

Các vấn đề liên quan