我必须写一个封装课程的课程。假设课程具有三个属性:代码名称,描述和学分数。我必须包含构造函数,访问器和更改器以及方法toString
和equals
。
作为此任务的一部分,我必须编写一个客户端类来测试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;
}
}
}
}
答案 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章足以让你的思绪直接超出程序语言的思维方式:)。