【问题标题】:Why child class method is printing null ? What am i doing wrong?为什么子类方法打印 null ?我究竟做错了什么?
【发布时间】:2019-10-06 07:55:52
【问题描述】:

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

父类:

class Language{
  protected String name;
  protected int numSpeakers;
  protected String regionsSpoken;
  protected String wordOrder;

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

  public 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 {
  protected String name;
  protected int numSpeakers;

  Mayan(String languageName,int speakers ){
    super(languageName,speakers,"Central America","verb-object-subject");
  }

  @Override
  public void getInfo() {
    System.out.println(name+" is spoken by "+numSpeakers+" people mainly in Central America.");
    System.out.println("The language follows the word order: verb-object-subject");
    System.out.println("Fun fact: "+name+" is an ergative language.");
  }
}

我查看了代码并尝试通过更改来解决它,但似乎没有任何效果,我陷入了我在代码中没有看到的错误中。

预期是: Ki'che' 主要在中美洲有 2330000 人使用。 语言遵循词序:动词-宾语-主语 有趣的事实:Ki'che 是一种作格语言。

实际是: null 主要在中美洲由 0 人使用。 语言遵循词序:动词-宾语-主语 有趣的事实:null 是一种作格语言。

【问题讨论】:

    标签: java inheritance polymorphism core


    【解决方案1】:

    Mayan 你有字段

    protected String name;
    protected int numSpeakers;
    

    删除这些将解决您的问题。发生此问题的原因是,当您定义上面的两行时,您将隐藏 Language 中的两个字段,并且您必须访问 Language 中的字段,例如 super.namesuper.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

    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();
        }
    }
    

    Mayan.java

    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.");
        }
    }
    

    【讨论】:

    • 我会进一步说,Language 中的字段应该设为私有并给予 getter。
    • @Gavin 你是对的,你可以根据 OP 计划如何在他们的项目中使用代码来进一步限制访问修饰符
    • @HimanshuKandpal 我很高兴能提供帮助。如果您觉得这解决了您的问题,您是否可以打勾让其他人知道问题已解决。我很感激
    • @Dan 完全同意,我们只有上面的 sn-p 继续,而不是代码的全部意图:)
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2016-07-18
    • 2019-12-23
    • 1970-01-01
    • 2019-01-28
    • 2014-06-15
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多