Domanda

OK, I need to create three constructors as part of a project, one default, one general and one copy. I've managed to create a default constructor, but I can't create either the general or copy constructors because otherwise my code won't compile. Here is the code if anybody knows the answer:

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
    }
}

Here is my attempt at a copy constructor:

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

and my attempt at the general constructor:

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

What came up was that a class, interface or enum was expected when I inserted the constructor. Hope that helps.

Right, I've tried the copy constructor like this:

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

But I am getting a message saying that I don't have a suitable constructor.

UPDATE:general and copy constructors are now working. Thanks for your help.

È stato utile?

Soluzione

you can overload the constructor like below:

cons1:

public Friend()
{

}

cons2:

    public Friend(int arg)
{

}

cons3:

    public Friend(String s)
{

}

copy cons:

    public Friend(Friend f)
{

}

Altri suggerimenti

Your Friend2() constructor is wrong because it is actually a constructor for a Friend2 class. Constructors for a class should all have a method name that is the same as the class name. (constructors declarations look like method declarations named the same as the class but without specify a return type)

Your copy constructor is using this to call a constructor that does not exists. ( this(x,y,z) is calling the 3 argument version of the constructor)

What you want is something that looks like the following:

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 
}

You need to overload your constructor. You cannot define a method with the same name and parameters. Look here for another reference:

Best way to handle multiple constructors in Java

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

Overload your constructors, just make sure they have different signatures and it should compile fine. To keep it DRY, have the copy and general constructors use the default one by calling this().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top