2010-11-15 35 views
7

Tôi có câu hỏi về người mới bắt đầu java: Parent.print() in "hallo" trong bảng điều khiển, nhưng cũng Child.print() in "hallo". Tôi nghĩ rằng nó đã in "con". Làm cách nào để tôi có thể giải quyết vấn đề này?Ví dụ mở rộng Java

public class Parent { 

    private String output = "hallo"; 

    public void print() { 
     System.out.println(output); 
    } 

} 

public class Child extends Parent { 

    private String output = "child"; 

} 

Trả lời

7

Hiện nay bạn đã có hai biến riêng biệt, và các mã trong Parent chỉ biết về Parent.output. Bạn cần đặt giá trị Parent.output thành "con". Ví dụ:

public class Parent { 

    private String output = "hallo"; 

    protected void setOutput(String output) { 
    this.output = output; 
    } 

    public void print() { 
    System.out.println(output); 
    } 
} 

public class Child extends Parent { 
    public Child() { 
    setOutput("child"); 
    } 
} 

Một phương pháp khác sẽ được cung cấp cho các tầng lớp phụ huynh một constructor mà mất đầu ra mong muốn:

public class Parent { 
    private String output; 

    public Parent(String output) { 
    this.output = output; 
    } 

    public Parent() { 
    this("hallo"); 
    } 

    public void print() { 
    System.out.println(output); 
    } 
} 

public class Child extends Parent { 
    public Child() { 
    super("child"); 
    } 
} 

Nó thực sự phụ thuộc vào những gì bạn muốn làm.

+0

ok, nó hoạt động, nhưng tôi don không hiểu tại sao cố gắng của tôi không có khả năng để làm việc .... –

+0

@ Martin: Bởi vì bạn đã tạo một biến hoàn toàn riêng biệt và đặt giá trị của * that * trong 'Child'. Lớp 'Parent' không biết biến trong' Child'. –

3

Child không có quyền truy cập vào biến output dụ Parent 's vì nó là private. Những gì bạn cần làm là làm cho nó protected và trong các nhà xây dựng của Child thiết lập output đến "child".

Nói cách khác, hai biến số output khác nhau.

Bạn cũng có thể làm điều này nếu bạn thay đổi đầu ra được protected trong Parent:

public void print(){ 
    output = "child" 
    super.print(); 
} 
0

Lý do tại sao trẻ không in "con" là thừa kế trong java, chỉ có các phương thức được kế thừa chứ không phải các trường. Biến số output không bị ghi đè bởi đứa trẻ.

Bạn có thể làm điều đó như thế này:

public class Parent { 
    private String parentOutput = "hallo"; 

    String getOutput() { 
     return output; 
    } 

    public void print() { 
     System.out.println(getOutput()); 
    } 
} 

public class Child extends Parent { 
    private String childOutput = "child"; 

    String getOutput() { 
     return output; 
    } 
} 

Ngoài ra, các biến chuỗi không cần phải là tên gọi khác nhau, nhưng tôi đã làm như vậy ở đây cho rõ ràng.

Một cách dễ đọc hơn sẽ là để làm điều này:

public class Parent { 
    protected String output; 

    public Parent() { 
     output = "hallo"; 
    } 

    public void print() { 
     System.out.println(output); 
    } 
} 

public class Child extends Parent { 
    public Child() { 
     output = "child"; 
    } 
} 

Trong ví dụ này biến là protected, có nghĩa là nó có thể được đọc từ cả phụ huynh và trẻ em. Hàm khởi tạo của các lớp đặt biến cho giá trị mong muốn. Bằng cách này, bạn chỉ thực hiện chức năng in một lần và không cần phương thức ghi đè trùng lặp.

0

Khi tôi cố gắng tìm ra từ khóa mở rộng, tôi đã sử dụng hai lớp. Tôi hy vọng điều đó cũng sẽ giúp bạn hiểu được ý tưởng cơ bản.

Parent.java

public class Parent { 
    private int a1; 
    private int b1; 


    public Parent(int a, int b){ 
     this.a1 = a; 
     this.b1 = b; 
    } 

    public void print() { 
     System.out.println("a1= " + this.a1 + " b1= " + this.b1); 
    } 

} 

Child.java

public class Child extends Parent { 
     public Child(int c1, int d1){ 
     super(c1,d1); 
    } 

    public static void main(String[] args) { 
     Parent pa = new Parent(1,2); 
     pa.print(); 
     Child ch = new Child(5,6); 
     ch.print(); 
    } 

}