我是一名初学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)
来调用它,这样会很不方便。
我不知道为什么会这样。请帮忙!
感谢。
修改
感谢您的回答。我弄清楚我做错了什么。
答案 0 :(得分:3)
首先,你所写的不是构造函数。构造函数没有返回类型。
因此,在缺少构造函数的情况下,您的类已经定义了一个不带参数的默认构造函数(编译器尽职尽责地告诉您使用它,因为您尝试创建一个新实例)。
解决方案:
使用静态方法而不是尝试使用实例。似乎是最实用的方法
如果您必须使用类,因为它是作业,请定义构造函数和getFactorial
方法。 getFactorial
可能具有返回类型,并为您提供所需的值。你必须在类似的东西中使用它
Factorial fac1 = new Factorial(5);
System.out.println("Factorial " + fac1.getFactorial());
甚至
System.out.println("Factorial " + (new Factorial(5)).getFactorial());
通常第一个版本更易于阅读。
答案 1 :(得分:1)
你的类中没有构造函数需要很长的参数。你错误的是这个方法是一个构造函数:
public long Factorial(int num)
构造函数没有返回类型。正如您已经提到过返回类型以上签名,因此它已成为常规方法而不是构造函数。
当没有在类中编写构造函数时,编译器提供了一个无参数构造函数,因此它抛出了一个错误原因:
原因:实际和正式的参数列表长度不同
答案 2 :(得分:0)
构造函数不能具有用户定义的返回类型: 他们可以只是:
public constructor(parameter p){
// TO DO SOMETHING
}
并且您无法将System.out.println()
中的值传递为new Something();
。只有方法可以像具有某种返回类型的方法一样传递。
答案 3 :(得分:0)
宣布
时public long Factorial(int num)
,这不是Factorial的构造函数,因为它的输入时间很长。构造函数必须声明如下:
public Factorial(int num)
由于您尚未声明构造函数,因此唯一的现有构造函数是默认构造函数,它不带参数,因此当您调用
时new Factorial(10)
你得到一个错误,因为新的Factorial没有与唯一的现有构造函数没有参数。
编辑:此外,即使您修复了此问题,也无法进行
new Factorial(10) / new Factorial(5)
因为没有在因子上定义除法。
答案 4 :(得分:0)
首先请参考Java Code Conventions命名包和类和方法。
其次,你混淆了一个类的构造函数和方法。构造函数与类具有相同的名称,并且没有返回值。它与new关键字一起使用以生成类的实例。
你写了一个名为" Factorial"返回类型为int(请参阅编码指南,为什么要使用小写)。由于您的类缺少构造函数,因此Java添加了一个没有参数的默认值。但是您尝试使用int参数调用构造函数。这就是你得到错误的原因。
要在对象Factorial上调用方法Factorial,您需要生成一个新实例并使用int参数调用该方法。像这样:
int fact = new Factorial().Factorial(5)
然而,对于您的示例,不需要创建对象,因此可以选择静态方法factorial。