变量以某种方式失去价值?

时间:2014-03-10 22:40:05

标签: java inheritance

当我尝试运行此程序时,结果始终为null, 0 0。为什么在monthName方法调用并在屏幕上打印时,dayyeargetDay()的值不会显示。

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;
    }
}

4 个答案:

答案 0 :(得分:4)

LongDate的构造函数中没有设置monthName读取的字段(dayyeargetDate())。

我认为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.daythis.year设置为任何,因此,当然,它们仍保持初始值{{1 }}

您需要稍微清理一下代码。要么引用正确的0day,要么确保设置并获取这些字段的基类版本,而不是在子类中重新声明它们(同样,不确定您的基本实现是什么)。

您可能需要查看Inheritance上的官方教程。它简洁,写得很好,涵盖了覆盖方法,隐藏字段等主题。我认为它将为您提供一个解决问题的良好起点。

当然,将字符串与year进行比较会在将来导致其他问题:How do I compare strings in Java?

答案 3 :(得分:0)

您的editMonth方法返回一个字符串,而不是设置月份:

monthName = m;

另一种选择是保持editMonth方法相同,但在构造函数中放置:

monthName = editName(m);