2016-10-01 7 views
-3

前に、私のコードはでした:6.正確な動作

私の質問にはDogクラスはありませんが、変数Dog.iはどこから来たのですか?なぜですか?

+1

'System.out.println'行から' Dog.'を削除すると、コードはもうコンパイルされません。 –

+0

保存を忘れてしまったようです。 –

+2

段落全体に無作為に適用するのではなく、実際の強調には* italics *と** boldface **を使用してください。 –

答えて

-1

System.out.println行からDog.を削除すると、コードはコンパイルされなくなります。私はあなたのCatクラスからextends Dogをオフに残してきたと仮定するつもりです:、iが解決した理由は、CatDogであるということですので、場合

class Dog 
{ 
    public static int i=6; 
} 

public class Cat extends Dog // <===== Note 
{ 
    public static void main(String[] arg) 
    { 
    System.out.println(Dog.i); 
    } 
} 

、およびコード内DogクラスかCatpublicまたはprotectedメンバー)のようなサブクラス、Dogで定義された静的識別子が範囲内にあります。あなたはそれらを修飾する必要はありません(ただし、そうすることで明快さを助けることができます)。

+0

私はこれが答えであるかわかりません、おそらく "著者が何を意味するか"ということです。 –

+0

@JacekCz:それはOPが表現する症状に合っているので、私はかなり確信しています。それが間違っているとわかったら削除します。 –

+0

はい、あなたのプログラムは専門的に正しいですか(おそらく自然でない継承)、私は "教訓的な"レベルでしかないと疑います。 –

0

あなたはDog.classファイルを削除しませんでした。それ以外の場合、コンパイルは不可能でした。

+0

私はOPがちょうど 'javac'をrerantoと思う。 'Cat.class'は' Cat.java'より新しいので、再コンパイルされないかもしれません。 –

+1

@PeterLawrey私は投機にあまり興味がありませんが、javacは、コード "*"からクラス "Dog"を削除したときに、特にコマンドラインを開く名前のファイル – EJP

0

javacコンパイラが行う最適化のうちの1つは、定数インライン展開です。これは、コンパイル時に知られているプリミティブ定数をすべて挿入できることを意味します。これはあなたのコードは、あなたがDog.*を削除し、あなたはそれが正しく実行されますCatを再コンパイルしていない提供することができ

public class Cat 
{ 
    public static void main(String[] arg) 
    { 
    System.out.println(6 /*Dog.i*/); 
    } 
} 

と同じであることを意味します。注:javacを再度実行しても、すべてが再コンパイルされるわけではありません。javac.classファイルが.javaファイルではないかどうかをチェックします。

また、Dog.javaを削除すると、Dog.classが削除されず、このクラスを後で再コンパイルするだけで済みます。

+0

が記述*に適合しないファイルを再コンパイルします。もう一度コンパイルしていないことに気付かずに(EJPの回答に対するあなたのコメント)、 'extended dog 'は持っていますが、そうではありません。 –

+0

@TJCrowder私は 'extends Dog'がどのように相違するのか分かりません。定数にはクラス名に' Dog.i'が含まれています。OPがクラス "Dog"を削除したと言うと、 'Dog.java'も' Cat.class'が再コンパイルされたかどうかも確認されませんでした。 –

+1

"犬を取り除いた"とは、残りの質問の文脈と '私がどこから来たのか疑問に思う方法を考えると、' System.out.println'行を意味していると思いました。しかし根本的に、この質問はあなたの時間、鉱山、またはEJPの価値が明らかにされるまで/それほど価値がない。 :-) –

関連する問題