1

我必须编写一个封装课程的类。假设一门课程具有三个属性:代号、描述和学分。我必须包括一个构造函数、访问器和修改器,以及方法toStringequals.

作为这项作业的一部分,我必须编写一个客户端类来测试该类中的所有方法Course。我相信我已经完成了课程课程,但在编写客户端时遇到了麻烦。对于我尝试的所有操作,我都会收到错误“无法从静态上下文引用的非静态变量”。我究竟做错了什么?

好的,我已经重写了我的代码。我仍然不确定如何让 mutator 方法工作,也不确定如何要求用户输入以设置新课程的所有值,然后在使用 accessor 和 mutator 方法时将它们输出到屏幕。请帮帮我。谢谢

public class ManualClass 
{
public static void main(String[] args) 
{
    Course compSci = new Test2().new Course("Comp Sci","IT1101",3.0);
    System.out.println(compSci+ "\n");


    Course dave = new Test2().new Course("Hist1111","World History",4.0);     
    System.out.print(dave.getCourseCode() + " " + dave.getDescription() 
                + " " + dave.getCreditHours() + "\n");
}

public class Course 
{
//Instance Variables
private String courseCode;
private String description;    
private Double creditHours;

public Course() 
{
    courseCode = null;
    creditHours = 0.0;
    description = null;
}

//Constructor
public Course(String courseCode, String description, double creditHours) 
{    
    this.courseCode = courseCode; 
    this.description = description;
    this.creditHours = creditHours;
}

//Accessors (Getters)
public String getCourseCode() 
{
    return courseCode;
}

public String getDescription()
{
    return description;
}

public double getCreditHours()
{
    return creditHours;
}

//Mutators (Setters)
public void setCourseCode(String CourseCode)
{
 this.courseCode = courseCode;
}

public void setDescription(String description)
{
 this.description = description;
}

public void setCreditHours(double creditHours)
{
 this.creditHours = creditHours;
}

    // toString Method
    public String toString()
    {
        DecimalFormat creditsFormat = new DecimalFormat ("#0.0");

        return "Code: " + courseCode + "; Description: " 
               + description + "; creditHours: " 
               + creditsFormat.format(creditHours);
    }

    // Equals Method
    public boolean equals(Object o)
    {
        if (!(o instanceof Course))
            return false;

        else
        {
            Course objCourse = (Course) o;
            if (courseCode.equals(objCourse.courseCode)
                && description == objCourse.description
                && creditHours == objCourse.creditHours)

                return true;

            else
                return false;
        }
    }
}
}
4

2 回答 2

1

作为Course一个非static 内部类,您需要Course使用以下实例创建一个合格的实例Manual_Class

Course csi = new Manual_Class().new Course("CSI", "Comp Sci", 3.0);

或者,您可以将类声明Course移出顶级类的范围Manual_Class。在这种情况下,您可以使用当前的语法。

此外,每个文件只能有一个public类声明,它应该是您的顶级类。Course您可以从类声明中删除该关键字。

于 2013-01-17T17:55:49.370 回答
0

你正在写的是一个经典的男生程序语言代码。不是面向对象的。让我解释一下这个说法背后的原因。

写oop代码时,需要考虑“变化”。您将来创建的每门课程都不会具有相同的属性。

例如,我将分享我认为您的要求是什么样的。每门课程都将经历一个阶段性的成熟周期。有些课程只需要足够的描述,你就会停在那里。有些课程会有与之相关的书籍和一些超链接。有些课程会有图像,有些课程会有与之相关的视频文件。有些已经非常成熟,他们需要完整的课程管理、辅导、招生、学生入学管理、学生成绩管理,最后是学生证书和奖励。

如果您像学生一样思考,您将创建 1 个具有所有这些属性的类,并且您将拥有所有不需要的字段的空值。

如果您像成熟的学生一样思考,您可能会创建多个类,例如 CourseLinksOnly、CourseImagesOnly、CourseImagesAndVideos、CourseVideosOnly。

如果您像架构师一样思考,您将使用现实世界中面向业务的名称和功能来建模您的课程。CourseBasic、CourseOnline、CourseClassroom、CourseStarted、CourseCompleted、CourseArchived。这些中的每一个都可能会相互继承。但与此同时,您的代码的其余部分不会引用对象,而是会引用接口(合同)。我可以继续......

我的建议是,非常非常快地将你的学习提升到一个新的水平。完全像建筑师一样思考。一本开始学习的好书是Head First Design Patterns Java。前 3 章足以让你头脑清醒,摆脱程序语言的思维方式:)。

于 2013-01-18T03:11:08.937 回答