1

我是一名初学者 Java 程序员,我有两个简单的文件来解决一个简单的数学问题。其中一个调用另一个,它计算数字的阶乘(例如 4!= 24)。出于某种原因,我无法调用Factorial构造函数。

这是调用类:

package Permutations;
import Permutations.Factorial;

public class Permutations {
    public static void main(String args[]) {
        System.out.println("There are 10 students. Five are to be chosen and seated in a row for a picture. How many linear arrangements are possible?");
        System.out.println(new Factorial(10) / new Factorial(5));
    }
}

这是Factorial课程

package Permutations;

public class Factorial {
    public long Factorial(int num) {
        long result = 1;
        for(int i = num; i > 0; i--)
            result *= i;
        return result;
    }
}

这是错误:

Permutations\Permutations.java:7: error: constructor Factorial in class Factoria
l cannot be applied to given types;
                System.out.println(new Factorial(10) / new Factorial(5));
                                   ^
  required: no arguments
  found: int
  reason: actual and formal argument lists differ in length

Permutations\Permutations.java:7: error: constructor Factorial in class Factoria
l cannot be applied to given types;
                System.out.println(new Factorial(10) / new Factorial(5));
                                                       ^
  required: no arguments
  found: int
  reason: actual and formal argument lists differ in length
2 errors

我可以将其更改为静态方法,但是我必须使用Factorial.Factorial(num)而不是调用它new Factorial(num),这会很不方便。

我不知道为什么会这样。请帮忙!

谢谢。

编辑

感谢您的回答。我已经弄清楚我做错了什么。

4

5 回答 5

3

首先,您编写的不是构造函数。构造函数没有返回类型。

因此,在没有构造函数的情况下,您的类定义了一个不带参数的默认构造函数(这是编译器尽职尽责地告诉您使用的构造函数,因为您尝试创建一个新实例)。

解决方案:

  1. 使用静态方法而不是尝试使用实例。似乎是最实用的方法

  2. 如果您必须使用一个类,因为它是家庭作业,请同时定义构造函数和getFactorial方法。getFactorial可能具有返回类型,并为您提供所需的值。您将不得不在类似的情况下使用它

    Factorial fac1 = new Factorial(5);
    System.out.println("Factorial " + fac1.getFactorial());
    

    甚至

    System.out.println("Factorial " + (new Factorial(5)).getFactorial());
    

    通常,为了便于阅读,首选第一个版本。

于 2013-08-25T16:10:45.837 回答
1

您的类中没有构造函数需要长参数。您误认为此方法是构造函数:

public long Factorial(int num) 

构造函数没有返回类型。正如您提到的上述签名的返回类型,因此它已成为普通方法而不是构造函数。

当类中没有编写构造函数时,编译器会提供一个无参数构造函数,因此它会抛出一个错误,原因如下:

原因:实际参数列表和形式参数列表的长度不同

于 2013-08-25T16:11:31.680 回答
0

首先,请参阅Java 代码约定来命名包、类和方法。

其次,您混淆了类的构造函数和方法。构造函数与类同名,没有返回值。它与 new 关键字一起使用以生成类的实例。

您已经编写了一个名为“Factorial”的方法,其返回类型为 int(请参阅编码指南,为什么应该使用小写字母)。由于您的类缺少构造函数,Java 添加了一个没有参数的默认构造函数。但是您尝试使用 int 参数调用构造函数。这就是您收到错误的原因。

要在对象 Factorial 上调用您的方法 Factorial,您需要生成一个新实例并使用 int 参数调用该方法。像这样:

int fact = new Factorial().Factorial(5)

但是,对于您的示例,不需要创建对象,因此可以改用静态方法阶乘。

于 2013-08-25T16:17:07.383 回答
0

构造函数不能有用户定义的返回类型:它们可以是:

public constructor(parameter p){
// TO DO SOMETHING
}

而且您不能将值传递System.out.println()new Something();. 只有具有某种返回类型的方法才能被传递。

于 2013-08-25T16:10:35.990 回答
0

当你宣布

public long Factorial(int num)

,这不是 Factorial 的构造函数,因为它的类型很长。构造函数必须声明如下:

public Factorial(int num)

由于您尚未声明构造函数,因此唯一现有的构造函数是默认构造函数,它不带参数,因此当您调用

new Factorial(10)

你会得到一个错误,因为 new Factorial 不接受唯一现有构造函数的参数。

编辑:另外,即使你解决了这个问题,你也不能接受

new Factorial(10) / new Factorial(5)

因为除法没有在阶乘上定义。

于 2013-08-25T16:12:04.067 回答