我对如何设置TestHomework方法有点困惑,以便在使用toString()方法时正确打印。现在,当我运行main方法时,它打印“null - 0”,但我想说的是“Math - 6”。该程序应该扩展一个抽象类。应该说有多少页用于家庭作业和主题。
public abstract class Homework {
private int pagesToRead;
private String typeHomework;
{
// initialise instance variables
pagesToRead = 0;
typeHomework = "none";
}
public Homework(int pages, String hw) {
this.pagesToRead = pages;
this.typeHomework = hw;
}
public abstract void createAssignment(int p);
public int getPages() {
return pagesToRead;
}
public void setPagesToRead(int p) {
pagesToRead = p;
}
public String getTypeHomework() {
return typeHomework;
}
public void setTypeHomework(String hw) {
typeHomework = hw;
}
}
public class MyMath extends Homework {
private int pagesRead;
private String typeHomework;
public MyMath(int pages, String hw) {
super(pages,hw);
}
public void createAssignment(int p) {
setTypeHomework("Math");
setPagesToRead(p);
}
public String toString() {
return typeHomework + " - " + pagesRead;
}
}
public class TestHomework {
public static void main(String[] args) {
MyMath one = new MyMath(6, "Math");
one.createAssignment(6);
System.out.println(one);
}
}
答案 0 :(得分:5)
那是因为你定义了2个属性(其中一个属性恰好与一个抽象类的名称相同)但是你没有初始化它们,你正在初始化抽象类的属性。 (因此,它们的值始终设置为其类型的默认值)
你需要放弃MyMath
类,&在抽象类中定义toString
方法:它是默认由其继承类使用的方法。
public abstract class Homework {
private int pagesToRead;
private String typeHomework;
// Same code
// Define the toString here
@Override
public String toString() {
return typeHomework + " - " + pagesToRead;
}
}
public class MyMath extends Homework {
// You don't need to define any extra attributes
public MyMath(int pages, String hw) {
super(pages,hw);
}
public void createAssignment(int p) {
setTypeHomework("Math");
setPagesToRead(p);
}
}
public static void main(String[] args) {
// Calls the constructor of the MyMath class, which in turn
// invokes the constructor of its superclass, the 'Homework' class
MyMath one = new MyMath(6, "Math");
one.createAssignment(6);
// Invokes the toString of the MyMath class. Since it does not have one,
// The toString method of its superclass (Homework) is called.
System.out.println(one);
}
答案 1 :(得分:4)
您的派生类有自己的typeHomework
和pagesRead
字段,这些字段从未设置(即使基类恰好具有相同名称的字段)。因此,他们会留下null
和0
。
您应该删除这些字段,并通过公共getter方法使用基类中的数据。
答案 2 :(得分:0)
小心您重新声明了您父类的属性typeHomework
。属性会自动添加到扩展类中,因此您无需再次编写它们
通过重新声明它,您混淆了编译器,在调试节目中查看代码,您的one
对象包含typeHomework
两次:
typeHomework = null // The one from the super class
typeHomework = "Math" // The one from your child class
您的方法现在使用超类中的typeHomework
,因此输出为空!
pagesRead
为0,因为您在调用pagesToRead
时将超类的pagesRead
设置为6(不是setPagesToRead(p);
!)。
重写这样的方法时使用@Override
注释:
@Override
public void createAssignment(int p) {
setTypeHomework("Math");
setPagesToRead(p);
}
这不是真的需要,但这是一个很好的做法(你的代码的读者知道它覆盖了某些东西)。
在引用类的属性时,使用this
语句也是一种好习惯,因此很明显,您指的是属性而不是局部变量:
@Override
public String toString() {
return this.typeHomework + " - " + this.pagesRead;
}