5

クラスファイルとテスターファイルを作成しました。コンストラクターを使用してオブジェクトを作成しようとすると、コンパイルされませんでした。

「PassTheClassTester.java:5: エラー: クラス PassTheClass のコンストラクター PassTheClass は、指定された型には適用できません。」

助けてください。これが私のコードです:

    public class PassTheClass
{  
    private String myName = " ";
    private int myGrade;
    private String myEmotion = " ";


    public PassTheClass (String xMyName, String xMyEmotion)
    {myName = xMyName;
    myGrade = 0;
    myEmotion = xMyEmotion;}


    public String getMyName()
    {return myName;}

    public int getMyGrade()
    {return myGrade;}

    public String getMyEmotion()
    {return myEmotion;}


    public void setMyName (String yMyName)
    {myName = yMyName;}

    public void setMyGrade (int yMyGrade)
    {myGrade = yMyGrade;}

    public void setMyEmotion (String yMyEmotion)
    {myEmotion = yMyEmotion;}

}



    public class PassTheClassTester
{  
   public static void main(String[] args)
   {  
      PassTheClass demo = new PassTheClass("Squidward",94,"proud");

        System.out.println(student.getMyName());

   }
}
4

3 に答える 3

9

あなたのコンストラクタは を受け入れますString, Stringが、あなたは を渡していますString, int, String

コンストラクターにパラメーターを追加するか、呼び出しから をint削除してください。int

私の提案は、int パラメータを追加することです。つまり、コンストラクタを次のように変更します。

public PassTheClass (String xMyName, int xMyGrade, String xMyEmotion) {
    myName = xMyName;
    myGrade = xMyGrade;
    myEmotion = xMyEmotion;
}

それでもコンストラクターが必要な場合はString, String、3 引数のコンストラクターを呼び出すように変更し、現在コーディングしている初期値を渡します。

 public PassTheClass (String xMyName, String xMyEmotion) {
     this(xMyName, 0, xMyEmotion);
 }

フィールド名と区別するためにパラメータの前に「x」を付けることは「間違っている」わけではありませんが、私はそのようなことが行われたのを見たことがありません。Java での規則は、フィールド名と同じ名前をパラメーターに使用this.し、次のように割り当てるときに使用することです。

public PassTheClass (String myName, int myGrade, String myEmotion) {
    this.myName = myName;
    this.myGrade = myGrade;
    this.myEmotion = myEmotion;
}

さらに「スタイル」を改善するために、フィールド名の前に「my」を付けないでください。すべてのフィールドは暗黙のうちに「私の」ものです。それらにわかりやすい名前を付けnamegradeくださいemotion


良いコードは明快さがすべてです: 接頭辞はコードを混乱させ、読みやすさを低下させるだけなので、避けることを好みます。

于 2013-03-10T20:23:14.217 に答える
0

3つの引数を使用してコンストラクターを呼び出していますが、そのように宣言していません。コードを機能させるには、次のようなコンストラクターを追加できます。

public PassTheClass (String myName, int myGrade, String myEmotion)
{
    this.myName = myName;
    this.myGrade = myGrade;
    this.myEmotion = myEmotion;
}

または代わりに:

public PassTheClass(String myName, int myGrade, String myEmotion) {
    this(myName, myEmotion);
    this.myGrade = myGrade;
}

または、3番目の選択肢として、上記の最初のコンストラクターを保持し、使用している2引数のコンストラクターを次のように置き換えます。

public PassTheClass(String myName, String myEmotion) {
    this(myName, 0, myEmotion);
}

3番目の方法では、すべてを初期化する1つのコアコンストラクターと、いくつかのもののデフォルトを受け入れ、すべてをコアコンストラクターに渡すさまざまな便利なコンストラクターを使用できます。これにより、割り当てが1か所でのみ行われるため、コピーと貼り付けの量が最小限に抑えられます。

thisインスタンス変数をコンストラクター引数から区別するため、名前のバリエーションに頼る必要はありません。使用thisは、Javaコードの大部分が使用する標準の規則です。規則に従うと、コードが読みやすくなります。

于 2013-03-10T20:26:05.773 に答える
0

public PassTheClass (String xMyName, String xMyEmotion)コンストラクターは2つの引数を期待し、ここで3つの引数を渡します。

PassTheClass demo = new PassTheClass("Squidward",94,"proud");

そして、コンパイラは「ブレ?」と言います。

おそらく、次のような別のコンストラクターが必要です。

public PassTheClass (String xMyName, int grade, String xMyEmotion)
    {myName = xMyName;
    myGrade = grade;
    myEmotion = xMyEmotion;}
于 2013-03-10T20:27:16.943 に答える