Head First Java练习题咨询:frighten方法参数与返回值对输出的影响疑问
嘿,我来帮你拆解这个Head First Java的练习题问题!你困惑的核心其实是Java里的**方法重写(Override)和方法重载(Overload)**的区别,还有多态的运行逻辑,咱们一步步理清楚。
首先先把题目里的代码框架贴出来:
public class MonsterTestDrive { public static void main(String [] args) { Monster [] ma = new Monster[3]; ma[0] = new Vampire(); ma[1] = new Dragon(); ma[2] = new Monster(); for(int x = 0; x < 3; x++) { ma[x].frighten(x); } } } class Monster { // A 部分的方法在这里 } class Vampire extends Monster { // B 部分的方法在这里 } class Dragon extends Monster { boolean frighten(int degree) { System.out.println("breath fire"); return true; } }
题目要求:从下面4组A-B方法对中,选出能让代码编译通过,并且运行时产生对应输出的组合。
选项列表
- 选项1
// A(Monster类的方法) boolean frighten(int d) { System.out.println("arrrgh"); return true; } // B(Vampire类的方法) boolean frighten(int x) { System.out.println("a bite?"); return false; } - 选项2
// A boolean frighten(int x) { System.out.println("arrrgh"); return true; } // B int frighten(int f) { System.out.println("a bite?"); return 1; } - 选项3
// A boolean frighten(int x) { System.out.println("arrrgh"); return false; } // B boolean scare(int x) { System.out.println("a bite?"); return true; } - 选项4
// A boolean frighten(int z) { System.out.println("arrrgh"); return true; } // B boolean frighten(byte b) { System.out.println("a bite?"); return true; }
逐个选项分析
选项1:正确选项!
这里Vampire类的frighten(int x)完全符合方法重写的规则:和父类Monster的frighten(int d)方法名相同、参数列表都是int类型、返回值都是boolean。
运行时的多态逻辑:
ma[0]是Vampire对象,调用frighten(x)时会执行子类的重写方法,输出a bite?ma[1]是Dragon对象,Dragon已经重写了frighten(int),输出breath firema[2]是Monster对象,执行父类的方法,输出arrrgh
整个代码编译无问题,运行输出完全符合预期。
选项2:编译报错
Vampire类的frighten(int f)返回值是int,而父类Monster的方法返回值是boolean。方法重写要求返回值类型必须兼容(基本类型必须完全相同),这里返回类型不匹配,属于无效重写,编译器会直接报错,所以这个选项直接排除。
选项3:编译通过,但输出不符合预期
Vampire类里的方法是scare(int x),和父类的frighten方法名不一样,这只是子类新增的方法,不是重写。运行时ma[0].frighten(x)会调用父类Monster的frighten方法,输出arrrgh而不是预期的a bite?,不符合要求。
选项4:编译通过,但输出不符合预期
Vampire类的frighten(byte b)参数类型是byte,和父类的int参数不匹配,这属于方法重载(不是重写)。运行时ma[0].frighten(x)里的x是int类型,会调用父类的frighten(int)方法,输出arrrgh而非a bite?,同样不符合要求。
解答你困惑的核心点
- 输出随frighten参数变化的原因:关键看子类的方法是重写还是重载。如果是重写,多态机制会调用子类方法;如果是重载,当参数类型不匹配时,会 fallback 到父类的方法执行。
- 返回值的影响:方法重写时,返回值必须和父类兼容(基本类型要完全一致),否则编译器会直接报错——这是Java确保重写逻辑合法性的规则。
内容的提问来源于stack exchange,提问作者Sosek

