2013-03-22 29 views
7

Hãy nói rằng tôi có một số mã: "otherMethod hoàn tất"Làm thế nào để Java biết khi nào một phương thức void đã hoàn thành phần thân phương thức của nó?

public int doSomething(int x) 
{ 
    otherMethod(x); 
    System.out.println("otherMethod is complete."); 
    return 0; 
} 

public void otherMethod(int y) 
{ 
    //method body 
} 

Kể từ kiểu trả otherMethod là vô hiệu, làm thế nào để phương pháp doSomething biết khi otherMethod đã hoàn thành, vì vậy nó có thể đi đến in như và tiếp theo ?

EDIT: Đã thêm return 0; vào phương pháp doSomething để mã ví dụ sẽ biên dịch.

+1

Do mã trong phương thức đang được chạy trong cùng một chuỗi với mã gọi và do đó, chuỗi này sẽ chặn chuỗi cho đến khi hoàn tất. –

+0

Nó biết bởi vì phương thức trả về. –

+1

(Java là một ngôn ngữ bắt buộc chạy trên một máy ảo bắt buộc. Điều này có nghĩa là các hoạt động hoàn thành (hoặc xuất hiện) theo thứ tự mà chúng được chỉ định.) –

Trả lời

14

Các phân tích cú pháp biết nơi cuối thực hiện là gì và thậm chí thêm một sự trở lại, ví dụ:

public static void main(String args[]) { 

} 

biên dịch để:

public static main([Ljava/lang/String;)V 
    L0 
    LINENUMBER 34 L0 
    RETURN <------ SEE? 
    L1 
    LOCALVARIABLE args [Ljava/lang/String; L0 L1 0 
    MAXSTACK = 0 
    MAXLOCALS = 1 
} 

Và cùng áp dụng cho mã của bạn (mặc dù tôi đã được thêm vào trong trả về 0 vì mã của bạn không biên dịch):

public int doSomething(int x) 
    { 
     otherMethod(x); 
     System.out.println("otherMethod is complete."); 
     return 0; 
    } 

    public void otherMethod(int y) 
    { 
     //method body 
    } 

mã được biên dịch:

public doSomething(I)I 
    L0 
    LINENUMBER 38 L0 
    ALOAD 0 
    ILOAD 1 
    INVOKEVIRTUAL TestRunner.otherMethod (I)V 
    L1 
    LINENUMBER 39 L1 
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream; 
    LDC "otherMethod is complete." 
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V 
    L2 
    LINENUMBER 40 L2 
    ICONST_0 
    IRETURN 
    L3 
    LOCALVARIABLE this LTestRunner; L0 L3 0 
    LOCALVARIABLE x I L0 L3 1 
    MAXSTACK = 2 
    MAXLOCALS = 2 

    // access flags 0x1 
    public otherMethod(I)V 
    L0 
    LINENUMBER 46 L0 
    RETURN <-- return inserted! 
    L1 
    LOCALVARIABLE this LTestRunner; L0 L1 0 
    LOCALVARIABLE y I L0 L1 1 
    MAXSTACK = 0 
    MAXLOCALS = 2 
} 
+0

Vì vậy, nếu trình phân tích cú pháp không tìm thấy câu lệnh 'return' trong phương thức void, nó tự động thêm một vào cuối thân phương thức? – reesjones

+0

@CSStudent Tôi không có chuyên gia về trình biên dịch hoặc đặc tả JVM hoặc bất cứ điều gì như thế, nhưng nó sẽ xuất hiện như vậy. – LuxuryMode

1

Vì khung kết thúc. Khi chuỗi được kết thúc của phương thức, nó sẽ trở lại. Ngoài ra, lập trình viên có thể chỉ định khi nào phương thức void được hoàn thành bằng cách viết return;

Chỉnh sửa: Tôi nhận được câu hỏi hỗn hợp. The Thread thực hiện một phương thức tại một thời điểm, một câu lệnh tại một thời điểm, do đó khi thread kết thúc một phương thức, nó sẽ đi đến dòng tiếp theo trong phương thức gọi.