来自其他类的Java变量

来自其他类的Java变量,java,class,Java,Class,我有三门课:主课,自动课,自动课。除了一件事,所有的符号都有效。我似乎无法从Auto.class获取“Prijs”变量以显示在AutoHuur.class的toString中。它一直显示为0。为什么会这样?(我知道如果它是null,我会将它初始化为0,但为什么它是null而不是Auto.class变量prijsPerDag的值?) Main.class: public class Main{ public static void main(String[] args) {

我有三门课:主课,自动课,自动课。除了一件事,所有的符号都有效。我似乎无法从Auto.class获取“Prijs”变量以显示在AutoHuur.class的toString中。它一直显示为0。为什么会这样?(我知道如果它是null,我会将它初始化为0,但为什么它是null而不是Auto.class变量prijsPerDag的值?)

Main.class:

    public class Main{
    public static void main(String[] args) {
        AutoHuur ah1 = new AutoHuur();
        System.out.println("Eerste autohuur:\n" + ah1 + "\n");

        Klant k = new Klant("Mijnheer de Vries");
        k.setKorting(10.0);
        ah1.setHuurder(k);
        Auto a1 = new Auto("Peugeot 207", 50.0);
        ah1.setGehuurdeAuto(a1);
        ah1.setAantalDagen(4);
        System.out.println("Eerste autohuur:\n" + ah1 + "\n");

        AutoHuur ah2 = new AutoHuur();
        Auto a2 = new Auto("Ferrari", 3500.0);
        ah2.setGehuurdeAuto(a2);
        ah2.setHuurder(k);
        ah2.setAantalDagen(1);
        System.out.println("Tweede autohuur:\n" + ah2 + "\n");

        System.out.println("Gehuurd: " + ah1.getGehuurdeAuto());
        System.out.println("Gehuurd: " + ah2.getGehuurdeAuto());
    }
}
Autohuur.class:

public class AutoHuur {
    private Klant huurder;
    private Auto gehuurdeAuto;
    private Auto prijs;

    private Integer aantalDagen;

    public AutoHuur(){
    }

    public void setHuurder(Klant nwH){
        huurder = nwH;
    }

    public void setGehuurdeAuto(Auto nwGA){
        gehuurdeAuto = nwGA;
    }

    public Auto getGehuurdeAuto(){
    return gehuurdeAuto;
    }

    public Auto getPrijs(){
    return prijs;
    }

    public void setAantalDagen(Integer nwD){
        aantalDagen = nwD;
    }

public String toString(){
    String s = "";

    if (gehuurdeAuto == null){
        s = s + "er is geen auto bekend\n"; }
    else { 
    s = s + gehuurdeAuto; }

    if (huurder == null){
    s = s + "er is geen huurder bekend\n"; }
    else { 
    s = s + huurder; }

    if (aantalDagen == null){
    s = s + "aantal dagen: 0"; }
    else { 
    s = s + "aantal dagen: " + aantalDagen; }

    if (prijs == null){
        s = s + " en dat kost 0.0"; }
    else { 
    s = s + " en dat kost" + prijs; }

    return s;
}

}
Auto.class:

public class Auto {
    private String type;
    private Double prijsPerDag;

    public Auto(String tp, Double nwPr){
        type = tp;
        prijsPerDag = nwPr;
    }

    public void setPrijsPerDag(Double prPd){
        prijsPerDag = prPd;
    }

    public Double getPrijsPerDag(){
        return prijsPerDag;
    }

    public String toString(){
        String s = type + " met prijs per dag: " + prijsPerDag + "\n";
        return s;
    }
}

在AutoHuur.class中,您可以使用自动对象从Auto.class获取prijsPerDag变量,例如:

gehuurdeAuto.getPrijsPerDag()
您可以计算价格:

aantalDagen * gehuurdeAuto.getPrijsPerDag()

这就是您要执行的操作吗?

变量
prijs
是一个对象,当创建
AutoHuur
的实例时,该对象被初始化为
null
。由于从未设置过
prijs
,因此它总是
null

这就是为什么
prijs==null
的计算结果总是
true

您需要在某处设置
prijs


看来你需要在设计上下功夫。例如,您使用的是
Auto
类名,而实际上它是每日费用车型之间的链接。如果每个链接都由这样一个对象表示(在您的例子中是
Auto
),那么拥有多个实例是毫无意义的

比如说,

new Auto("Peugeot", 40.0);
new Auto("Peugeot", 40.0);
这在技术上是完全正确的,但它不符合逻辑

此外,如果一个类包含某种类型的数据,那么最好将该数据上的操作也委托给该类

class Auto {

    private String type;
    private double pricePerDay;

    public double calculateTotalPrice(int numberOfDays) {
        return numberOfDays * this.pricePerDay;
    }
}

您必须删除Main.java中的第一个System.out,因为您的实例AutoHuur为空,因此当您想要打印结果时,out的值将为空

AutoHuur
中的
prijs
属于
Auto
类型。这是正确的吗?我怀疑它应该是
int
double
我假设它确实需要是自动的,因为它与它关联。但是不要问我,因为我无法让它工作lol。我确实尝试了int/double,但这对我也不起作用。@SilverNak说什么。
Auto
类型的变量不应命名为
prijs
,这似乎根本不符合逻辑。@mceponder但我的Auto类中有“prijs”。所以它应该取那个值,而不是一个独立变量,对吗?@SomeName它不一定是那种类型的。我想你想在那里保存一个数字,所以它应该是一些能够保存数字的数据类型。是的,这正是我需要的。我试过了,结果出现了一个空点异常错误。我所做的是private Double prijs=gehuurdeAuto.getPrijsPerDag();您可以使用gehuurdeAuto.getPrijsPerDag();只有在将gehuurdouto设置为自动对象之后,否则它的值为空。您可以将对象的属性保留为非斜体(Double prijs;),并将prijs=gehuurdeAuto.getPrijsPerDag()放在其中;进入setGehuurdeAuto方法的第二行(将gehuurdeAuto设置为nwGA后)。编辑注释后出现新错误:线程“main”java.lang.RuntimeException中的异常:不可编译的源代码-二进制运算符“==”的操作数类型错误第一种类型:双秒类型:这适用于if(prijs==null)在我的AutoHuur类中。您是否创建了私有双优先级;?这是基元类型,不是对象,因此不能将其与null进行比较,只能将其与0进行比较。或者您可以使用双类创建prijs-大写为D(private Double prijs;),然后您可以将其与null进行比较。哇,它确实有效,谢谢!当我试图优化代码时,比如说Double totalPrice=aantalDagen*prijs;在我的toString函数中,它给我一个空指针。你能告诉我为什么吗?因为如果我在if prijs==null部分中使用它,它确实会起作用。我的自动类中没有我的numberOfDays,因此我会遇到与现在完全相同的问题。“我的自动类中没有我的numberOfDays”-显然没有,但你应该。实际上我不允许为我的助理更改Main.class,所以它必须是自动的:/。谢谢你指出,知道正确的方法总是一件好事。