【问题标题】:How to call a constructor within the class in another method如何在另一个方法中调用类中的构造函数
【发布时间】:2014-02-27 19:16:48
【问题描述】:

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

我确实进行了搜索,但找不到这个特定的(在课堂上)问题。我确实尝试过使用“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();
    } 
}

【问题讨论】:

  • 硬币 newCoin = new Coin();
  • 反过来做。将代码移回您的 toss 方法,然后从构造函数内部调用 toss()
  • @MikeB 坏主意。您不应该从构造函数中调用该方法。请参阅我的答案以了解原因。
  • @RohitJain 所以让方法最终化。
  • 谢谢,Arnaud,成功了!!

标签: java class methods constructor


【解决方案1】:

反过来做。将代码移回您的 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";
       }
   } 
}

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

您可以像我在这里所做的那样创建方法final 以避免出现问题。

【讨论】:

  • 感谢您提供的所有信息!
【解决方案2】:

要使用构造函数,您需要使用“new”关键字。例如

Coin myCoin = new Coin();

【讨论】:

  • 这并不能解决他的问题。他想重用代码,而不是创建新对象。
  • 它确实回答了上述问题 - “如何在另一个方法中调用类中的构造函数”。
  • 并非如此。剩下的问题是“如何调用构造方法”——因为实际上没有构造方法这样的东西,所以有必要更仔细地研究这个问题,以找出提问者实际上在问什么。我们不能总是期望新学习者正确使用术语。
【解决方案3】:
// ******************** Instructor notes...
// This is the same code as your toss() method
// It is OK to call that method from your constructor.

恐怕第三个陈述不是真的。在构造函数中调用 overridable 方法实际上是不行的。这将在对象完全初始化之前泄漏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";
        }
    }

}

【讨论】:

  • 好点。他应该声明一个private 方法来执行它,然后让构造函数和公共toss 调用它。
猜你喜欢
  • 1970-01-01
  • 2014-08-01
  • 2020-11-07
  • 2012-06-22
  • 2020-02-15
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多