当我尝试运行此程序时,结果始终为null, 0 0
。为什么在monthName
方法调用并在屏幕上打印时,day
,year
和getDay()
的值不会显示。
public class Assignment1 {
public static void main(String[] args) {
//creates an array of type Date filled with two LongDate objects
Date [] collectionOfDates = { new LongDate("February",2,1996), new LongDate("February",13,1999) };
// loops through the array and displays output of getDate() for each object
for( int i = 0; i < collectionOfDates.length; i++ ) {
System.out.println( collectionOfDates[i].getDate() );
}
}
}
为了您的信息,LongDate
类是Date
类的子类,其中包含方法editDay()
和editYear()
以及其他几个方法。 LongDate
方法如下所示。
非常感谢任何帮助,谢谢。另外,如果您想了解更多信息,请随时发表评论。
public class LongDate extends Date {
private String monthName;
private int day;
private int year;
public LongDate() {
}
public LongDate(String m, int d, int y) {
super.editday(d);
super.edityear(y);
editMonth(m);
}
public void setDate(String m, int d, int y) {
monthName = m;
day = d;
year = y;
}
public String getDate() {
StringBuilder fullDate = new StringBuilder();
fullDate.append(monthName);
fullDate.append(" ");
fullDate.append(day);
fullDate.append(", ");
fullDate.append(year);
return fullDate.toString();
}
public String getShortDate() {
int month = 0;
if (monthName == "January") {
month = 1;
} else if (monthName == "February") {
month = 2;
} else if (monthName == "March") {
month = 3;
} else if (monthName == "April") {
month = 4;
} else if (monthName == "May") {
month = 5;
} else if (monthName == "June") {
month = 6;
} else if (monthName == "July") {
month = 7;
} else if (monthName == "August") {
month = 8;
} else if (monthName == "September") {
month = 9;
} else if (monthName == "October") {
month = 10;
} else if (monthName == "November") {
month = 11;
} else if (monthName == "December") {
month = 12;
}
StringBuilder shortDate = new StringBuilder();
shortDate.append(month);
shortDate.append("/");
shortDate.append(day);
shortDate.append("/");
shortDate.append(year);
return shortDate.toString();
}
protected String editMonth(String m) {
// asks person to try again if month is not capitalized and spelled properly
if (m != "January" && m != "February" && m != "March" && m != "April" && m != "May" && m != "June" && m != "July" && m != "August" && m != "September" && m != "October" && m != "November" && m != "December") {
m = Input.getString( "Invalid month. Please type the month again." );
return m;
} else
return m;
}
}
答案 0 :(得分:4)
LongDate
的构造函数中没有设置monthName
读取的字段(day
,year
和getDate()
)。
我认为Date#editDay()
和Date#editYear()
函数与LongDate#editMonth()
类似。请注意, editMonth()
不会为monthName
字段分配值!
答案 1 :(得分:3)
您应该将字符串与equals()
进行比较,而不是==
。 equals()
方法比较字符串值,而==
比较对象引用,这不是您想要的。所以改变:
if (monthName == "January") {
为:
if (monthName.equals("January")) {
和其他比较类似。
答案 2 :(得分:3)
一些问题。第一:
public LongDate(String m, int d, int y) {
super.day(d);
super.year(y);
editMonth(m);
}
您没有显示Date
因此我们不清楚day()
和year()
应该做什么,但无论如何:
public class LongDate extends Date {
private String monthName;
private int day;
private int year;
...
}
您对这些字段的声明隐藏了基本可能具有的任何类似字段。在任何情况下,在构造函数中的任何位置都没有将this.day
或this.year
设置为任何,因此,当然,它们仍保持初始值{{1 }}
您需要稍微清理一下代码。要么引用正确的0
和day
,要么确保设置并获取这些字段的基类版本,而不是在子类中重新声明它们(同样,不确定您的基本实现是什么)。
您可能需要查看Inheritance上的官方教程。它简洁,写得很好,涵盖了覆盖方法,隐藏字段等主题。我认为它将为您提供一个解决问题的良好起点。
当然,将字符串与year
进行比较会在将来导致其他问题:How do I compare strings in Java?
答案 3 :(得分:0)
您的editMonth
方法返回一个字符串,而不是设置月份:
monthName = m;
另一种选择是保持editMonth
方法相同,但在构造函数中放置:
monthName = editName(m);