我的System.out.println();保持打印null而不是它应该打印的文本

时间:2017-03-23 19:19:58

标签: java abstract-class subclass

我刚刚开始使用Java,现在我正忙于抽象类。我已经忙了两天这段代码,我找不到如何解决这个问题。方法名称可能不是英文,对不起,但我认为这不会是一个大问题。 我不知道为什么输出如下: null null null null null null null null null null null null null null null null

我希望你们能帮助我。我将不胜感激任何帮助!提前谢谢。

主类,也是抽象的:

public abstract class Boek {
public String isbn;
public String auteur;
public String paginas;
public String titel;

public abstract void setIsbn(String isbn);
public abstract void getIsbn(); 
public abstract void setAuteur(String auteur);
public abstract void getAuteur();
public abstract void setPaginas(int paginas);
public abstract void getPaginas();
public abstract void setTitel(String titel);
public abstract void getTitel();

public static void main(String[] args) {
    Studieboek  sb = new Studieboek();
    Roman       ro = new Roman();
    Dichtbundel db = new Dichtbundel();

    sb.setAuteur("J.K. Rowling");
    sb.setIsbn("547896587412");
    sb.setPaginas(251);
    sb.setTitel("Harry Potter");
    sb.addNAuteur("R.K. Dale");
    sb.addOndertitel("Exactly");
    sb.printSB();

    ro.setAuteur("Suzanne Vermeer");
    ro.setIsbn("9632589632574");
    ro.setPaginas(311);
    ro.setTitel("De Zwarte Piste");
    ro.printRO();

    db.setAuteur("A.Y. Lmao");
    db.setIsbn("5781236985478");
    db.setPaginas(171);
    db.setTitel("Rijmen kreng");
db.addGedicht("Rijmpje");
    db.printDB();
}
}

第一个子类:

public class Studieboek extends Boek {  
private String ondertitel;
private String nAuteur;

@Override
public void setIsbn(String isbn) {

}

@Override
public void getIsbn() {

}

@Override
public void setAuteur(String auteur) {

}

@Override
public void getAuteur() {

}

@Override
public void setPaginas(int paginas) {

}

@Override
public void getPaginas() {

}

@Override
public void setTitel(String titel) {

}

@Override
public void getTitel() {

}

public void printSB() {
    System.out.println(titel + " " + auteur + " " + paginas + " " + isbn + " " + ondertitel + " " + nAuteur);
}

public void addOndertitel(String ondertitel) {

}

public void addNAuteur(String nAuteur) {

}

此后我还有两个子类,但我不认为代码有必要工作,因为其他两个子类中的代码完全相同,并给出完全相同的输出。

再次,任何帮助表示赞赏。提前谢谢。

此致,

3 个答案:

答案 0 :(得分:2)

你的制定者没有做任何事情。

实施例如的正确方法你的isbn的setter将是:

@Override
public void setIsbn(String isbn) {
    this.isbn = isbn;
}

请注意实际设置的部分。

你的傻瓜同样错了。 getter应该返回某些东西,即不要声明为void并且有return语句:

@Override
public String getIsbn() {
    return this.isbn;
}
  

我知道它们应该包含一个返回值,但是返回值会给出一个错误,每当我把它留空时它看起来很好。   (来自评论)

我猜这个错误就是"一个void方法不能返回任何东西"是的,它会没事 - 除非你尝试像

这样的东西
System.out.println(sb.getIsbn()); // Will also print "null"

我会把剩下的留给你。

奖励1:如果你有一个抽象的父类,你可以将常见的getter和setter移动到Boek,而不是仅仅将它们声明为abstract。这将使您不必再次在每个子类中重新实现它们。

Bonus 2:public字段(如public String isbn;)通常不鼓励。您已经拥有了getter和setter,因此请将它们protected(另请参阅:encapsulation)。

奖金3:正如Mike' Pomax'已经指出的那样。评论中的Kamermans:您不希望在main课程中使用Boek方法。创建一个单独的"应用程序"仅使用main方法启动应用程序的类。

奖励4:我相信您希望使用printSBprintROprintDB方法实现的标准方式是覆盖toString()方法。虽然这可能与您的特殊用例不同。

使用如下:

public class Studieboek extends Boek {
    ...

    @Override
    public String toString() {
        return this.isbn + " " + this.auteur; // Plus the others
    }
}

// No need to call an additional method, toString will be invoked automatically
System.out.println(db);

答案 1 :(得分:0)

您的set和get方法为空。您需要在dict中设置一个值,然后返回setters中的值。

现在你正在尝试打印一个尚未设置的变量 - 所以是的,它将打印getters

null

答案 2 :(得分:0)

您正在打印未设置其值的变量。您已在setter方法中设置变量值以便打印值。 Setter方法设置值。并使用getter方法返回值。

@Override
public void setTitel(String titel) {
     this.titel=titel;
}

@Override
public String getTitel() {
   return titel;
}