【问题标题】:Variables in Constructor?构造函数中的变量?
【发布时间】:2013-11-22 07:01:07
【问题描述】:

我目前是 Java 编程的初学者,我的任务是“编写和测试 Hangman 游戏的一个版本。您的解决方案将涉及一个 Hangman 类,它的构造函数选择一个单词,并且它的 guess 方法处理每个猜测的字符。”

但是,我有一个小问题。我的整个代码都可以运行和编译,并且我已经编写了guess 方法,但是我在编译时遇到了问题。我在构造函数中声明了实例变量。我在代码中的各个地方都使用了字符串变量字,它不允许我编译。
我的问题的核心是这个。

public class Hangman{

public Hangman () {

    String word = "p u m p k i n";
    String blanks = "_ _ _ _ _ _ _";


}
 int k = word.length(); ... rest code after this

当我尝试编译它时,它不允许我这样做。它表示变量 word 为空并显示错误消息。为什么我不能使用 word.length() 来查找长度的值?不能将构造函数内部声明的变量用作实例变量吗?最简单的解决方法是在构造函数之外声明我的实例变量(如果我这样做,我的代码可以完美地工作),但是提示要我选择在构造函数中声明这个词。为什么我不能使用字符串词我在构造函数中声明为“p u m p k i n”以获得k?在我的方法中使用变量空白也不起作用。

那么,这有什么问题呢?如何将构造函数中声明的变量用作实例变量?或者这是不可能的?为什么我不能使用构造函数中声明的字符串字或字符串空格? 谢谢。

【问题讨论】:

  • 在任何函数中声明的变量都是该函数的本地变量,并且它们的范围仅在该函数中。因此,将构造函数中声明的变量用作实例变量是没有问题的。您可以在构造函数中声明实例变量并对其进行初始化。

标签: java


【解决方案1】:

每次您在构造函数中创建 本地 变量时。

public Hangman () {

    String word = "p u m p k i n";
    String blanks = "_ _ _ _ _ _ _";


}

您要做的就是将constructor 中的值分配给成员。

    String word;
    String blanks;
    public Hangman () {
        word = "p u m p k i n";
        blanks = "_ _ _ _ _ _ _";

    }

更重要的是,不在构造函数参数中获取它们并在构造函数中分配它们是没有意义的。

应该是

 public Hangman (String word, String blanks) {
                        this.word   = word;
                        this.blanks = blanks;

                    }

【讨论】:

    【解决方案2】:

    将它们声明为实例变量并在构造函数中对其进行初始化。如果您在构造函数中声明并初始化它们,它们将只能在构造函数(本地范围)内访问,而不能在其他地方访问,从而使它们变得无用。

    private String word;
    private String blanks;
    
    public Hangman () {
        word = "p u m p k i n";
        blanks = "_ _ _ _ _ _ _";
    }
    
    // Have setters and getters for word and blanks if possible.
    

    【讨论】:

      【解决方案3】:

      因为你在构造函数中声明了word,即文本:

      String word = "p u m p k i n";
      String blanks = "_ _ _ _ _ _ _";
      

      public Hangman()的括号内,对构造函数来说就是local。它只存在于构造函数的范围内。

      要解决此问题,请将变量声明带入外部,如下所示:

      public class Hangman{
      
      private String word;      //declaring class variables as private
      private String blanks;    //is a common best-practice
      
      public Hangman () {
          word = "p u m p k i n";
          blanks = "_ _ _ _ _ _ _";
      }
      
      int k = word.length(); ... rest code after this
      

      至于为什么我们喜欢将类变量声明为私有,维基百科上encapsulation 上的文章可能会有用。

      【讨论】:

        【解决方案4】:

        您必须执行以下操作

        public class Hangman{
        
        private String word;
        private String blanks
        
        public Hangman () {
        
            word = "p u m p k i n";
            blanks = "_ _ _ _ _ _ _";
        
        
        }
         int k = word.length(); ... rest code after this
        

        所以基本上你必须将你的变量定义为实例变量而不是局部变量(你已经完成了)。如果你想稍后在你的类中访问它,它的范围应该是这样的,这就是你必须使它成为实例变量的原因。还为记录实例变量分配了默认值。

        【讨论】:

          猜你喜欢
          • 2015-04-13
          • 2019-05-25
          • 1970-01-01
          • 1970-01-01
          • 2010-12-28
          • 2023-03-12
          • 1970-01-01
          • 2012-11-10
          • 2012-01-23
          相关资源
          最近更新 更多