如何在另一个方法中调用类中的构造函数

时间:2014-02-27 19:16:49

标签: java class methods constructor

我是学生。刚刚回到家庭作业,说明我应该调用构造函数方法,而不是重用相同的代码。我复制了代码,因为我无法在没有错误的情况下调用构造函数。从单独的方法调用构造函数方法的正确语法是什么?

我确实做过搜索,但我找不到这个特定的(在课堂内)问题。我确实尝试过使用“this”以及创建类实例,但我一直都会遇到错误。

import java.util.Random;
public class Coin {

    // variable for a generic coin toss
    private String sideUp;  

    // Constructor 

    // ******************** Instructor notes...
    // This is the same code as your toss() method
    // It is OK to call that method from your constructor.
    // Don't copy/paste code or repeat yourself if not required.
    public Coin() { 
        Random rand1 = new Random();
        int x = rand1.nextInt(2);   
        if (x > 0){
            sideUp = "Heads";
        }else{
            sideUp = "Tails";
        }
    }


    //Void Method
    public void toss() {
        // how to call the Coin constructor above??????????????????????????
        Coin();
    } 
}

3 个答案:

答案 0 :(得分:2)

反过来做。将代码移回toss方法,只需从构造函数内部调用toss()

import java.util.Random;
public class Coin {

   // variable for a generic coin toss
   private String sideUp;  

   // Constructor 

   // ******************** Instructor notes...
   // This is the same code as your toss() method
   // It is OK to call that method from your constructor.
   // Don't copy/paste code or repeat yourself if not required.
   public Coin() { 
       toss();  
   }


   //Void Method
   public final void toss() {
       Random rand1 = new Random();
       int x = rand1.nextInt(2);   
       if (x > 0){
           sideUp = "Heads";
       }else{
           sideUp = "Tails";
       }
   } 
}

正如其他评论和答案中所指出的,调用可能从构造函数覆盖的方法是一个坏主意。以下是对原因的一个很好的解释:Why is it considered bad practice to call a method from within a constructor?

您可以像我在这里一样制作方法final,以避免出现问题。

答案 1 :(得分:1)

要使用构造函数,您需要使用'new'关键字。 e.g。

Coin myCoin = new Coin();

答案 2 :(得分:1)

// ******************** Instructor notes...
// This is the same code as your toss() method
// It is OK to call that method from your constructor.

我担心第三种说法不是真的。在构造函数中调用可覆盖的方法实际上是不行的。这将在对象完全初始化之前泄漏this引用。 That could give you unexpected result,如果在子类中覆盖您的方法。您应该与导师确认一下。

顺便说一句,教师并没有说从方法调用构造函数,反之亦然。但你不会做其中任何一个。只需将代码从构造函数移动到toss()方法,如果该部分代码必须是toss()方法的一部分。

或者如果你真的想要在构造函数和toss()方法中执行这些代码,那么在你的类中创建一个private方法,在那里移动那些代码,并从两个地方调用它:

public class Coin {

    // variable for a generic coin toss
    private String sideUp;  

    public Coin() {
        initSideUp();
    }

    //Void Method
    public void toss() {
        initSideUp();
    }

    private void initSideUp() { 
        Random rand1 = new Random();
        int x = rand1.nextInt(2);   
        if (x > 0){
            sideUp = "Heads";
        }else{
            sideUp = "Tails";
        }
    }

}