You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Head First Java练习题咨询:frighten方法参数与返回值对输出的影响疑问

关于Head First Java练习题的解法分析

嘿,我来帮你拆解这个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 fire
  • ma[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?,同样不符合要求。


解答你困惑的核心点

  1. 输出随frighten参数变化的原因:关键看子类的方法是重写还是重载。如果是重写,多态机制会调用子类方法;如果是重载,当参数类型不匹配时,会 fallback 到父类的方法执行。
  2. 返回值的影响:方法重写时,返回值必须和父类兼容(基本类型要完全一致),否则编译器会直接报错——这是Java确保重写逻辑合法性的规则。

内容的提问来源于stack exchange,提问作者Sosek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:48:09