-2

OK、プロジェクトの一部として3つのコンストラクターを作成する必要があります。1つはデフォルト、1つは一般、もう1つはコピーです。デフォルトのコンストラクターを作成できましたが、一般的なコンストラクターもコピーコンストラクターも作成できません。そうしないと、コードがコンパイルされないためです。誰かが答えを知っている場合のコードは次のとおりです。

package lab02;

import javax.swing.JOptionPane;

/**
 * Stores the personal details of a friend.
 * 
 * @author Keith Francis(11109971)
 * @date 4-10-2012
 */
public class Friend {

    private String firstName;// stores first name
    private String surname;// stores surname
    private String address;// stores address
    private int age;// stores age in years
    private int height;// stores height in cms
    private String hairColourString;// stores hiar colour as a string

    private boolean colourTrue = false;// hair colour value is not valid

    public static final int BLACK = 0;
    public static final int BROWN = 1;
    public static final int BLONDE = 2;
    public static final int RED = 3;
    public static final int GREY = 4;

    /**
     * Default constructor sets everything to 0 or null, depending on type.
     */
    public Friend() {

        firstName = null;
        surname = null;
        address = null;
        age = 0;
        height = 0;
        hairColourString = null;
    }

    /**
     * Allows the first name to be edited
     * 
     * @param first
     *            first name variable
     */
    public void setFirstName(String first) {
        firstName = first;
    }

    /**
     * Retrieves first name
     * 
     * @return first name to String
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * Allows the surname to be edited
     * 
     * @param last
     *            creates last name variable
     */
    public void setSurname(String last) {
        surname = last;
    }

    /**
     * Retrieves the surname
     * 
     * @return last name to string
     */
    public String getSurname() {
        return surname;
    }

    /**
     * Allows the address to be edited
     * 
     * @param place
     *            where the friend lives
     */
    public void setAddress(String place) {
        address = place;
    }

    /**
     * Retrieves the address
     * 
     * @return the address of the friend
     */
    public String getAddress() {
        return address;
    }

    /**
     * Allows the age (in years) to be edited
     * 
     * @param years
     *            the age in years
     */
    public void setAge(int years) {
        age = years;
    }

    /**
     * Retrieves the age in years
     * 
     * @return the age in years
     */
    public int getAge() {
        return age;
    }

    /**
     * Allows the height in centimetres to be edited
     * 
     * @param h
     *            height in centimetres
     */
    public void setHeight(int h) {
        height = h;
    }

    /**
     * Retrieves the height in centimetres
     * 
     * @return height in centimetres
     */
    public int getHeight() {
        return height;
    }

    /**
     * 
     * @return String of the personal details of the friend
     */
    @Override
    public String toString() {
        return ("First name is: " + firstName + "\nSurname is: " + surname
                + "\nAddress is: " + address + "\nAge is :" + age
                + "\nHeight is: " + height + "\nHair colour is: " + hairColourString);
    }

    /**
     * Uses JOptionPanel to edit the friend's personal details
     */
    void inputFriend()
    {
        //welcome message
        JOptionPane.showMessageDialog(null,"Weclome",null,JOptionPane.PLAIN_MESSAGE);
        //prompt to enter first name
        String name1 = JOptionPane.showInputDialog("Enter the friend's first name.");
        //calls setFirstName method
        setFirstName(name1);
        //prompt user to enter second name
        String name2 = JOptionPane.showInputDialog("Enter the friend's surname.");
        setSurname(name2);// calls setSurname method

        //prompt user to enter address
        String thisAddress = JOptionPane.showInputDialog("Enter the friend's address.");
        setAddress(thisAddress);//calls setAddress method
        //prompt user to enter age in years
        String ageString = JOptionPane.showInputDialog("Enter the friend's age in years.");
        int i = Integer.parseInt(ageString);
        setAge(i);
        //prompt user to enter height in centimetres
        String heightString = JOptionPane.showInputDialog("Enter the friend's height in cenimetres.");
        int j = Integer.parseInt(heightString);
        setHeight(j);
        //prompt user to enter hair colour
        String hairColourInput = JOptionPane.showInputDialog("Select the friend's " +
                "hair colour:\n 0 = Black\n1 = Brown\n2 = Blonde\n3 = Red\n4 = Grey");
        while(colourTrue != true)//if hair colour is valid
        {
        if(
            hairColourInput.equals("0"))
        { hairColourString = "Black";//hair is black
            colourTrue = true;}//entry is valid
        else if (hairColourInput.equals("1"))
        { hairColourString = "Brown";//hair is brown
            colourTrue = true;}//entry is valid
        else if (hairColourInput.equals("2"))
        { hairColourString = "Blonde";//hair is blonde
            colourTrue = true;}//entry is valid
        else if (hairColourInput.equals("3"))
        { hairColourString = "Red";//hair is red
            colourTrue = true;}//entry is valid 
        else if (hairColourInput.equals("4"))
        { hairColourString = "Grey";//hair is grey
            colourTrue = true;}//entry is valid
            else {
                JOptionPane.showMessageDialog(null,
                        "The number entered is invalid.", "Error",
                        JOptionPane.WARNING_MESSAGE);// warns user that entry is
                                                        // not valid
                hairColourInput = JOptionPane
                        .showInputDialog("Select the friend's " +
                        "hair colour:\n 0 = Black\n1 = Brown\n2 = Blonde\n3 = Red\n4 = Grey");
            }// user is asked to choose again until they enter a valid number

        }
    }

    /**
     * 
     * @param args
     *            Calls inputFriend method and prints out the final String using
     *            JOptionPane
     */
    public static void main(String[] args) {
        Friend friend = new Friend();
        friend.inputFriend();// calls inputFriend method
        JOptionPane.showMessageDialog(null, friend.toString()); // prints out details
    }
}

コピーコンストラクターでの私の試みは次のとおりです。

public Friend(Friend aFriend) {
    this(aFriend.getFirstName(), aFriend.getSurname(), aFriend.getAddress, aFriend.getAge, aFriend.getHeight);

そして、一般的なコンストラクターでの私の試み:

public Friend2(){
    public static final int BLACK = 0;
    public static final int BROWN = 1;
    public static final int BLONDE = 2;
    public static final int RED = 3;
    public static final int GREY = 4;
}

出てきたのは、コンストラクターを挿入したときにクラス、インターフェイス、または列挙型が予期されていたということでした。お役に立てば幸いです。

そうです、私は次のようなコピーコンストラクターを試しました。

public Friend(Friend f) {
this(f.getFirstName(),f.getSurname(),f.getAddress(),f.getAge(),f.getHeight());
}

しかし、適切なコンストラクターがないというメッセージが表示されます。

UPDATE:generalおよびcopyコンストラクターが機能するようになりました。ご協力いただきありがとうございます。

4

4 に答える 4

2

以下のようにコンストラクターをオーバーロードできます。

cons1:

public Friend()
{

}

短所2:

    public Friend(int arg)
{

}

短所3:

    public Friend(String s)
{

}

短所をコピーする:

    public Friend(Friend f)
{

}
于 2012-10-04T14:29:02.133 に答える
1

コンストラクFriend2()ターは実際にはFriend2クラスのコンストラクターであるため、間違っています。クラスのコンストラクターはすべて、クラス名と同じメソッド名を持っている必要があります。(コンストラクター宣言は、クラスと同じ名前のメソッド宣言のように見えますが、戻り型は指定されていません)

コピーコンストラクターはthis、存在しないコンストラクターを呼び出すために使用しています。(this(x,y,z)コンストラクターの3引数バージョンを呼び出しています)

必要なのは、次のようなものです。

public class Friend 
{

// snip


/**
 * Default constructor sets everything to 0 or null, depending on type.
 */
public Friend()
{

firstName = null;
surname = null;
address = null;
age = 0;
height = 0;
hairColourString = null;
}

public Friend(Friend f) {
    // copy constructor
}

public Friend(String fName, String sName, String address, int age, int height, String hair) {
    // fill in stuff here
}

// snip 
}
于 2012-10-04T14:29:34.737 に答える
0

コンストラクターをオーバーロードする必要があります。同じ名前とパラメーターでメソッドを定義することはできません。別の参考資料については、こちらをご覧ください。

Javaで複数のコンストラクターを処理するための最良の方法

http://www.java-samples.com/showtutorial.php?tutorialid=284

于 2012-10-04T14:28:33.527 に答える
0

コンストラクターをオーバーロードします。それらが異なる署名を持っていることを確認してください。正しくコンパイルされるはずです。DRYを維持するには、コピーおよび一般コンストラクターにthis()を呼び出してデフォルトのものを使用させます。

于 2012-10-04T14:35:15.140 に答える