这是我的代码

class TestResepter {
    public static void main(String[] args) {
        Legemiddel legemiddel = new Legemiddel("Ibuton", 200, 30.5);
        Lege lege = new Lege("Petter");
        Militærresepter militærresepter = new Militærresepter();
        Presepter presepter = new Presepter();
        BlaaResepter blaaresepter = new BlaaResepter();
        Resept resept=new Resept(legemiddel, lege, 650, 21);
    }
}


LegemiddelLegeMilitærresepterPresepterBlaaResepterResept是其他classes。但是,我收到此错误:

testresepter.java:3: error: constructor Legemiddel in class Legemiddel cannot be applied to given types;
    Legemiddel legemiddel=new Legemiddel("Ibuton", 200, 30.5);
                          ^
  required: no arguments
  found: String,int,double
  reason: actual and formal argument lists differ in length
testresepter.java:4: error: constructor Lege in class Lege cannot be applied to given types;
    Lege lege=new Lege("Petter");
              ^
  required: no arguments
  found: String
  reason: actual and formal argument lists differ in length
testresepter.java:8: error: constructor Resept in class Resept cannot be applied to given types;
    Resept resept=new Resept(legemiddel, lege, 650, 21);
                  ^
  required: no arguments
  found: Legemiddel,Lege,int,int
  reason: actual and formal argument lists differ in length
3 errors


这是为什么?我必须怎么做才能使其正常工作?

这是类Legemiddel

class Legemiddel {
    static int Id=-1;
    static String navnet;
    static double prisen;
    static double virkestoffet;

    public static void main(String navn, double pris, double virkestoff) {
        Id++;
        navnet = navn;
        prisen = pris;
        virkestoffet=virkestoff;
    }
}

最佳答案

到目前为止,您的类Legemiddel没有构造函数,该构造函数带有3个参数。我认为您在混淆如何创建constructor和如何编写main方法。

您正在调用new Legemiddel("Ibuton", 200, 30.5);,因此您的类应具有如下所示的构造函数:

public Legemiddel(String navn, double pris, double virkestoff) {
    ...
}


另外,另一个潜在的错误源是,您可能希望拥有实例变量而不是所有static类变量。否则,当您创建Legemiddel的多个实例时,它将更改所有先前创建的实例的所有值。

例如:

Legemiddel l1 = new Legemiddel("Test", 10, 20);
Legemiddel l2 = new Legemiddel("Oops", 0, 0);

System.out.println(l1.Id); // Would print 1 instead of 0
System.out.println(l1.navnet); // Would print Oops instead of Test
System.out.println(l1.prisen); // Would print 0.0 instead of 10.0
System.out.println(l1.virkestoffet); // Would print 0.0 instead of 20.0


所以你的班级应该看起来像

class Legemiddel {
    private static int ID_GEN = -1;

    private final int id;
    private final String navnet;
    private final double prisen;
    private final double virkestoffet;

    public Legemiddel(String navn, double pris, double virkestoff) {
        id = ++ID_GEN;
        navnet = navn;
        prisen = pris;
        virkestoffet = virkestoff;
    }

    public int getId() {
        return id;
    }
    public String getNavnet() {
        return navnet;
    }
    public double getPrisen() {
        return prisen;
    }
    public double getVirkestoffet() {
        return virkestoffet;
    }
}


ID_GEN现在是一个类变量,在Legemiddel的所有实例之间“共享”。在这种情况下,这是理想的,因为您希望每个实例都有一个公共生成器,以在不同实例之间保留其状态。如果您希望每个实例都有自己的ID,则需要一个单独的实例变量id,该变量不共享,但对于每个实例都是唯一的。

所有其他字段应为实例变量(不包含static),即它们属于一个且仅属于一个实例。如果它们仍然是static,则在创建Legemiddel的多个实例时会遇到麻烦,因为它们在所有实例之间共享相同的navnetprisenvirkestoffet值,如我在之前的代码。

现在,随着类的更改,您不再有这种行为:

Legemiddel l1 = new Legemiddel("Test", 10, 20);
Legemiddel l2 = new Legemiddel("Oops", 0, 0);

System.out.println(l1.getId()); // Prints 0
System.out.println(l1.getNavnet()); // Prints "Test"
System.out.println(l1.getPrisen()); // Prints 10.0
System.out.println(l1.getVirkestoffet()); // Prints 20.0


Here您可以阅读有关班级成员的更多信息。

关于java - Java-为什么这种初始化无效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48990151/

10-08 22:29