2013-08-29 18 views
10

在採訪中我問了這個問題:沒有使用static和main我們怎麼能在控制檯上打印消息?可能嗎?是否有可能在主控臺上打印消息而無需在java中使用主和靜態塊?

+6

的可能重複的[上控制檯打印信息,而無需使用main()方法(http://stackoverflow.com/questions/8605137/printing-message-on-console-without-using-main-method) –

+0

@Raza但是,如果不在主或靜態塊中,sysout調用會去哪裏? – vikingsteve

+1

試試這個鏈接:[在沒有主要方法/靜態塊的java中打印消息](http://stackoverflow.com/questions/18171465/can-we-print-a-java-message-on-console-without-using-主方法靜態-variabl)。提到的解決方案仍然使用main()函數來調用**「初始化塊」**。 – r3ap3r

回答

25

你可以自定義一個類加載器,打印您的留言:

public class MyClassLoader extends ClassLoader { 
    public MyClassLoader(ClassLoader other) { 
     super(other); 
     System.out.println("Hi there"); 
     System.exit(0); 
    } 
} 

然後運行java命令:

java -Djava.system.class.loader=MyClassLoader

(不需要添加類作爲參數)

+0

@Chafousin它的工作!你能解釋我什麼代表java -Djava.system.class.loader – shree18

+2

'-Djava.system.class.loader'用於定義JVM類加載器,即負責加載的對象類。在這裏,我們提供了我們自己的類加載器,我們「破解」它以顯示一些文本,然後退出。 –

0

Java是一種OOP語言。

如果不創建類並添加靜態主函數,則無法創建程序。

然後,您可以撥打System.out.println打印一行。

所以,答案是否定的。

+0

嘿,如果你不喜歡Java,我會得到它,但不需要訴諸名稱。 – MikeTheLiar

0

你總是需要把syso中的代碼塊,也許是:

public class example { public void message(){ System.out.println("Hello"); } }

這裏的方法

+0

但是,這個非靜態代碼是如何執行的? – vikingsteve

+0

@Savins您提供的解決方案需要一個main()方法來調用函數**「message」** – r3ap3r

+0

@ r3ap3r我不確定,但我不一定介意需要飛機,例如,如果您使用的消息在depuras中顯示對象的值,在測試中不顯示主要方法。誠然,這是一個非常具體的案例。 – Savins

0
public class Test { 
    public static PrintStream ps = System.out.printf("%s", "hello"); 
} 

面試很奇怪的問題,也不是一成不變的。它會打印你好,並拋出Exception in thread "main" java.lang.NoSuchMethodException

+0

不在/在Java7之後!!!我試過你的代碼,我得到**錯誤:在類Test中找不到主要方法,請定義主要方法爲: public static void main(String [] args)** –

+0

那麼,在6 java的它的作品。沒錯,沒有主要方法的話,7號代碼是不會執行的。但它仍然有靜態變量。我不知道它是否可以接受。 – Mikhail

+0

正如我所說的,它是一種在Java 7中修復的bug。它可以在7之前的所有JDK上運行,因爲在加載類後查找main()方法。 –

2
I have asked this question:Without using static and main how could we print 
message on console?Is it possible? 

答案是否定的!

除非調用main()方法,否則不能執行任何操作。在查找main()方法之前加載Java 7類之前。所以你可以通過靜態塊打印你的數據(當類被加載時執行靜態塊),但是從java 7開始,即使這是不可能的。所以你必須首先執行main()方法。

即使在像Spring bean這樣的框架中,通常只有在引用上下文時纔會初始化它(同樣需要首先執行main())。因此,如果不調用main()方法或通過靜態函數/塊。

+0

@ Aniket Thakur你是對的。但我的問題是主要和靜態塊。所以下面的代碼適合我。 private static int i = m1(); public static int m1(){ System.out.println(「Test ... !!!!」); System.exit(0); return 0; } – shree18

+0

@ shree18如前所述,您的代碼只能在Java 7之前工作,因爲類在main()方法查找之前加載。至於考慮到你的問題(考慮到面試的角度),如果你用你的代碼回答yes,那隻會表明你不知道最近的java變化。我不能說最近:P(Java 7已經有一段時間了),但我希望你明白我的觀點。 –

0

答案肯定是No.

至少你需要一個靜態塊,或者你需要一個空的main()。

參見下面的實施例:

1.

public class ABC { 
    static{ 
      System.out.println("hai"); 
      } 
    public static void main(String[] args) {} 
} 

OUTPUT:

2。

public final class ABC { 
    static{ 
      System.out.println("hai"); 
      } 
} 

它會在運行時打印'hai',但之後也會出現一個異常。

OUTPUT:

java.lang.NoSuchMethodError:主

異常在線程 「主」

+0

你絕對錯了;-) – schlingel

+0

爲什麼?上面的代碼有效。 –

+0

因爲你說沒有主要或靜態阻止是沒有辦法的,但是有。看到這個問題的答案。 – schlingel

0

可能與靜塊,其前主方法

0

執行@ Aniket Thakur 因爲我不能評論,因爲我的觀點。但是下面的程序在進入main之前打印消息。 注意:我使用Java 7和Java 8.兩者都正常工作,並在main之前運行靜態塊。

public class PrintBeforeMain { 

    private static int i = m1(); 

    public static int m1(){ 
     System.out.println("m1(): Before main() through static method..."); 
     return 0; 
    } 

    static{ 
     System.out.println("Inside standalone static{} block"); 
    } 

    public static void main(String[] args) { 
     System.out.println("Inside main()"); 
    } 
} 
相關問題