0

我有兴趣了解当可能需要在其中引用不同的子类时,如何使用单个 printf 语句或 @Override toString() 方法来提供准确的信息。

这是设置的示例程序:

class Animal - String name - int age class Bird extends Animal - private int feathers - Animal animalObj //引用动物对象 vars class Monkey extends Animal - private int weight - Animal animalObj //引用动物对象 vars class Tree - int heightInFeet - Animal animalInTree //引用实例化的动物对象

类树有一个“布尔 inTree()”方法,如果为真则意味着动物在树中类树还有 2 个方法... public Animal nowInTree() public Animal hasLeftTree()

这些方法中的每一个都需要一个 println 或 printf 语句来列出动物的特征……这是关键,Bird 类有一个参数 int feathers ,而 Monkey 类有一个参数 double weight。

我对名为 Tree 类的控制台的输出应该等于......“这只名叫 Falcon 的鸟 3 岁,有 912 根羽毛,已经离开了树。”

然后使用相同的方法或者甚至相同的 printf 语句也可以打印到控制台......“这只名叫 Bubba 的猴子 9 岁,体重 22.5 磅,它的体重已经离开了树。”

可能的 printf 语句(假设创建了超类和子类方法 - 尽管这是不完整的 =

System.out.printf("%d 岁 $s 的动物 %s 离开了树", animalInTree.getAnimalName(), animalObj.getAge(), wtfGoesHere.callMeth(), );

好的,请注意,我需要从 wtfGoesHere() 方法所代表的每个子类中获取 var。wtfGoesHere() 不仅要返回 var 重量或羽毛,还要返回附加的额外信息……所以不仅是重量,而且“它的重量是 %d”。

重量和羽毛变量必须是私有的。虽然如果publis会解决它吗?如果是,那仍然是有风险的编码吗?我仍然是个业余爱好者,但有时在私下工作会让我感到很不舒服。

我很困惑,因为编译器目前确实知道 Animal 类中的信息,但不知道 Monkey 和 Bird 的子类。我可以为子类中的信息创建一个 getBlaBla(),但无法弄清楚如何告诉 java 何时使用哪个。

可能的想法...

  1. 进行异常处理并在 printf 方法中添加一个额外的参数,当它到达该字段时,它将使用它可以使用的一个并在另一个上抛出异常......如果可能的话,我还不知道异常,我在高级java 课,还有一个月的时间。作业“暗示”它不允许异常处理。(虽然我很好奇这是否可行)

  2. 创建某种级联“if else”,然后确定需要哪个子类。仍然存在问题,因为我限制制作的方法不包括传递子类对象......只接受 Animal 类作为对象参数在 Tree 类中传递。

  3. 使用 Tree 类的 toString() 覆盖方法来处理这个......尽管我仍然遇到上面的#2。

  4. 我们了解了抽象类和“实现”函数——所以如果这可以解决我的问题,我也对此持开放态度……只要 hasLeftTree() 方法可以处理这两种子类的可能性。如果我没有明确说明 hasLeftTree() 方法确实会专门调用一个打印语句,提供有关子类的所有信息,包括其动物扩展信息。

我提到上述内容是为了表明我已经对此进行了一些思考,而不仅仅是抱怨手握。此外,尽管有上述限制,我的老师...有时...宣布他希望我们找到课堂上没有特别提到的功能...所以...如果您相信适当的行业公认标准需要不按指示进行我会和我的教授争论这一点。

如果需要,我会提供更多代码。Everyting else 在由 4 个文件组成的程序中工作...... 3 个类和主方法文件。

想法?和 TYVM 提前码神。

4

1 回答 1

0

我通过以下理解解决了这个问题:当返回超类的 toString 方法时,通过多态性 java 将查看子类以查看是否存在 toString 方法的“更好的版本”......因为我的对象是子类对象时我将超类称为 toString,它会看到子类对象,然后查看子类以查看是否存在相同的方法……在本例中为“toString”,当它找到它时,它会使用该方法。通过这样做,所有适当的信息都返回到打印语句等。

于 2012-10-31T18:54:16.913 回答