java - 尝试用java为日历类编写月份类。

标签 java

好吧,对于一个大型实验室,我必须做的第一部分是编写一个日历类,就像我在这里编写的那样。这非常简单,因为我们得到了如何执行此操作的非常直接的说明。我会展示它,以防有助于解决问题:

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();

注意事项

  1. 这是 month 实例的方法,因此它不应该是 static 方法
  2. 它不接受任何参数,因此类中的行为也应该没有参数
  3. 它没有分配给任何东西,因此类中的行为应该返回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/

相关文章:

java - Android - 多线程TCP连接

java - 在 Eclipse 中将图像添加到 JButton

java - 使用 AND 或 OR 条件手动构建 SQL 查询时出现 MySql 语法错误异常

java - 基于JAVA EE的文件管理系统

java:有哪些库可以管理/监控进程?

java - 在 Java 中使用 DigestInputStream 时出现奇怪的循环

java - 是否有任何 Java HTML 解析器生成的节点保留原始文本的索引?

java - 从字符串中删除逗号

java - 如果一次满足值则停止循环一次

java - 得到 'IOException: hostname was not verified' ,尽管给定的主机名(IP 地址)与通用名称匹配