簡體   English   中英

Abstract Class和toString()方法

[英]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);
}

派生類有自己的typeHomeworkpagesRead字段,這些字段從未設置(即使基類碰巧具有相同名稱的字段)。 因此,它們保持null0

您應該通過公共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(而不是pagesReadsetPagesToRead(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM