Java构造函数问题

时间:2013-03-10 20:01:20

标签: java class

我创建了一个类文件和一个测试文件。当我尝试使用构造函数来创建对象时,它将无法编译。

它说“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());

   }
}

3 个答案:

答案 0 :(得分: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-arg构造函数并传入您当前编码的初始值:

 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”。 每个字段都隐含着“我的”字样;简单地命名,即namegradeemotion


好的代码完全是关于清晰度:更喜欢避免使用前缀,因为它们只会使代码混乱并降低可读性。

答案 1 :(得分:0)

您正在调用具有三个参数的构造函数,但您没有声明这样的参数。要使代码工作,您可以添加如下构造函数:

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

或者对于第三种替代方法,保留上面的第一个构造函数并用这个替换你拥有的2参数构造函数:

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

第三种方法允许你有一个初始化所有东西的核心构造函数,以及接受某些东西的默认值并将所有内容传递给核心构造函数的各种便利构造函数。这样可以最大限度地减少复制和粘贴的数量,因为分配只发生在一个地方。

this将实例变量与构造函数参数区分开来,因此您不需要求助于名称的变体。使用this是绝大多数Java代码使用的标准约定,遵循约定使您的代码更具可读性。

答案 2 :(得分:0)

public PassTheClass (String xMyName, String xMyEmotion)你的构造函数需要2个参数,你在这里传递3个参数:

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

编译器说“bleh?”

您可能需要另一个看起来像这样的构造函数:

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