繁体   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