【问题标题】:How to correctly configure multiple constructors?如何正确配置多个构造函数?
【发布时间】:2016-11-28 06:00:46
【问题描述】:

我正在做一个基于继承的分配,我创建了 2 个构造函数,它们应该做不同的事情。一个构造函数没有任何参数并且应该产生一个预定义的值,另一个构造函数有 2 个参数,这些参数由 String 和 int 类型的名称和年龄组成。我以某种方式重新配置了两个构造函数,以使它们都不会产生它们应有的结果。以下是调用这些构造函数的类:

动物(超类)

abstract public class Animal implements Comparable<Animal>
{
    int age;
    String name;

    Animal(String name, int age)   
    {
        this.age = age;
        this.name = name;
    } 

    Animal()
    {   
         this("newborn", 0);
    }        

    public int getAge()
    {
         return age;
    }

    public void setName(String newName)
    {
        name = newName;
    }

    String getName()
    {
        return name;
    }
}

食肉动物

public class Carnivore extends Animal
{
    Carnivore(String name, int age)   
    {
        this.age = age;
        this.name = name;
    }

    Carnivore()
    {
        super();
    }

    @Override
    public int compareTo(Animal o)
    {
        //To change body of generated methods, choose Tools | Templates.
        throw new UnsupportedOperationException("Not supported yet."); 
    }
}

public class Wolf extends Carnivore
{
    String name;
    int age;

    Wolf(String name, int age)   
    {  
        this.name = name;
        this.age = age;
    }

    Wolf()
    {
        super();
    }   

    String getName()
    {
        return name;
    }
}

主要方法

System.out.println("************1st constructor of Wolf************");
Wolf wolfExample = new Wolf("Bob", 2) {};        
System.out.println("Name = " + wolfExample.getName());
System.out.println("Age = " + wolfExample.getAge());

System.out.println("************2nd constructor of Wolf************");    
Wolf newWolf = new Wolf();
System.out.println("Name = " + newWolf.getName());
System.out.println("Age = " + newWolf.getAge());

实际输出

************1st constructor of Wolf************
Name = Bob
Age = 0
************2nd constructor of Wolf************
Name = null
Age = 0

预期输出

************1st constructor of Wolf************
Name = Bob
Age = 2
************2nd constructor of Wolf************
Name = newborn
Age = 0

年龄正在返回它们的默认值,第二个构造函数的名称也返回 null,但我不太清楚为什么。这是我第一次使用多个构造函数,所以我对它的工作原理有点困惑,所以非常感谢任何帮助,谢谢。

【问题讨论】:

标签: java multiple-inheritance multiple-constructors


【解决方案1】:

您的基类似乎正确,但您需要更改您的实现。

您的 WolfCarnivore 构造函数应该是:

Wolf(String name, int age)   
{
    super(name, age);
}

原因是,您正在为每种类型设置 local 实例变量,但调用超类的 getAge() 方法 - 这是获取超类的值 age,其值没有实际上被分配到任何地方,并被赋予默认值 0name 也是如此,默认为 null

您需要使用传递的变量调用super,并且不需要为每个扩展对象重新定义它们。

【讨论】:

  • ahahah,我只是在重读 everything 以了解为什么它不会根据您的最后评论 ;) 很高兴听到它,快乐的编码!请务必支持/接受有用的答案:)
  • 知道你不需要重写_Wolf_either中的getName,在这个对象上调用它会使用基类中定义的方法/变量值。
  • 是的,当我再次上那门课时,我意识到了同样的事情,只是删除了那个方法 xD 感谢您的帮助,我投票赞成并选择您作为最佳答案。
  • @Matt Clark Wolf 继承 Animal 那么它应该有自己的 getAge 方法 虽然它没有覆盖这个方法,但是那么为什么 wolf.getAge 返回 Animal 的年龄,我想不通。如果我删除了 Wolf 中的字段变量 agename ,那么 Wolf 继承了 Animal 的字段 它将输出OP 期望的结果,也许当继承归档时父和子的归档变量是相同的内存?你能给我一些解释或相关链接吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2014-07-03
  • 2016-12-13
  • 2023-03-17
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多