Abstract Class和toString()方法

时间:2016-02-14 15:27:10

标签: java abstract tostring

我对如何设置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);
    }

}

3 个答案:

答案 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)

您的派生类有自己的typeHomeworkpagesRead字段,这些字段从未设置(即使基类恰好具有相同名称的字段)。因此,他们会留下null0

您应该删除这些字段,并通过公共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;
}