我感兴趣的是,当有可能需要在其中引用的不同子类时,如何使用单个printf语句或@Override toString()方法来提供准确的信息。
以下是示例程序设置:
class Animal - String name - int age class Bird extends Animal - private int feathers - Animal animalObj //引用动物对象变种 class Monkey extends Animal - private int weight - Animal animalObj //引用动物对象变量 class Tree - int heightInFeet - Animal animalInTree //引用实例化的动物对象
类树有一个“boolean inTree()”方法,如果为true则表示动物在树中 class tree还有2种方法...... public Animal nowInTree() public Animal hasLeftTree()
这些方法中的每一个都需要一个println或printf语句来列出动物的charastics ...这里是捕获,Bird类有一个param int羽毛而Monkey类有一个param双重。
我的输出到控制台,叫做Tree类,应该等于......“这只名为Falcon的鸟,3岁,912羽,已经离开了树。”
然后使用SAME方法或者甚至相同的printf语句也可以打印到控制台......“名为Bubba的猴子,9岁22.5磅,它的重量已经离开了树。”
可能的printf语句(假设创建了超级和子类方法 - 尽管这是不完整的=
System.out.printf(“名为%s的动物是%d岁的$ s已离开树”,animalInTree.getAnimalName(),animalObj.getAge(),wtfGoesHere.callMeth(),); < / p>
请注意,我需要从wtfGoesHere()方法所代表的每个子类中获取var。 wtfGoesHere()不仅要返回var weight或者羽毛,还要附加额外的信息......所以不仅仅是重量,而是“它的重量是%d”。
Weight和Feathers var必须是私密的。虽然publis会解决它吗?如果是的话,这仍然是有风险的编码吗?我仍然是一个不成熟的人,但有时在私处工作正在惹我的屁股。
我很困惑,因为编译器目前知道Animal类中的信息,但不知道Monkey和Bird的子类。我可以为子类中的info创建一个getBlaBla(),但是无法弄清楚如何告诉java在哪个时候使用它。
可能的想法......
进行异常处理并在printf方法中添加一个额外的参数,当它到达该字段时,它将使用它可以使用的那个并在另一个上抛出异常...如果可能的话我不知道expcetions然而,我是高级java课程,那是一个月之后。作业“暗示”它不允许异常处理。 (虽然我很好奇这是否有效)
创建某种级联的“if else”,它将确定需要哪个子类。仍然有问题,因为我限制的方法不包括传递子类对象...只接受Animal类作为传递给Tree类内部的对象参数。
使用Tree类toString()overide方法来处理这个问题......虽然我仍然反对上面的#2。
我们学习了absract类和“implements”函数 - 所以我对此也是开放的,如果这可以解决我的问题......只要hasLeftTree()方法可以处理两个子类的可能性。如果我没有具体说明,hasLeftTree()方法会专门调用print语句,给出teh子类的所有信息,包括动物扩展信息。
我提到了上面的内容,试图表明我已经考虑过这一点而不仅仅是抱怨。此外,尽管有上述限制,我的老师......偶尔......宣称他希望我们找到课堂上没有特别提到的功能......所以...如果你相信适当的行业认可的标准要求取消指令我会向我的教授辩论。
如果需要,我会提供更多代码。其他所有程序都在由4个文件组成的程序中运行... 3个类和主方法文件。
思考?和TYVM预先代码众神。
答案 0 :(得分:0)
我通过以下理解解决了这个问题:当返回超类java的toString方法时,通过多态性会向子类查看是否存在更好的版本&#34; toString方法...因为我的对象是一个子类对象,当我调用超类toString时,它会看到子类对象然后查找子类以查看是否有相同的方法...在这种情况下&#34; toString& #34;当它找到它时,它会使用该方法代替。通过这样做,所有适当的信息都返回到打印语句等。