toString()方法中的方法与字段名称

时间:2012-12-07 03:38:10

标签: java tostring

就在我认为我已经掌握了Java的基础知识(这是一个完整的学期!)时,有些事情让我对此提出质疑。我正在做一些练习回顾并遇到一些问题。这是代码:

public class LetterCount 
{
    private char[] wordArray;
    private int numVowels = 0, numConsonants = 0, numSpaces = 0, numDigits = 0;

    public LetterCount(String str)
    {
        wordArray = str.toCharArray();
    }

    public int getNumVowels()
    {
        for (int count = 0; count < wordArray.length; count++)
        {
           if (wordArray[count] == 'a' || wordArray[count] == 'e' || 
               wordArray[count] == 'i' || wordArray[count] == 'o' || wordArray[count] 
               == 'u' || wordArray[count] == 'y')

           numVowels++;
        }
        return numVowels;
    }

    public int getNumDigits()
    {
        for (int count = 0; count < wordArray.length; count++)
        {
            if (Character.isDigit(wordArray[count]))
                numDigits++;
        }
        return numDigits;
    }

    public int getWhiteSpace()
    {
        for (int count = 0; count < wordArray.length; count++)
        {
            if (Character.isSpaceChar(wordArray[count]))
                numSpaces++;
        }

        return numSpaces;
    }

    public int getNumConsonants()
    {       
        numConsonants = wordArray.length - getNumVowels() - getNumDigits() - getWhiteSpace();

        return numConsonants;
    }

    public String toString()
    {
        String str = "Characters: " + wordArray.length + "\n" +
    "Vowels: " + getNumVowels() + "\n" +
                "Consonants: " + getNumConsonants() + "\n" +
                "Digits: " + getNumDigits() + "\n" +
                "Spaces: " + getWhiteSpace();

        return str;
    }
}

这是输出:

Enter a sentence: this is a test 4 u
Characters: 18
Vowels: 5
Consonants: 2
Digits: 2
Spaces: 10

我的问题: 1)我确信我可以在toString()方法中使用字段名称(例如, numVowels getNumConsonants()),但似乎这个类要求我使用方法名称。当我使用字段名称时,我得到0.为什么区别?我知道如果我返回一个等式,我必须使用方法名称。

2)我也不明白为什么我的numConsonants()方法没有返回正确的数字。如果我单独返回每个字段(并调用方法,因为我无法调用字段名称),我得到正确的数字。把它们放在一个等式中,这是不正确的。我做错了什么?

这是最初的主要方法。我已经编辑它来调用LetterCount类中的方法:

    import java.util.Scanner;


public class LetterCountDemo {

    public static void main(String[] args) 
    {
        String sentence;
        LetterCount lc;
        Scanner keyboard = new Scanner(System.in);

        System.out.print("Enter a sentence: ");
        sentence = keyboard.nextLine();

        lc = new LetterCount(sentence);

        System.out.println(lc);
    }

}

添加了:

        lc.getNumVowels();
    lc.getNumConsonants();

3 个答案:

答案 0 :(得分:2)

你可以使用'field'(它被称为'成员变量'),但在你的情况下,它被初始化为零,并且只能由方法更新。

因此,如果您从不调用该方法,则成员变量永远不会更新,因此保持为零。

此外,您没有“调用字段名称” - 您可以调用一个方法,该方法可能会返回一个值。 您可以引用该值,类似地,您可以引用成员变量。

答案 1 :(得分:1)

第一个问题的答案相对简单。字段为零,直到方法被调用至少一次。换句话说,字段在方法中设置,因此您必须首先调用方法。

第二个问题的答案是相关的。当您致电getNumVowelsgetNumDigitsgetWhitespace时,您正在增加字段值。如果您在开始时将它们初始化为零,那么您的方法将起作用。

答案 2 :(得分:0)

您必须使用方法而不是字段的原因很简单。您的方法不是简单的访问方法。(检查this link)它们进行一些计算并更新归档变量并返回它们。因此,在调用方法之前,您的字段的值为零。

这种更新字段变量的方法很糟糕。如果您调用该方法两次(例如:getNumVowels),它将更新已更新的字段变量numVowels

getNumConsonants的问题与上述答案有关。

这里的解决方案是不使用字段变量并使用局部变量。见下面的例子。

public int getNumDigits()
{
    int numDigits = 0;
    for (int count = 0; count < wordArray.length; count++)
    {
        if (Character.isDigit(wordArray[count]))
            numDigits++;
    }
    return numDigits;
}

通过此修改getNumDigits()将始终返回正确的答案。