Javaプログラムの実行はどこから始まりますか? メインメソッドからだと人々が言うのを聞いた。実行は静的ブロックから始まると思います。私は正しいですか??
6 に答える
このプログラムの出力:
public class XXX {
static YYY dependend = new YYY();
static {
System.out.println("3");
}
public static void main(String[] args) {
System.out.println("4");
}
}
class YYY {
static {
System.out.println("1");
}
YYY(){
System.out.println("2");
}
}
もちろんです
1
2
3
4
つまり、プログラムのエントリ ポイントmain
は です。しかし、その前に実行されるコードがあります。そして、この「メインの前に実行される」コードが同じクラスにある必要はありません。また、このコードが静的初期化子 (「2」を参照) にある必要もありません。
main メソッドは、プログラムへのエントリ ポイントです。「メイン」メソッドを含むクラスに、初期化が必要な静的メンバーまたは静的コード ブロックがある場合、これは「メイン」メソッドの前に実行されます。
このサンプル コードを見てください。
public class Test {
private static Object obj = new Object();
public static void main(String[] args) {
System.out.println("test");
}
}
オブジェクトの初期化行にブレークポイントを設定すると、println 行の前にブレークポイントが実行されることがわかります。
Java アプリケーションは通常、main メソッドによって初期化されます。
public static void main(String... args){
System.out.println("Executing my application...");
}
JVM がクラスをロードすると、静的ブロックが実行されます。main メソッドなしでアプリケーションを起動することはできません。そうしないと、JVM にエラー メッセージが表示されます。静的ブロック(例)
を使用してコードを実行することは、理論的には可能です。しかし、GUI を作成したくない他のスクリプト (または初期化メソッドで行うこと) によってメソッドが呼び出される可能性があるため、アプリケーションを初期化するのは悪い方法です。例えば:doSomethingElse
class Test2 extends Object{
public static void doSomething(){
System.out.println("Calling Test's doSomethingElse method.");
Test.doSomethingElse();
}
}
Test2 の doSomething メソッドは呼び出すだけですが、クラスが JVM によってロードさdoSomethingElse
れるため、GUI を作成するメソッドも呼び出されます。Test
JVM がクラスをロードし、クラスが静的ブロックを取得すると、静的ブロックが最初に呼び出されます。Test の静的ブロックがexecutingClass
メソッドを呼び出すようになり、GUI が作成されます (ただし、Test2 はdoSomethingElse
.
最後に、静的ブロックを使用してアプリケーションを初期化しないでください。
- 静的ブロックは、そのクラスに必要なものを作成するためにのみ使用する必要があります。
main
方法も必要です。- 予期せぬ影響を与える可能性があります。
これは、Java プログラムの開始メソッドです。
public static void main(String[] args){
...
}
静的ブロックは、クラスが初期化されるときに実行されます。メソッドを含むクラスmain
の場合、メソッドを使用する前にクラスを初期化する必要があるため、このメソッドを呼び出す前になります。他のクラスの場合、クラスを初期化する必要がない場合は、後で行うか、まったく行わないことができます。
クラスに static ブロックと main メソッド () が含まれている場合、() jvm Wil Executive は最初に static ブロックが実行され、次に main メソッドが実行されます。ただし、クラス内の静的ブロックについて言及せず、クラスにメイン メソッドのみが含まれている場合、jvm はメイン メソッドのみから実行を開始します。