有人可以看一下这个例子,并告诉我为什么我将null10作为打印值而不是10吗?
并且在不使用全局String变量“ word”的情况下,该程序是否存在且更简单的解决方案
public class UserInput {
public static String word;
public static class TextInput {
public void add(char c) {
word = word + c;
}
public static String getValue() {
return word;
}
}
public static class NumericInput extends TextInput {
@Override
public void add(char c) {
if (Character.isDigit(c)){
word = word + c;
}
}
}
public static void main(String[] args) {
TextInput input = new NumericInput();
input.add('1');
input.add('a');
input.add('0');
System.out.println(input.getValue());
}
}
编辑:我需要使用TextInput的继承
答案 0 :(得分:2)
您需要为静态word
字段提供一个初始值,否则它将默认为null
。而且,当Java连接String对象时,它将把null
引用视为文字字符串“ null”。因此,您实际上总是从字符串“ null”开始。
如果您为您的类字段提供一个""
(空字符串)的起始值,那么您的代码应达到您的期望。
关于执行此操作的更好方法,我改为给该类一个类型为StringBuilder
的非静态字段(并对其进行初始化,使其不为null
)。然后,您的add
方法可以简单地将新字符append(c)
StringBuilder
到word + c
字段对象,这比重复使用字符串串联(这是Ionic Serve Now = 4769ms
所得到的)要更有效)。
答案 1 :(得分:1)
您没有初始化input
,因此它是null
。您需要先初始化input
才能进行串联。
因此,使用此:
public static String word = "";
答案 2 :(得分:1)
您应该使用实例变量,而不是使用在TextInput类的所有实例和子实例之间共享的静态变量。
您仍然必须初始化一个非null值
看起来像
public static class TextInput {
protected String word;
public TextInput() {
this.word = "";
}
public void add(char c) {
word = word + c;
}
public String getValue() {
return word;
}
}
为了更好地理解问题,请尝试使用此代码
TextInput input = new TextInput();
input.add('a');
System.out.println(input.getValue());
TextInput input2 = new NumericInput();
input2.add('1');
input2.add('0');
System.out.println(input2.getValue());
其他内容,请参见@Bobulous有关使用StringBuilder的评论
答案 3 :(得分:0)
您没有初始化“单词”。
public class TextInput {
public static String word=""; // a lil change here
public static class TextInput {
public void add(char c) {
word += c;
}
public String getValue() {
return word;
}
}
public static class NumericInput extends TextInput {
public void add(char c) {
if (Character.isDigit(c)){
word += c;
}
}
}
public static void main(String[] args) {
NumericInput input = new NumericInput();
input.add('1');
input.add('a');
input.add('0');
System.out.print(input.getValue());
}
}