![](/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.