好吧,对于一个大型实验室,我必须做的第一部分是编写一个日历类,就像我在这里编写的那样。这非常简单,因为我们得到了如何执行此操作的非常直接的说明。我会展示它,以防有助于解决问题:
import java.util.Scanner;
public class Calendar
{
static final int FEBRUARY = 2;
static final int MONTHS_PER_YEAR = 12;
static int [] daysPerMonth =
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static String [] months =
{"", " Januray", "February", " March", " April",
" May", " June", " July", " August",
"September", " October", "November", "December"};
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("Enter the year? (yyyy): ");
int year = in.nextInt();
int firstDay = firstDayOfYear(year);
// February: Check for leap year
daysPerMonth [FEBRUARY] = isLeapYear(year) ? 29 : 28;
for (int i=1; i <= MONTHS_PER_YEAR; i++) {
Month month = new Month(daysPerMonth[i], firstDay);
System.out.println("\n\n "+months[i]+" "+year);
month.printMonth();
firstDay = month.getFirstDayOfNextMonth();
}
}
private static boolean isLeapYear(int year) {
return ((year%4 == 0) && (year%100 != 0)) || (year%400 == 0);
}
private static int firstDayOfYear(int year) {
return (2 * (13) + (3 * (13+1)/5) + (year-1) + ((year-1)/4)
- ((year-1)/100) + ((year-1)/400) + 2) % 7;
}
}
好的,这是第一个类。我真正开始遇到困难的部分是编写“几个月”的类(class)。我已经创建了该类,并且一直尝试开始设置不同的方法并执行类似的操作,但我似乎无法理解如何在一个类中准确设置某些内容,以便它适用于另一个类的概念类。
这就是 Months 类必须做的事情:您必须定义的 Month 类必须包含以下状态和行为:
状态
该月的天数(28-31 之间的整数)
该月的第一天(0-6 之间的整数,Sun=0、Mon=1、Tues=2、Wed=3、Thurs=4、Fri=5、Sat=6)
行为
带有两个参数的标准构造函数,用于直接设置月份的状态。
返回下个月应开始的日期的方法。
使用循环打印出该月日历的方法。也就是说,您不应该只有 28 组不同的 println() 语句来直接打印日历。
我在 Java 中做一些事情真的很困难,因为我刚刚学习这门语言。请不要建议我去读java书籍或类似的东西,因为我已经读过,而这对我来说仍然只是一门外语。任何有关此问题的帮助将不胜感激,我并不是说以任何方式为我回答,只是可能给我如何做的建议。
这是到目前为止我几个月的类(class)
import java.util.*;
public class Month {
Scanner sc = new Scanner(System.in);
public static void Month(int daysPerMonth, int firstDay) {
daysPerMonth = MONTHS_PER_YEAR
}
}
这是完全错误的。我不断尝试使用月份方法进行不同的操作,例如 static int、no static 以及内部的不同操作,但是没有什么可以让我不出现错误,这非常令人沮丧。有时java很烦人,因为我的教授很糟糕,实际上根本不教如何编写代码,只是教计算机如何工作。
最佳答案
这是类布局的示例,在本例中为“月份”类
月份<----------------类(class)
每月天数<----状态
第一天<-------------状态
月份<--------------行为
startDay <------------ 行为
printCal <------------ 行为
所以根据我们需要的定义,
- 两种状态
- 三种行为(包括构造函数)
这就是这个类(class)看到和知道的全部内容。所以你必须告诉类(class)它需要知道什么。
目前您有以下内容
月份<------------类(class)
sc <-- 状态
月份<------------行为
您创建了一个 Scanner 对象 sc
,作为一种状态,因为它不包含在任何行为中。我们暂时不考虑这个,所以删除它。我们需要的状态如上图所示。让我们尝试添加一个状态
public int daysPerMonth;
您可以尝试添加下一个。并考虑上面的内容(是否应该是静态的?)
现在你的构造函数不需要是静态的,它是一个修饰符,但我们现在不需要它
方法上的 static
修饰符意味着我们希望在不实例化对象的情况下访问方法。但你不想这样做对吗?我们想要实例化一个对象。因此,让我们删除这些标识符。现在,假设所有构造函数只需要以下内容
public CLASSNAME
,其中 CLASSNAME 是保存此方法/构造函数的类。因此,现在请记住,构造函数在创建时初始化对象,它所需要的只是与类具有相同的名称并且是公共(public)的。所以这就是你的构造函数应该是什么样子的。
public Month(){
}
我们尝试添加他们要求的参数怎么样?
public Month(int numDaysPerMonth, int firstDay){
}
好的,现在我们需要设置之前创建的变量,左侧分配值,右侧分配
public Month(int daysPerMonth, int firstDay){
this.daysPerMonth = daysPerMonth;
// I will let you do the next one
// Hmm what does the "this" do here?
}
这应该能让你在第一行得到正确的开始
Month month = new Month(daysPerMonth[i], firstDay);
现在休息一下,回顾一下本节,您应该知道如何使用以下内容
- 构造函数
静态
、最终
、公共(public)
标识符这个
进入下一阶段,第一个行为与该对象的方法匹配
month.printMonth();
注意事项
- 这是
month
实例的方法,因此它不应该是static
方法 - 它不接受任何参数,因此类中的行为也应该没有参数
- 它没有分配给任何东西,因此类中的行为应该返回
void
这就是了解此信息的样子
public void printMonth() {
}
里面很空,所以要由你来填充里面。此方法的一些提示。
帮助变量
static String [] day = {"Sun","Mon","Tues","Wed","Thurs","Fri","Sat"};
int nextDay;
循环
您的循环应从 1 开始并于 daysPerMonth
改变日子
只需添加 1 即可遍历上面的帮助变量,您应该使用局部变量而不是firstDay
来跟踪当前日期
重置日子
有很多方法可以做到这一点,我只是使用一个条件来检查当前检查的日期是否达到“星期六”,然后重置为“星期日”
现在,当您完成整个循环后,最后一天应该是下个月的第二天,是的!我们用一种行为消灭了两种行为。将值分配给nextDay
所以你的下一个方法只需要返回 nextDay
并且因为它需要分配给 int
(在 Calendar
类中注明)我们也需要在类中匹配它
public int getFirstDayOfNextMonth() {
return nextDay;
}
这就是 Java 的神秘面纱。
关于java - 尝试用java为日历类编写月份类。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6405707/