1

スタックオーバーフローのメンバーの皆さん、Java クラスのインスタンス変数を 2 行ではなく 1 行で宣言する必要がある理由をご存知ですか? 例えば:

String ring;
ring = "indeed"; 

コンパイルエラーが発生します。なぜ許可されないのですか?この例のように行うのは無意味ですが、その手順を使用して、サブクラスのコンストラクターを使用せずにスーパークラスから継承された変数を初期化すると便利な場合があります。

例えば:

class Ringo{
String ring;
}
class RingoStar extends Ringo{
ring = "That's how to play drums";
}

明らかに、コンパイルエラーが発生します。それがポイントです、なぜそれが許可されていないのか誰か知っていますか?

4

4 に答える 4

1

わずかに異なる構文で、必要なものを得ることができます。検討:

class Ringo{
 String ring;

 { 
  ring = "indeed";
 }
}

あなたの質問に対する答えは、Java 構文ではクラス本体内にステートメントを含めることができないということだと思います。上記のように初期化ブロックを使用する必要があります ( http://docs.oracle.com/javase/tutorial/java/javaOO/initial.htmlを参照)。

于 2013-02-06T10:57:49.223 に答える
0

Java ファイルには、2 つの完全に別個の側面があります。

  • コンパイル時に実行される宣言。
  • 実行時に実行される実行コード。

のような一行

private int x = 1;

実行コード (「インスタンス変数を作成する」) がすべてのように見えるかもしれませんが、実際には両方の側面があり、実際にはそれらが効果を発揮する時間に関して大きく分けられています。Java では、たとえば Ruby のように、実行時に変数が作成されることはありません。

それを心に留めておくと、前者の線は本質的に非常に異なるという正しい直感を養うことができます。

x = 1;

クラス体の真ん中。

于 2013-02-06T11:48:06.890 に答える
0

割り当てを中括弧で囲むと、技術的に可能です。

String ring;
{
    ring = "indeed";
}

割り当ては、コンストラクターの前に実行されます。

于 2013-02-06T10:58:45.193 に答える
0

宣言と初期化には違いがあります。宣言は、割り当てとアドレス指定です。初期化とは、メモリを情報で満たすことです。異なる構文とルールで表現する必要があります。

言語は美学にも配慮する必要があります。Javaが書かれたとき、これは美学への要求だったと思います。Pascal のアーキテクトが .NET C# を書き直したとき、彼らは別の方法でそれを行ったと思います。Java と Pascal の両方から学んだ。

于 2013-02-06T11:08:21.183 に答える