2011-12-19 36 views
6

Xem mã bên dưới và vui lòng giúp tôi giải quyết mẹo.Chương trình Java khó khăn

class TestTrick{ 

    public static void main(String args[]) 
    { 

    } 

    static marker() 
    { 

    System.out.println("programe executed"); 

    } 

} 

Kết quả cần thiết từ chương trình này là chương trình nên in program executed, có nghĩa là phương pháp nên được thực thi. Nhưng có một số quy tắc:

  1. Không có gì phải được viết bằng cả hai phương pháp.
  2. Không có lớp nào khác có thể được thêm vào chương trình.
  3. Chương trình phải thực thi câu lệnh đầu ra trong phương pháp đánh dấu.

Đã ba ngày và tôi không thể giải quyết vấn đề vì tôi không phải là lập trình viên Java. Tôi đã tìm kiếm tất cả mọi thứ trên internet để có được một đầu mối nhưng tôi đã thất bại. Vui lòng ai đó giúp tôi chạy chương trình này bằng cách tuân thủ nghiêm ngặt các quy tắc.

+0

có thể chuyển đổi tên của các hàm: p? hoặc tốt hơn, chỉ cần bình luận kết thúc đầu tiên và đầu của phương pháp thứ hai! – Anthea

+0

Nếu đây là bài tập về nhà, hãy đánh dấu nó là một. – Hurda

+4

Điều này sẽ không biên dịch. – MByD

Trả lời

18

Tôi nghĩ rằng những gì họ đang tìm kiếm là static initializer.

static { 
    marker(); 
} 

Điều này sẽ chạy khi lớp được tải.

4

Vấn đề là bạn không muốn có một phương pháp cho điểm đánh dấu của bạn - bạn chỉ muốn có một khối khởi tạo tĩnh:

class Trick { 
    // not a method, just something to execute when the class is loaded 
    static { System.out.println("executed"); } 

    public static void main(String[] args) { 

    } 

} 

Kết quả: http://ideone.com/bQAgT

Nếu bạn đã được cung cấp mã đã (mà tôi không chắc bạn có vì static marker() không phải là mã hợp lệ) thì bạn có thể chỉ cần gọi marker() từ khối static của mình.

+0

Câu trả lời này không thỏa mãn * 3. chương trình phải thực thi stat đầu ra trong phương thức điểm đánh dấu *. tuy nhiên nó tạo ra cùng một đầu ra – Brad

+0

@Brad toàn bộ ràng buộc thiết lập không rõ ràng lắm. Do mã được cung cấp trong OP không biên dịch, tôi phải đưa ra một số giả định về những gì đã và không thực sự đúng. Tôi tin rằng tôi đã bao gồm hai trường hợp có thể xảy ra nhất trong câu trả lời của tôi. – corsiKa

+0

Đó là một bộ phát sáng nhận xét công bằng và tôi không đánh dấu câu trả lời của bạn. Tôi vừa bình luận về nó. – Brad

1

Điều này thật dễ dàng. Trong lớp, thêm một hàm tạo tĩnh để gọi phương thức đánh dấu và sau đó trong hàm tạo được đặt trong một hệ thống.exit

+1

"Không có gì nên được viết bằng cả hai phương pháp." Ngoài ra, tại sao bạn cần một 'System.exit()'? Chương trình sẽ tự kết thúc. –

-2

Bạn cần gọi phương thức đánh dấu trong phương thức chính có nghĩa là; một cái gì đó như thế này:

class testTrick { 

    public static void main(String args[]) { 
     marker(); 
    } 

    static void marker() { 
     System.out.println("programe executed"); 
    } 

} 
+1

"Không có gì nên được viết bằng cả hai phương pháp." –

2

bạn có thể sử dụng bộ khởi tạo tĩnh, sẽ được thực thi trước khi phương pháp chính có thể chạy.

static { 
    marker(); 
} 
+1

Không phải là "hàm tạo tĩnh", mà là một khối tĩnh. –

+0

Tệ của tôi, tôi đã sửa đổi nó – Hurda

2

Khối static sẽ thực hiện thủ thuật cho bạn. Nhưng bạn có một lỗi cú pháp trong chương trình của bạn. Vì là một phương thức, nó phải có kiểu trả về. Tôi giả sử void.

class testTrick { 

    public static void main(String args[]) { 
    } 

    static void marker() { 
     System.out.println("programe executed"); 
    } 

    static { 
     marker(); 
    } 
} 
0
class testTrick 
{ 

    public static void main(String args[]) 
    { 
    } 

    static 
    { 
     marker(); 
    } 

    static void marker() 
    { 
     System.out.println("programe executed"); 
    } 
} 
1

Một chương trình thậm chí phức tạp hơn là

class testTrick { 
    static { marker(); System.exit(0); } static void marker() { 
     System.out.println("program executed"); 
    } 
} 

Lưu ý: marker có để cung cấp một kiểu trả về ví dụ void hoặc nó sẽ không biên dịch. Bạn có thể giữ phương thức main() nếu bạn thích, nhưng nó không bao giờ được gọi.

Trình khởi tạo tĩnh được gọi trước phương thức chính để nó có thể gọi phương thức khác và nó có thể thoát trước khi bạn thấy thông báo không tìm thấy phương thức main() nào.

0

thực hiện điều này theo quy tắc của bạn?, Tạo ra một khối tĩnh sẽ luôn thực hiện vì nó được lưu trữ cùng với các tập tin lớp và nó doen cần một phương pháp chính để gọi

class TestTrick{ 

    public static void main(String args[]) 
    { 

    } 

    static marker() 
    { 

    System.out.println("programe executed"); 

    } 

} 
+0

oops, có vẻ như đã trả lời một câu hỏi wchich đã có ans giống nhau, cũng có thể là một chút giải thích giúp, mặc dù nó là một câu hỏi cũ –

0
public class M 
{ 
    public static void main(String[] args) 
    { 

    } 
    static 
    { 
     marker(); 
    } 
    public static void marker() 
    { 
     System.out.println("Done"); 
    } 
} 
-1
int i = 10 + + 11 - - 12 + + 13 - - 14 + + 15; 

System.out.println(i); 
0
class TestTrick{ 
public static void main(String args[]) 
{ 

} 

static{ 
    marker();} 
static void marker(){ 

System.out.println("programe executed"); 

} 

Xem xét các yêu cầu. Bạn có thể làm bất cứ điều gì bạn muốn miễn là bạn không thay đổi phương pháp.

Vì vậy, một khối tĩnh (sẽ luôn luôn thực hiện trong một chương trình) là cần thiết. Nó không phải là một phương pháp, và bạn có thể gọi marker() từ đó (mà btw cần phải được gán một kiểu trả về)

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