协助Java对象结构

时间:2013-01-17 17:50:50

标签: java class accessor mutators

我必须写一个封装课程的课程。假设课程具有三个属性:代码名称,描述和学分数。我必须包含构造函数,访问器和更改器以及方法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;
        }
    }
}
}

2 个答案:

答案 0 :(得分:1)

由于Course是非static 内部类,您需要使用Course的实例创建Manual_Class的限定实例:

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

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

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

答案 1 :(得分:0)

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

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

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

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

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

如果您像建筑师一样思考,您将使用真实的商业导向名称和功能为您的课程建模。 CourseBasic,CourseOnline,CourseClassroom,CourseStarted,CourseCompleted,CourseArchived。而且每一个都可能会相互继承。但与此同时,代码的剩余部分不会引用对象,而是引用接口(契约)。我可以继续......

我的建议是,将你的学习提升到一个新的水平。完全像建筑师一样思考。一本开始学习的好书是Head First Design Patterns Java。前3章足以让你的思绪直接超出程序语言的思维方式:)。