3

私は今 Java を学ぼうとしています。これは hello world プログラムで、すでに私を困惑させ始めています。私は Python に慣れており、このチュートリアル (電子ブック) は、Python のバックグラウンドを持つプログラマーにとってシンプルで簡潔であることがわかりました。

本からのJavaのHello worldプログラム:

public class Hello {

public static void main (String[] args) {

     System.out.println("Hello World!");
}
}

本が言うように、Python でこれに相当するコードは次のとおりです。

class Hello(object):
  @staticmethod
  def main(args):
     print "Hello World!"

Pythonコードを完全に理解しています。しかし、私は Java コードに問題があり、さらに先に進む前に明確にして、脳内の言語の根本的な知識を得たいと思っています。

この本には次のように書かれています(本からのコピーによる):

...1 つのパラメーターがあります。ただし、パラメーターの名前は args です。Java ではすべてのものが型を持つ必要があるため、args の値が文字列の配列であることをコンパイラーに伝える必要もあります。とりあえず、配列は Python のリストと同じものと考えることができます。メソッド main が 1 つのパラメーターを受け入れる必要があり、そのパラメーターが文字列の配列でなければならないことを宣言することの実際的な利点は、コード内の別の場所で main を呼び出し、それに整数の配列または単一の文字列を渡すと、コンパイラがエラーとしてフラグが立てられます。

これは私には意味がありません。私の関数は何も必要としないのに、なぜ何も渡せないのですか? (String args) だけを渡すとどうなりますか。

私はJavaの初心者なので、ご容赦ください。

4

8 に答える 8

6

さて、あなたは何かを渡しています。Java プログラムを実行するときはいつでも、コマンド ライン引数が引数として渡されるargsため、それらを使用しない場合でも、それらを受け入れる必要があります。

于 2012-04-18T18:05:33.827 に答える
4

さて、ここで起こっていることは 2 つあります。まず、関数シグネチャですmain。文字列の配列のみを期待して受け入れるように宣言しているため、他のものを渡そうとするとエラーが発生します。しかし、関数がそれを受け入れることを拒否したからではなく、コンパイラが何を呼び出そうとしているのかわからないからです。ほら、同じ名前で引数が異なる複数の関数を持つことができます。したがって、 を呼び出そうとするとmain(1)、コンパイラは 1 つ (または複数) の整数を受け入れる関数 main を探しますが、見つからず、例外を発生させます。

ここで行われているもう 1 つのことは、プログラムを開始すると、コンパイラはこの特定の署名を探しますが、public static void main (String[] args)それ以外は何も探しません。見つからない?プログラムは実行されません。

于 2012-04-18T18:07:13.610 に答える
2

ご存知のように、Python は「ダック タイピング」を使用します。何かの型が何であるかは問題ではなく、何ができるかだけです。その結果、変数の型を宣言する必要はありません。

Java ではそうではありません。すべての変数には宣言された型があり、コンパイラはその型を強制します。たとえば、宣言された変数にString参照を格納しようとすると、コンパイル時エラーが発生します。intダックタイピングの支持者は、これにより柔軟性が低下すると主張しますが、強力なタイピング愛好家は、実行時のバグよりもコンパイル時のエラーの方が修正しやすいと指摘しています。

しかし、同じことがメソッドの引数にも当てはまります。メソッドには type の引数が必要なので、 type の引数を指定するString[]必要がありますString[]。他に何もしません。

幸いなことに、これはmainメソッドであるため、Java インタープリターが引数の受け渡しを処理します。具体的には、プログラムの実行に使用されたコマンドライン引数の配列です。無視したい場合はご遠慮ください。あなたのプログラムは引数に注意を払わなくても問題なく動作しますが、引数が渡されなければ無効です。

(ちなみに、これがメソッド以外のmainメソッドである場合は、引数がまったくなくても、好きな引数の型で自由に宣言できます。しかし、Java インタープリターは、コマンドライン引数の場合、この特定のメソッドはそれらを受け入れる準備ができている必要があります。)

于 2012-04-18T18:08:55.650 に答える
2

Java には、Python のようなトップレベル コードはありません (つまり、単に

print('Hello world')

)。それにもかかわらず、Java プログラムは、コードの実行を開始できるように、ある種のエントリー・ポイントを必要とします。他の多くの言語 (つまり、C/C++、C#、Haskell) と同様に、名前を持つ関数がmainこの目的のために機能し、ランタイム (つまり Java インタープリター) によって呼び出されます。

関数を呼び出すときmain、ランタイムは特定の数 (および型) の引数を使用します。関数はこれらに一致する必要があります。その後、好きな署名で他のメソッドを自由に呼び出すことができます。

public class Hello {
  public static void hi() {
    System.out.println("Hello World!");
  }
  public static void main (String[] args) {
    hi();
  }
}
于 2012-04-18T18:10:02.673 に答える
2

すべてのプログラムには、実行が開始されるエントリ ポイント/開始点があります。Java は、「メイン」メソッドであるアプリケーションを実行するクラスで開始する特定のメソッド シグネチャを検索します。

public static void main(String args[]);

これは、プログラムを開始するために実装する必要があります (開始したいクラスで)。このルール/制限により、文字列の配列 (Python の文字列のリストに似ています) を引数として渡す必要があります。

次に、プログラムが起動時にパラメーターを必要としない場合は、何も渡さないでください。main メソッドで args を空の String 配列として取得します。次の行は、メイン メソッドに渡された引数の長さを出力します。

System.out.println("Length of arguments = " + args.length);

また、初心者向けの Sun の Java ガイドも参照してください。これがあなたの質問に答えることを願っています。

于 2012-04-18T18:28:02.633 に答える
1

関数が何も必要としない (つまりパラメーターがない) 場合は、何も渡さないようにすることができます。これは、次のように宣言することによって行われます。

void noArgumentsFunction() {
  // body
}

しかし、mainボイラープレートである関数は、Strings の配列を受け入れなければなりません。そのため、署名を受け入れるために署名を宣言する必要があります (場合によっては無視します)。関数はこのパラメーターを受け入れる必要があります。これはプログラムのエントリ ポイントであり、Java プログラムはコマンド ラインで渡されるパラメーターの配列をサポートする必要があるためです (強制されていない場合は、すべての C/C++ プログラムとまったく同じです)。

于 2012-04-18T18:06:34.503 に答える
1

まず第一に、プログラムを開始するために JVM によって main メソッドが呼び出され、コマンド ライン引数が渡されることに注意してください。Java コードから呼び出すことができますが、これが行われることはほとんどありません。

とにかく、これはメソッドの署名です:

public static void main (String[] args)

文字列の配列であるパラメーターが必要であると言われています。次のように呼び出す場合:

main(new String[1]); 

またはこれ:

main(methodThatReturnsAStringArray()); 

それが動作します。しかし、これらはコンパイラエラーを引き起こします:

main(new int[0]); 
main("test"); 

呼び出しのパラメーターの型が、メソッド シグネチャで必要な型と一致しないためです。null ポインターを渡すことができます。

main(null); 

配列は参照型であり、nullすべての参照型に対して有効な値であるためです。ただし、メソッドはその場合をテストする必要があります。そうしないとNullPointerException、配列にアクセスしようとしたときに a がスローされます。

他にできることは、別のメソッドを宣言することによるオーバーロードです。

public static void main (String args)

だからあなたが電話するとき

main("test");

コンパイラは、署名が一致するメソッドがあると判断し、それを呼び出します。

基本的に、これらすべてのポイントは、多くのプログラマー エラーが実行時ではなくコンパイラーによってキャッチされることです (ほとんど実行されないコード パスのような特別な状況でのみ発見される可能性があります)。

于 2012-04-18T18:16:11.507 に答える
0

コマンド ラインからプログラムを実行する場合、コマンドライン パラメータは複数の文字列にすることができます。

例えば。

Java myprogramme param1 param2 param3

このすべてのパラメータ - param1、param2、param3 は string[] として渡されます。

これは、ゼロ、1 つ、または複数のパラメーターを渡すすべてのプログラムに共通です。

プログラマとして、これらのコマンド ライン パラメータをチェックする責任があります。

于 2012-04-18T18:08:10.457 に答える