就在我认为我已经掌握了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();
答案 0 :(得分:2)
你可以使用'field'(它被称为'成员变量'),但在你的情况下,它被初始化为零,并且只能由方法更新。
因此,如果您从不调用该方法,则成员变量永远不会更新,因此保持为零。
此外,您没有“调用字段名称” - 您可以调用一个方法,该方法可能会返回一个值。 您可以引用该值,类似地,您可以引用成员变量。
答案 1 :(得分:1)
第一个问题的答案相对简单。字段为零,直到方法被调用至少一次。换句话说,字段在方法中设置,因此您必须首先调用方法。
第二个问题的答案是相关的。当您致电getNumVowels
,getNumDigits
或getWhitespace
时,您正在增加字段值。如果您在开始时将它们初始化为零,那么您的方法将起作用。
答案 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()
将始终返回正确的答案。