无论如何 - 我遇到的问题/混淆涉及我在程序中测试compareTo
方法的第一段代码。
我会将代码顶部的变量用作static void main
区域中的变量,还是像我一样分配新变量?
public Date()
中的值...< - 这是static void main
中的代码与之比较的日期吗? (如果是这样,我有一段我想要使用的代码,它使用的是当前日期,而不是Date()
中的代码)。
我以后可能会有更多问题,但我希望有人可以比我的书更好地解决我的困惑,或者google已经证明了这一点。
package date;
import java.util.*;
public class Date implements Comparable
{
static Scanner console = new Scanner(System.in);
private int dMonth; //Part a of confusion 1
private int dDay;
private int dYear;
public Date()
{
dMonth = 1; //Confusion 2
dDay = 1;
dYear = 1900;
}
public Date(int month, int day, int year)
{
dMonth = month;
dDay = day;
dYear = year;
}
public void setDate(int month, int day, int year)
{
dMonth = month;
dDay = day;
dYear = year;
}
public int getMonth()
{
return dMonth;
}
public int getDay()
{
return dDay;
}
public int getYear()
{
return dYear;
}
public String toString()
{
return (dMonth + "." + dDay + "." + dYear);
}
public boolean equals(Object otherDate)
{
Date temp = (Date) otherDate;
return (dYear == temp.dYear
&& dMonth == temp.dMonth
&& dDay == temp.dDay);
}
public int compareTo(Object otherDate)
{
Date temp = (Date) otherDate;
int yrDiff = dYear - temp.dYear;
if (yrDiff !=0)
return yrDiff;
int monthDiff = dMonth - temp.dMonth;
if (monthDiff !=0)
return monthDiff;
return dDay - temp.dDay;
}
public static void main(String[] args) //Part b of confusion 1
{
int month;
int day;
int year;
Date temp;
System.out.print("Enter date in the form of month day year");
month = console.nextInt();
day = console.nextInt();
year = console.nextInt();
System.out.println();
}
}
答案 0 :(得分:3)
正如评论中所提到的,我认为您需要了解静态方法/属性与实例中的静态方法/属性之间的区别。我认为这是你应该在main
方法中做的事情:
System.out.print("Enter date in the form of month day year");
Date date1 = new Date(console.nextInt(), console.nextInt(), console.nextInt());
System.out.print("Enter second date in the form of month day year");
Date date2 = new Date(console.nextInt(), console.nextInt(), console.nextInt());
System.out.println("Comparison result:");
System.out.println(date1.compareTo(date2));
关于你的困惑点:
private int dMonth; //Part a of confusion 1
private int dDay;
private int dYear;
这些是特殊变量。每个实例(即使用new Date
创建的每个对象)都有dMonth
,dDay
和dYear
的值。它不能从main
访问,因为main
是一个静态方法,因此无法访问实例变量。
如果你不明白,至少你知道要进一步搜索的名字。
public Date()
{
dMonth = 1; //Confusion 2
dDay = 1;
dYear = 1900;
}
当您创建新的Date
对象而未指定所需的月/日/年时,将使用这些值。因此new Date(2, 3, 2013)
表示2/3/2013,而new Date()
表示1/1/1900。
答案 1 :(得分:2)
dMonth
,dDay
和dYear
是member variables。如果您想在main
方法中直接使用它们,则必须使用关键字static
,以便它们变为class variables。但不,那不是你想要的。你的主要方法真的没用。你的困惑点2是一个构造函数:
Date d = new Date(); // Data Instance -> First constructor
d.getMonth(); // 1
d.getDay(); // 1
d.getYear(); // 1900
Date d2 = new Date(2, 2, 1901);
d2.getMonth(); // 2
d2.getDay(); // 2
d2.getYear(); // 1901
d2.setDate(3, 3, 1902);
d2.getMonth(); // 3
d2.getDay(); // 3
d2.getYear(); // 1902
d.getMonth(); // Still 1 since member variables of d are independent of d2
d.compareTo(d2); // -2 -> (1900 - 1902)
您可以在main方法中创建日期实例,并使用上面的代码来访问成员变量(可能是练习的全部内容)。