我需要再创建两个构造函数,但Java不会让我

时间:2012-10-04 14:22:15

标签: java multiple-constructors

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

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 个答案:

答案 0 :(得分:2)

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

cons1:

public Friend()
{

}

cons2:

    public Friend(int arg)
{

}

cons3:

    public Friend(String s)
{

}

复制缺点:

    public Friend(Friend f)
{

}

答案 1 :(得分: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 
}

答案 2 :(得分:0)

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

Best way to handle multiple constructors in Java

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

答案 3 :(得分:0)

重载你的构造函数,只是确保它们有不同的签名,它应该编译正常。要保持DRY,请让copy和general构造函数通过调用this()来使用默认构造函数。