1

私は Java 101 構文を学習しています。私がやろうとしている演習では、インクリメントされた値を印刷することができません。何か案は?

これが私のコードです:

class StaticTest { 
    static int i = 47;  
}
class incrementable { 
    static void increment() { StaticTest.i++; } 
}

class DataOnly { 

    int i;
    double d;
    boolean b; 

    public static void main (String[] args) { 
        incrementable t = new incrementable(); 
        DataOnly df = new DataOnly(); 
        df.i = t.increment(); 
        System.out.println(df.i);
    } 

}

私が得るエラーは次のとおりです。

aTyp0eName.java:18: incompatible types
found: void 
required: int 
df.i = t.increment(); 

df.iでありint、そうですt.increment。私はそれがだからだincrement()void思いますか?

4

6 に答える 6

4

メソッドの署名は次のとおりです。

static void

つまり、このメソッドからは何も返されません。

したがって、に割り当てようとしてincrement()も機能しdf.iません。

于 2009-04-21T19:29:35.547 に答える
4

increment()戻り値はありません。intコードが機能するには、次のように返す必要があります。

class incrementable { 
    static int increment() { 
        StaticTest.i++;
        return StaticTest.i;
    } 
}

" void" は、値を返さないメソッド用に予約されているキーワードです。それ以外の場合は、返すクラスまたはプリミティブ ( intdoubleString、何でも) を指定します。戻り値の詳細については、こちらをご覧ください。

また、今後の参考のために、クラス名は大文字にする必要があるため、「incrementable」ではなく「Incrementable」を使用する必要があります。(私のサンプルコードでは、あなたが持っていたものと同じにしておいたので、今のところコードをドロップすることができます.)

于 2009-04-21T19:26:19.187 に答える
2

私が得るエラーは次のとおりです。

aTyp0eName.java:18: incompatible types
found: void 
required: int 
df.i = t.increment();

df.i は int であり、t.increment も同様です [fault?]。increment() が無効だからだと思いますか?

ええええ、あなたの推測は正しいです。

これは、行ごとに説明されたエラー メッセージです。

aTyp0eName.java:18: incompatible types

18行目のintに「void」を代入しようとしています。

df.i = t.increment();  

ここがエラーの場所です。

found: void

メソッド「署名」で戻り値の型を宣言します。メソッドのシグネチャは次のとおりです。

<アクセス修飾子> <戻り値の型> <メソッド名> (<パラメータ> )
静的ボイド増分 ()

したがって、戻り値の型は void です。

次の行:

required: int 

df.i は、以前に述べたように int です。

したがって、ほとんどの場合、すでに自分の質問に答えています。

コンパイラを持つことの良い点は、何かが間違っているときに教えてくれることです。

(人間にとって)悪いことは、それらのメッセージを読むことを学ばなければならないことです。それらはプログラミング言語ごとに異なり、さらにはコンパイラごとに異なります。

これは修正版になります。

class StaticTest { 
    static int i = 47;  
}
class Incrementable { 
    static int increment() { 
        return ++StaticTest.i;
    } 

}

class DataOnly { 

    int i;
    double d;
    boolean b; 

    public static void main (String[] args) { 
        Incrementable t = new Incrementable(); 
        DataOnly df = new DataOnly(); 
        df.i = t.increment(); 
        System.out.println(df.i);
    } 

}

メソッドや属性にアクセス修飾子を追加するなど、他にもいくつかの機能強化を行うことができますが、現時点ではこれが役立つと思います。

于 2009-04-21T20:17:37.410 に答える
2

答えは、increment() メソッドが void を返すことです。そうは言っても、プログラマーが一般的に使用する Java 標準構文には多くの違反があります。

  1. クラス名は大文字で始める必要があります。
  2. フィールドは異なるクラスから変更されるべきではなく、ヘルパー メソッドは同じクラス内にある必要があります
  3. 静的メソッドを呼び出したい場合は、インスタンス変数を参照せず、ClassName.reference を使用してください
  4. 変数がローカルでのみ必要な場合は、フィールドであってはなりません (df.i は、メイン メソッド内で宣言された int i である可能性があります)。

編集:同じクラス内のヘルパー メソッドの例:

class StaticTest { 
    private static int i = 47; //keep i private and mutate and access via methods
    public static void increment() { i++; }
    public static int getI() { return i; }
} 
于 2009-04-21T19:41:17.327 に答える
0

また、インクリメント可能をインスタンス化する場合、increment() メソッドを static として定義しないでください。またはできますが、する必要はありません。

静的な場合は、単に incrementable.increment() にすることができます。

ただのヒント。あなたの質問への答えについては、ツールキットはすでにそう言っています。

于 2009-04-21T19:33:11.807 に答える
0

また、incrementableクラスは実際にはIncrementable.

于 2009-04-21T19:36:04.470 に答える