2010-03-03 42 views
5

Tôi có hai câu hỏi về mã sau đây. 1. Làm thế nào để khởi tạo constructor thứ ba mà không sử dụng setter? 2. this() làm gì trong hàm tạo cuối cùng."this()" làm gì trong một hàm tạo?

 
public class Person { 

    private String name; 
    private String address; 

    Person(){} 
    Person(String name){ 
     this.name = name; 
    } 
    Person(String address){ 
     //Person(java.lang.String) is already defined. 
    } 

    Person(String name,String address){ 
     this(); 
     this.name = name; 
     this.address = address; 
    } 
} 

Giải pháp của tôi cho câu hỏi là Person (địa chỉ Object) this.address = địa chỉ { (String); } Tuy nhiên, tôi không chắc chắn về điều này.

và tôi nghĩ điều này(); trong constructor cuối cùng gọi hàm tạo Con người() {}, nhưng nếu có, có nghĩa là hai đối tượng Person được tạo khi tôi gọi

 
Person p = new Person("myName","myAddress"); 

Cảm ơn !!!

+0

Cảm ơn đã trả lời nhanh chóng. tôi đã thực sự đọc một bài đăng khác và chỉ xuất hiện với hai câu hỏi không chắc chắn này, vì vậy đã tạo nên ví dụ này. Tuy nhiên, câu hỏi là rõ ràng bây giờ, cảm ơn một lần nữa. – user200340

Trả lời

8

Vấn đề với Person(String name)Person(String address) là bạn không thể có hai nhà xây dựng với các thông số tương tự. Trình biên dịch sẽ không biết cái nào để gọi khi bạn muốn gọi một cái gì đó như thế này: new Person("Joe Blow");

Bạn có thể làm một cái gì đó như thế này thay vì:

Person(String name) 
{ 
    this.name = name; 
} 
Person(String name, String address) 
{ 
    this(name); 
    this.address = address; 
} 

các "this()" trong constructor cuối cùng của bạn là chỉ cần nói rằng constructor để gọi hàm tạo mặc định như là một phần của quá trình xây dựng đối tượng. Nó không tạo ra hai đối tượng, nó chỉ chạy mã trong def. constructor, mà trong trường hợp của bạn, không có gì.

+0

Câu trả lời hay. Tuy nhiên, tại sao không đi ngược lại với điều này (String, "") (xem câu trả lời của tôi)? – JasCav

+0

Vâng, đó là một điểm tốt cho câu trả lời của bạn. Có các nhà xây dựng tổng quát hơn gọi những người cụ thể hơn. –

0

Bạn đúng về tuyên bố cuối cùng, nhưng hai đối tượng Person không được tạo. Bên trong, điều này giống như một cuộc gọi phương thức. Tôi không hiểu những gì bạn đang cố gắng đạt được với mã này. Để gọi hàm tạo cuối cùng, new Person("1", "2") hoặc nội bộ this("1", "2") trong hàm tạo. Cũng không có người định cư ở đây. Người định cư là các phương pháp như setName(String), setAddress(String) và v.v. Getters là các phương thức như String getName(), String getAddress().

Như một câu trả lời khác cho biết, bạn cũng không thể có hai hàm tạo với cùng các loại đối số. Chỉ cần tạo một hàm tạo với mọi thứ bạn cần để đặt trong đó.

0
  1. Rất tiếc, không hiểu câu hỏi
  2. Có, this() gọi hàm tạo đầu tiên. Nhưng đừng lo lắng, hai trường hợp sẽ không được tạo ra! Trên thực tế việc tạo ra thể hiện mới được thực hiện trong hai phần: phân bổ bộ nhớ, gọi hàm tạo. Vì vậy, nếu bạn gọi nội bộ một hàm tạo khác, nó sẽ chỉ thực thi mã đó. nhà xây dựng bản thân chỉ là một phương pháp đặc biệt, nó không tạo ra dụ
4

Điều gì đó cần suy nghĩ - bạn có MUỐN một đối tượng Người được tạo không có tên hoặc địa chỉ không? Nếu bạn không, tại sao cung cấp những nhà xây dựng (không phải là bạn có thể anyway - họ có các thông số tương tự, do đó, trình biên dịch không thể phân biệt chúng)? Tôi nghĩ mọi người sẽ có một cái tên. Có thể ai đó sẽ không có địa chỉ.

Suy nghĩ về đối tượng của bạn trước khi tạo nhà thầu.

Một khả năng khác là:

public class Person { 

    private String name; 
    private String address; 

    Person(String name) { 
     this(name, ""); 
    } 

    Person(String name, String address) { 
     this.name = name; 
     this.address = address; 

     // TODO - Other initializations. 
    } 
} 
0

này gọi là Person() nhưng hai đối tượng không được tạo ra.

1

phương pháp sử dụng nhà máy để xây dựng đối tượng này

public class Person { 

    private String name; 
    private String address; 

    public Person(String name, String address) { 
     this.name = name; 
     this.address = address; 
    } 

    public static Person createHomelessPerson (String name) 
    { 
     return new Person(name, null); 
    } 

    public static Person createNamelessPerson (String address) 
    { 
     return new Person(null, address); 
    } 
} 
+0

+1 cho tên phương thức! : D –

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