2015-06-06 11 views
12

Tôi biết rằng this(...) được sử dụng để gọi một hàm tạo của một lớp từ một hàm tạo khác. Nhưng chúng ta có thể sử dụng new không?Có thể "mới" được sử dụng bên trong hàm tạo của lớp để gọi một hàm tạo khác trong Java không?

Để rõ ràng hơn về câu hỏi, Line-2 có hợp lệ không? Nếu nó là (như trình biên dịch không khiếu nại), tại sao đầu ra là null không Hello?

class Test0 { 
    String name; 

    public Test0(String str) { 
     this.name= str; 
    } 

    public Test0() { 
     //this("Hello"); // Line-1 
     new Test0("Hello"){}; // Line-2 
    } 

    String getName(){ 
     return name; 
    } 
} 

public class Test{ 
    public static void main(String ags[]){ 
     Test0 t = new Test0(); 
     System.out.println(t.getName()); 
    } 
} 
+1

Tại sao bạn muốn làm điều này? –

+1

@Lutz Horn Tôi thấy mã như vậy ở đâu đó và tôi muốn hiểu cơ bản đằng sau điều này. – Dexter

+3

Bạn có chắc đó là mã có cùng ngữ nghĩa với bạn không? Mã này biên dịch nhưng nó không có ý nghĩa như thế này. –

Trả lời

25

Nó có giá trị nhưng nó tạo ra một riêng dụ hoàn toàn của Test0 (cụ thể hơn một thể hiện của một lớp con nặc danh của Test0) bên trong constructor đó, và nó không được sử dụng bất cứ nơi nào. Phiên bản hiện tại vẫn có trường name được đặt thành null.

public Test0() { 
    // this creates a different instance in addition to the current instance 
    new Test0("Hello"){}; 
} 

Lưu ý rằng nếu bạn gọi tổng đài new với các nhà xây dựng không tham số, bạn sẽ nhận được một StackOverflowError.

+9

Trên thực tế, nó không tạo ra một cá thể 'Test0', mà là một lớp con ẩn danh' Test0'. (Điều này không thay đổi bất cứ điều gì trong trường hợp này, vì đối tượng bị vứt đi.) –

+0

@ Paŭlo Ebermann Thật vậy, tôi đã bỏ lỡ điều đó. – manouti

5

Dòng 2 là tuyên bố hợp lệ. Đó là lý do tại sao trình biên dịch không hiển thị bất kỳ lỗi nào. Nhưng ở đó bạn đang tạo ra một đối tượng ẩn danh. Nó sẽ biến mất ngay sau khi bạn thoát khỏi hàm tạo. Do đó giá trị vẫn là null vì không có gì được gán cho điều đó.

new Test0("Hello"){}; 

Dòng trên sẽ tạo một trường hợp ẩn danh của lớp Test0 và gán giá trị của Hello cho biến tên. Nhưng vì bạn không đề cập đến cá thể vô danh được tạo ra, nó sẽ biến mất khỏi ngay sau dòng. Vì vậy, bạn vẫn chưa gán một giá trị cho biến tên của cá thể gọi là đoạn mã cụ thể. Do đó tên là null

Trong bộ nhớ nó giống như

enter image description here

6

gì bạn đang cố gắng làm là thực hiện bằng cách mã bạn nhận xét ra:

public Test0() 
{ 
    this("Hello"); 
} 
+1

Tôi chắc chắn người hỏi đã biết điều đó. –

3

Bởi vì bạn tạo ra một Ví dụ mới của Test0 với tên "hello" nhưng không bao giờ sử dụng nó.

public Test() { 

    new Test0("hello") // nothing is referencing this new object 
} 

Bạn chỉ cần tạo đối tượng bên trong một hàm tạo khác nhưng nó sẽ không ảnh hưởng đến cá thể được tạo bởi lệnh gọi hàm tạo đầu tiên.

3

Bạn có thể thực hiện việc này nhưng kết quả của việc sử dụng new này sẽ biến mất ở cuối trình tạo. Đặc biệt, t.name sẽ là null.

Sử dụng this("Hello").

3

Tên là biến mẫu. Các biến cá thể là đối tượng cụ thể.

Với new Test0 ("Hello"); bạn đang tạo một thể hiện mới của Test0.

Nếu bạn muốn có t.getName() return "Hello" [Ý tôi là lĩnh vực có giá trị không phụ thuộc vào đối tượng], thay đổi lĩnh vực name để tĩnh:

static String name; 
+1

Đó là một lời khuyên xấu - không có lý do gì để thao tác biến tĩnh từ một hàm tạo. (Ngoài ra, điều này có nghĩa là ** tất cả ** trường hợp chia sẻ cùng một giá trị.) –

+1

Tôi xin lỗi..không đưa ra bất kỳ lời khuyên nào. Đây là một chương trình thử nghiệm và cố gắng làm nổi bật Instance, sự khác biệt tĩnh. – Rajesh

0

Bạn có thể hiển thị kết quả bằng cách sử dụng từ khóa mới thông qua dưới code..Since u đã sử dụng public Test0(){new Test("Hello){};" đây {} niềng răng không quan trọng .. do đó khi test0() hàm tạo được gọi là ... Bên trong hàm tạo này test0(args); đang được gọi là bt trong hàm tạo đầu tiên u đã không hiển thị đầu ra..vào đó sẽ là "Hello" của bạn sẽ được hiển thị..chỉ cần chỉnh sửa

`

public test0(String str) 
{ 
this.name=str; 
System.out.println(str); 
}` 

Và bạn sẽ có ur mong muốn output..See mã dưới đây của tôi ..

class test01{ 
public test01(String str) 
{System.out.println(str); 
    } 
public test01(){ 

    new test01("Print"); 
} 
}public class Const { 
public static void main(String args[]) 
{test01 t = new test01(); 

    //System.out.println(t.getName()); 
    }} 

Kết quả của đoạn mã này sẽ cung cấp cho u cần Chuỗi

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