簡體   English   中英

Java-為什么此初始化無效?

[英]Java - Why does this initializing not work?

這是我的代碼

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;
    }
}

到目前為止,您的LegemiddelLegemiddel采用3個參數的構造函數。 我認為您在混淆如何創建構造函數以及如何編寫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

在這里,您可以閱讀有關班級成員的更多信息。

嘗試使用給定的3個參數實現Legemiddel構造函數:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM