实际和正式的论点长度不同 - 不知道为什么

时间:2013-08-25 16:04:53

标签: java constructor

我是一名初学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)来调用它,这样会很不方便。

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

感谢。

修改

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

5 个答案:

答案 0 :(得分:3)

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

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

解决方案:

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

  2. 如果您必须使用类,因为它是作业,请定义构造函数和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。