public class monstertestdrive {
public static void main(String[] args) {
monster[] ma=new monster[3];
ma[0]=new vampier();
ma[1]=new monster();
ma[2]=new dragon();
for(int x=0;x<3;x++){
ma[x].frighten(x);
}
}
}
class monster{
boolean frighten(int d){
System.out.println("arrah");
return false;
}
}
class vampier extends monster{
boolean frighten(int x){
System.out.println("a bite?");
return true;
}
}
class dragon extends monster{
boolean frighten(int degree){
System.out.println("breath fire");
return true;
}
}
吓唬方法中提到的返回类型是否可用于任何目的? 我问这个是因为我互换了返回类型,但输出相同。但是当我改变数组对象的位置,即0,1和2时,我得到了不同的输出。
答案 0 :(得分:1)
布尔返回和整数参数对输出没有影响,因为这些方法不使用它们。您永远不会使用任何方法的返回值来设置任何变量或确定输出。您也永远不会使用任何传入的值来更改方法中的任何内容或方法的输出。您可能希望首先阅读有关返回类型,方法和参数的更多信息;它的基本知识是,除非你打算使用参数或返回值,否则没有理由。一旦你明白我们可以继续讨论为什么数组的每个元素输出一个不同版本的吓唬。
您可能想先了解具体和抽象类,多态和继承。
您正在查看的是动态(或延迟)方法绑定的实例。
您的父级CONCRETE类(monster)具有frighten()的具体实现:
boolean frighten(int d){
System.out.println("arrah");
return false;
}
这个frighten的实现是用布尔返回类型和整数参数编写的。扩展此类时,子类继承此方法。说我创造了另一个儿童类狼人:
class werewolf extends monster{}
乍一看,这个班级没有与之相关的方法或属性;但实际上,由于类继承,它隐式地在其父类中声明了frightened方法。这就是编译器所看到的:
class werewolf extends monster{
boolean frighten(int d){ // Method **from** the parent class
//This is implicitly built into the subclass due to inheritance
System.out.println("arrah");
return false;
}
}
然而,这些方法不一成不变。在子类中,可以覆盖父类方法。这是你在你的吸血鬼和龙子类中所做的。这是覆盖,因为您的方法具有相同的返回类型,相同的方法名称和相同的参数。如果您要更改任何这些内容,那么它将完全是一种不同的方法,并且不会覆盖父方法;你应养成使用@Override指令的习惯,该指令告诉编译器检查并确保你实际上遵循正确的覆盖格式。
class dragon extends monster{
@Override // This tells the compiler to check the parent for this method you are going to override and if you've followed the right format
boolean frighten(int degree){
System.out.println("breath fire");
return true;
}
}
动态/后期方法绑定是程序在运行时解析对各自类实现的引用的能力。
所有子类都是它们扩展的超类的实例,因此当您创建对超类类型的引用数组时,可以使用子类填充它们(这里有一点自我宣传:Why can an array of references to an interface house classes that implement that interface?)。
这是因为子类与其父类具有ISA关系。但是,当您执行main方法时:
for(int x=0;x<3;x++){
ma[x].frighten(x);
}
您还没有明确告诉编译器,我如何选择使用哪个版本的frighten()?那就是多态性的好处 - 你不必。当代码执行时,它足够聪明地查看引用指向的实际类,如果方法被正确覆盖,比如HEY,这个方法有一个不同的本地实现,让我们执行那一个而不是它的父类中的一个。但是,如果以任何方式更改子类中的frighten()方法的返回值或参数,它将变为不覆盖,并且执行的方法将默认为引用的类型(在这种情况下是怪物类,因为你的参考数组是怪物之一)。
所以这不是boolean如何工作的问题,而是如何正确使用重写方法的问题。希望这能帮到你!
答案 1 :(得分:0)
是的,返回类型很重要。 boolean
返回类型返回true
或false
。您还可以创建int
返回类型并返回一个数字。这对许多事情都很方便
例如:
int sum(int x, int y)
{
return x + y;
}
您没有注意到差异,因为您没有使用返回值
做任何事情ma[x].frighten(x);
如果你的函数没有任何意义可以返回,那么你可能会返回类型void
并且根本不返回任何内容
void frighten(int degree){
System.out.println("breath fire");
}
答案 2 :(得分:0)
我打赌在Monster的吓唬方法中改变返回类型(即从布尔到int然后返回值从false到0)来试验不同的多态情况......然后得到不同的输出