![](/img/trans.png)
[英]Class that is extended from an abstract class toString method doesn't work :/
[英]Abstract Class and toString() method
我对如何设置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);
}
}
那是因为你定义了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);
}
派生类有自己的typeHomework
和pagesRead
字段,这些字段从未设置(即使基类碰巧具有相同名称的字段)。 因此,它们保持null
和0
。
您应该通过公共getter方法删除这些字段并使用基类中的数据。
小心你重新声明属性typeHomework
你的父类。 属性会自动添加到扩展类中,因此您无需再次编写它们。
通过重新声明它,你混淆了编译器,在调试节目中查看你的代码,你的one
对象包含你的typeHomework
两次:
typeHomework = null // The one from the super class
typeHomework = "Math" // The one from your child class
你的方法现在使用你的超类中的typeHomework
,因此输出为null!
pagesRead
为0,因为在调用setPagesToRead(p);
时,您将超类的pagesToRead
设置为6(而不是pagesRead
! setPagesToRead(p);
。
重写这样的方法时使用@Override
注释:
@Override
public void createAssignment(int p) {
setTypeHomework("Math");
setPagesToRead(p);
}
它并不是真正需要的,但它是很好的做法(你的代码的读者知道它覆盖了某些东西)。
在引用类的属性时,使用this
语句也是一种好习惯,因此很明显,您指的是属性而不是局部变量:
@Override
public String toString() {
return this.typeHomework + " - " + this.pagesRead;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.