Java 为什么子类方法打印为null?我做错了什么?

Java 为什么子类方法打印为null?我做错了什么?,java,inheritance,polymorphism,core,Java,Inheritance,Polymorphism,Core,任何提示为什么我的代码将null作为输出值而不是传递的参数。请引导我通过代码 父类: 儿童班: 我已经研究了代码,并试图通过修改来解决它,但似乎没有任何效果,我陷入了代码中没有看到的错误中 预计: 基切语主要在中美洲有2330000人说。 语言遵循语序:动宾主语 有趣的事实:基切是一种作格语言 实际情况是: null主要由中美洲的0人说。 语言遵循语序:动宾主语 有趣的事实:null是一种作格语言。在玛雅语中,你有字段 protected String name; protected int n

任何提示为什么我的代码将null作为输出值而不是传递的参数。请引导我通过代码

父类:

儿童班:

我已经研究了代码,并试图通过修改来解决它,但似乎没有任何效果,我陷入了代码中没有看到的错误中

预计: 基切语主要在中美洲有2330000人说。 语言遵循语序:动宾主语 有趣的事实:基切是一种作格语言

实际情况是: null主要由中美洲的0人说。 语言遵循语序:动宾主语 有趣的事实:null是一种作格语言。

在玛雅语中,你有字段

protected String name;
protected int numSpeakers;
删除这些将解决您的问题。发生此问题的原因是,当您定义上面的两行时,您对语言隐藏了这两个字段,并且您必须从语言(如super.name、super.numSpeakers等)访问这些字段

你可能想要的是下面这样的东西

public class Mayan extends Language {
    private static final String REGION = "Central America";
    private static final String WORD_ORDER = "verb-object-subject";

    public Mayan(String languageName, int speakers) {
        super(languageName, speakers, REGION, WORD_ORDER);
    }

    @Override
    public void getInfo() {
        super.getInfo();
        System.out.println("Fun fact: " + name + " is an ergative language.");
    }
}
正如Gavin指出的,访问修饰符可以被限制。如果您在程序的单个包中工作,那么最终可能会遇到以下情况

Language.java

Mayan.java


我会更进一步说,语言中的字段应该是私有的,并提供getter。@Gavin你是对的,你可以进一步限制访问修饰符,这取决于OP计划如何在其应用程序中使用代码project@HimanshuKandpal我很高兴能帮上忙。如果你觉得这已经解决了你的问题,你能打勾让别人知道问题已经解决了吗。我很感激it@Dan完全同意,我们只有上面的代码片段,而不是代码的全部意图:
protected String name;
protected int numSpeakers;
public class Mayan extends Language {
    private static final String REGION = "Central America";
    private static final String WORD_ORDER = "verb-object-subject";

    public Mayan(String languageName, int speakers) {
        super(languageName, speakers, REGION, WORD_ORDER);
    }

    @Override
    public void getInfo() {
        super.getInfo();
        System.out.println("Fun fact: " + name + " is an ergative language.");
    }
}
class Language {
    String name;
    private int numSpeakers;
    private String regionsSpoken;
    private String wordOrder;

    Language(String getName, int getNumSpeakers, String getRegionsSpoken, String getWordOrder) {
        this.name = getName;
        this.numSpeakers = getNumSpeakers;
        this.regionsSpoken = getRegionsSpoken;
        this.wordOrder = getWordOrder;
    }

    void getInfo() {
        System.out.println(name + " is spoken by " + numSpeakers + "  people mainly in " + regionsSpoken);
        System.out.println("The language follows the word order: " + wordOrder);
    }

    public static void main(String[] args) {
        Mayan mayanLanguage = new Mayan("Ki'che'",30000);
        mayanLanguage.getInfo();
    }
}
class Mayan extends Language {
    private static final String REGION = "Central America";
    private static final String WORD_ORDER = "verb-object-subject";

    Mayan(String languageName, int speakers) {
        super(languageName, speakers, REGION, WORD_ORDER);
    }

    @Override
    void getInfo() {
        super.getInfo();
        System.out.println("Fun fact: " + name + " is an ergative language.");
    }
}