二次方程求解程序嵌套类问题修正:移除static修饰符实现判别式计算
二次方程求解程序的嵌套类问题修复方案
问题原因
Java中普通内部类(未用static修饰的嵌套类)属于外部类的实例成员,依赖外部类的实例存在,因此无法包含静态方法——静态方法属于类本身,不依赖任何实例。你的Disko类是普通内部类,却定义了静态方法calc,这是语法错误的根源。
修复方案(推荐)
将Disko改为静态嵌套类,这样它就属于外部类Abc本身,而非实例成员,就能合法定义静态方法。修改仅需在class Disko前添加static修饰符,原有调用逻辑无需改动。
修改后的完整代码:
import java.util.Scanner; public class Abc{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a: "); double a = scanner.nextDouble(); System.out.print("Enter b: "); double b = scanner.nextDouble(); System.out.print("Enter c: "); double c = scanner.nextDouble(); double massiv[] = Disko.calc(a, b, c); System.out.println("Number of decisions = " + massiv.length); for (double x : massiv) { System.out.println("x = " + x); } } // 改为静态嵌套类 static class Disko{ public static double[] calc(double a, double b, double c) { double d = b * b - 4 * a * c; if (a == 0) { System.out.println("degenerate x"); System.exit(1); } else if (d > 0) { return new double[]{(-b - Math.sqrt(d)) / (2 * a), (-b + Math.sqrt(d)) / (2 * a)}; } else if (d == 0) { return new double[]{-b / (2 * a)}; } else { return new double[]{}; } } } }
备选方案(不推荐)
如果必须保留普通内部类,需要把calc方法改为非静态,同时在main方法中先创建外部类Abc的实例,再通过该实例创建Disko实例来调用方法。这种方式不符合“判别式计算由嵌套类完成”的简洁需求,仅作参考:
import java.util.Scanner; public class Abc{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a: "); double a = scanner.nextDouble(); System.out.print("Enter b: "); double b = scanner.nextDouble(); System.out.print("Enter c: "); double c = scanner.nextDouble(); // 创建外部类实例,再创建内部类实例 Abc outer = new Abc(); Disko disko = outer.new Disko(); double massiv[] = disko.calc(a, b, c); System.out.println("Number of decisions = " + massiv.length); for (double x : massiv) { System.out.println("x = " + x); } } class Disko{ // 改为非静态方法 public double[] calc(double a, double b, double c) { double d = b * b - 4 * a * c; if (a == 0) { System.out.println("degenerate x"); System.exit(1); } else if (d > 0) { return new double[]{(-b - Math.sqrt(d)) / (2 * a), (-b + Math.sqrt(d)) / (2 * a)}; } else if (d == 0) { return new double[]{-b / (2 * a)}; } else { return new double[]{}; } } } }
内容的提问来源于stack exchange,提问作者Yurievixh
相关产品推荐
相关产品推荐

