java中的构造函数问题

时间:2014-01-02 18:43:32

标签: java constructor

所以我在我的主类中有这个构造函数:

public class GCTest extends Program {
    GCTest(int x, int y) {
        int gcd = gcd(Math.abs(x), Math.abs(y));
        int num = x / gcd;
        int den = Math.abs(y) / gcd;
        if (y < 0) num = -num;
    }
}

当我在我的void run()中调用构造函数时,当我编译它时,cmd给了我以下错误“无法确定主类”但是当我创建一个只有构造函数的新java文件时我编译他们使用。;命令程序运行正常。我究竟做错了什么?我在编程方面有点新意。提前谢谢!

import java.lang.Runtime;
import acm.program.*;

public class GCTest extends Program {
    GCTest(int x, int y){
        int gcd = gcd(Math.abs(x), Math.abs(y));
        int num = x / gcd;
        int den = Math.abs(y) / gcd;
        if (y < 0) num = -num;
    }

    public int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b,a%b);
    }

    public void run() {
        Runtime myRuntime = Runtime.getRuntime();

        println("Allocating 10000 Rational objects.");

        for(int i = 0; i < 10000; i++){
            new GCTest(i + 1, i + 2);
        }

        long fB = myRuntime.freeMemory();
        println("Free memory before garbage collection = " + fB);
        myRuntime.gc();

        long fA = myRuntime.freeMemory();
        println("Free memory after garbage collection = " + fA);
        println("Garbage collection freed up " + (fA - fB) + " bytes.");
    }
}

当我编译并运行已发布的程序时,我得到“无法确定主类错误”。 当我用这个Rational.java编译我的GCTest.java时(在我从GCTest代码中删除构造函数并用新的Rational(,)替换新的GCTest之后,一切运行正常。这是Rational.java:

public class Rational{
public Rational(int x, int y) {
  int gcd = gcd(Math.abs(x), Math.abs(y));
  int num = x / gcd;
  int den = Math.abs(y) / gcd;
  if (y < 0) num = -num;
}
public int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b,a%b);
}
}

4 个答案:

答案 0 :(得分:2)

当您忘记包含主要方法时,通常会看到此错误:

public static void main(String[] args)

在你的程序中,你做了。尝试这样的事情:

public class GCTest extends Program {
   ..
   ..
   public static void main(String[] args) { 
       new GCTest(...).run();
   }

}

main(..)是一种特殊方法,可以告诉Java程序的开始位置。

答案 1 :(得分:1)

我假设您的Program类是一个实现以下行的抽象类:

public static void main(String [] args) {
  ...
}

这是您的申请的入口点。如果不发布此代码,我猜它会强制您的扩展类实现run方法。因此主入口点会调用run来启动程序。像这样的东西

public abstract class Program {
     public static void main(String[] args) {
        this.run();
     }

     public abstract void run();

}

您正在使用以下命令进行编译:

javac -cp acm.jar GCTest.java 

所以你告诉编译器将acm.jar添加到你的类路径中,并且只编译GCTest.java

我不确定您发布的实际错误是什么,但现在导航到您的源文件夹并运行

javac -cp acm.jar *.java

并查看是否有帮助

答案 2 :(得分:1)

以下是澄清:

user3083578发布的程序正在使用acm.program包。如果您的类扩展了Program类,则不需要编写自己的主类。您只需要在主类中实现run()方法。

该软件包的文档可在此处找到: http://www-cs-faculty.stanford.edu/~eroberts/jtf/rationale/ProgramPackage.html

您使用javac -cp acm.jar GCTest.java编译程序。

编译完成后,如果需要运行程序,只需使用

即可
java GCTest

更新

运行程序的正确方法是

java -cp .:acm.jar GCTest

如果我拿走你声明的构造函数(和所有依赖的行),我可以运行程序。我不知道acm.package是否支持声明你自己的构造函数。另外,我无法让.;工作,我认为你的意思是.:

答案 3 :(得分:0)

要编译java程序,您只需要传递程序没有错误 但是,要运行java程序,必须设置一个入口点来显示程序应该运行的机器 我希望你现在明白你现在发生了什么 你必须有一个

public static void main(String[] args)

public static void main(String... args)

在您的某个类中为您的程序设置该入口点的方法。