-2

好的,我需要创建三个构造函数作为项目的一部分,一个默认,一个通用和一个副本。我设法创建了一个默认构造函数,但我无法创建通用或复制构造函数,否则我的代码将无法编译。如果有人知道答案,这是代码:

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());
}

但是我收到一条消息,说我没有合适的构造函数。

更新:通用和复制构造函数现在正在工作。谢谢你的帮助。

4

4 回答 4

2

您可以重载构造函数,如下所示:

缺点1:

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

重载您的构造函数,只需确保它们具有不同的签名并且它应该可以正常编译。为了保持 DRY,通过调用 this() 让副本和通用构造函数使用默认构造函数。

于 2012-10-04T14:35:15.140 回答
0

你需要重载你的构造函数。您不能定义具有相同名称和参数的方法。在这里寻找另一个参考:

在 Java 中处理多个构造函数的最佳方法

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

于 2012-10-04T14:28:33.527 回答