Java Math类自定义abs方法报错求助:为何需private static及正确实现
Java Math类重名与递归问题解决
为什么编译器要求你添加private static double abs(double z)方法
你自定义了一个名为Math的类,而Java标准库中已经存在默认导入的java.lang.Math类。当你在代码中调用Math.abs(z)时,编译器会优先在当前你自己编写的Math类中查找abs方法,而非直接使用标准库的实现。因为你的类最初没有这个方法,所以编译器报错要求你添加。
你写的方法存在的问题
你实现的abs方法里写了double A = abs(z);,这是无限递归调用:每次调用该方法都会再次调用自身,没有任何终止条件,运行时会直接抛出StackOverflowError,导致程序崩溃。
正确的解决方式
有两种可行的修正方案:
方案1:调用Java标准库的Math.abs方法
因为你的类名和标准库的Math重名,需要用全限定类名指定调用标准库的方法,这样就不需要自己实现abs方法了:
public class Math { public static void main(String[] args) { double z = -9.8; double A; // 使用全限定名调用标准库的Math.abs A = java.lang.Math.abs(z); System.out.println("Valor absoluto de " + z + " = " + A); } }
更简单的方式是直接修改你自定义的类名(比如改成MyMath),这样Math.abs(z)就会自动调用标准库的方法。
方案2:自己正确实现绝对值逻辑
如果你想自己实现abs方法,要去掉递归,用逻辑判断计算绝对值:
public class Math { public static void main(String[] args) { double z = -9.8; double A; A = Math.abs(z); System.out.println("Valor absoluto de " + z + " = " + A); } private static double abs(double z) { // 正确的绝对值逻辑:如果z小于0,返回它的相反数,否则返回自身 if (z < 0) { return -z; } return z; // 也可以用更简洁的写法:return z < 0 ? -z : z; } }
内容的提问来源于stack exchange,提问作者Lua
相关产品推荐
相关产品推荐

