2013-04-07 38 views
33

Tôi chạy vào khối mã này, và có một dòng này tôi không bỏ hiểu ý nghĩa hoặc những gì nó đang làm.Phương thức "this()" này có nghĩa là gì?

public Digraph(In in) { 
    this(in.readInt()); 
    int E = in.readInt(); 
    for (int i = 0; i < E; i++) { 
     int v = in.readInt(); 
     int w = in.readInt(); 
     addEdge(v, w); 
    } 
} 

tôi hiểu những gì hoặc this.variable là, nhưng là những gì this()?

+0

@Avi Tôi chỉ nghĩ này nghe có vẻ quen thuộc. –

Trả lời

48

Đây là nhà xây dựng quá tải:

public class Diagraph { 

    public Diagraph(int n) { 
     // Constructor code 
    } 


    public Digraph(In in) { 
     this(in.readInt()); // Calls the constructor above. 
     int E = in.readInt(); 
     for (int i = 0; i < E; i++) { 
     int v = in.readInt(); 
     int w = in.readInt(); 
     addEdge(v, w); 
     } 
    } 
} 

Bạn có thể nói mã này là một nhà xây dựng và không phải là một phương pháp do thiếu một kiểu trả về. Điều này khá giống với việc gọi super() trong dòng đầu tiên của hàm khởi tạo để khởi tạo lớp mở rộng. Bạn nên gọi this() (hoặc bất kỳ quá tải nào khác của this()) trong dòng đầu tiên của hàm tạo và do đó tránh trùng lặp mã của hàm tạo.

Bạn cũng có thể có một cái nhìn vào bài đăng này: Constructor overloading in Java - best practice

+0

Cảm ơn một tấn ... Thông tin tốt đẹp thực sự – Gattsu

10

Sử dụng hàm này() làm hàm như vậy, về cơ bản gọi cho Trình xây dựng của lớp. Điều này cho phép bạn tất cả các khởi tạo chung trong một hàm tạo và có các chuyên môn hóa trong các hàm khác. Vì vậy, trong đoạn mã ví dụ, cuộc gọi đến this(in.readInt()) đang gọi hàm tạo Digraph có một đối số int.

3

Một hàm tạo khác của lớp Digraph với tham số int.

Digraph(int param) { /* */ } 
8

Đoạn mã này là hàm tạo.

Cuộc gọi này để this gọi một constructor của cùng một lớp

public App(int input) { 
} 

public App(String input) { 
    this(Integer.parseInt(input)); 
} 

Trong ví dụ trên chúng ta có một nhà xây dựng mà phải mất một một int và mà phải mất một String. Hàm khởi tạo lấy String chuyển đổi String thành int và sau đó ủy quyền cho hàm tạo int.

Lưu ý rằng cuộc gọi đến một hàm tạo khác hoặc một hàm tạo siêu lớp (super()) phải là dòng đầu tiên trong một hàm tạo.

Có thể xem this để có giải thích chi tiết hơn về quá tải hàm tạo.

3

Calling this cơ bản gọi là lớp Constructor. Ví dụ, nếu bạn đang mở rộng điều gì đó, hơn cùng với add(JComponent), bạn có thể làm: this.add(JComponent).

2

Constructor quá tải:

ví dụ:

public class Test{ 

    Test(){ 
     this(10); // calling constructor with one parameter 
     System.out.println("This is Default Constructor"); 
    } 

    Test(int number1){ 
     this(10,20); // calling constructor with two parameter 
     System.out.println("This is Parametrized Constructor with one argument "+number1); 
    } 

    Test(int number1,int number2){ 
     System.out.println("This is Parametrized Constructor with two argument"+number1+" , "+number2); 
    } 


    public static void main(String args[]){ 
     Test t = new Test(); 
     // first default constructor,then constructor with 1 parameter , then constructor with 2 parameters will be called 
    } 

} 
2

this(); là nhà xây dựng được sử dụng để gọi khác hàm tạo trong một lớp, ví dụ: : -

class A{ 
    public A(int,int) 
    { this(1.3,2.7);-->this will call default constructor 
    //code 
    } 
public A() 
    { 
    //code 
    } 
public A(float,float) 
    { this();-->this will call default type constructor 
    //code 
    } 
} 

Lưu ý: tôi không sử dụng this() hàm tạo trong hàm tạo mặc định vì nó sẽ dẫn đến trạng thái bế tắc.

Hy vọng điều này sẽ giúp bạn :)

4

Đó là gần như nhau

public class Test { 
    public Test(int i) { /*construct*/ } 

    public Test(int i, String s){ this(i); /*construct*/ } 

} 
+0

Nhận xét của bạn đang làm rối dấu ngoặc đóng của bạn –

+0

@Alex Đó là vì tôi đã sao chép chúng từ OP để làm rõ. – Antimony

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