传递方法结果/重载方法 - 为什么这样做?

时间:2014-12-09 22:49:09

标签: java methods overloading

首先让我说这个程序正常运行,所以我所寻找的只是对其工作原理的解释。这是其中之一,"好吧,也许这样做会......"时刻。

这是一项家庭作业,显示方法覆盖。这三个文件位于[Pastebin] (http://pastebin.com/u/Stephonovich)。 UseCarRental是主类,LuxuryCarRental是最重要的CarRental。

目前,在main()中,我有这个块:

rentalCar.setName(name);
rentalCar.setZip(zip);
rentalCar.setCarSize(carSize);
rentalCar.setRentalLength(rentalLength);

    if (carSize.toUpperCase().charAt(0) == 'L') // Send the below to LuxuryCarRental 
    {
        luxuryRentalCar.setName(name);
        luxuryRentalCar.setCarSize(carSize);
        luxuryRentalCar.setRentalLength(rentalLength);
        luxuryRentalCar.setZip(zip);
        luxuryRentalCar.display();
    }
else rentalCar.display();

以前,我只有这个:

rentalCar.setName(name);
rentalCar.setZip(zip);
rentalCar.setCarSize(carSize);
rentalCar.setRentalLength(rentalLength);

    if (carSize.toUpperCase().charAt(0) == 'L')
    {
        luxuryRentalCar.display();
    }

else rentalCar.display();

我的想法是,由于LuxuryCarRental只使用与UseCarRental相同的获取,因此应该存在相同的值。 LuxuryCarRental的display()部分显示在这里:

void display()
{
    chauffeurSelect(); 
    setCarSize("Luxury"); // Seems easier to do it directly here

    totalFee = dailyFee * getRentalLength();
    System.out.println("\nRental summary");
    System.out.println("\n" + getName());
    System.out.println("ZIP code " + getZip());
    System.out.println(getCarSize() + 
            " at $" + getDailyFee() + 
            " for " + getRentalLength() + " days" + 
            " for a total of $" + getTotalFee()); 
}

当我使用上面显示的main()的旧部分运行时,我将获得空名称,0 ZIP,豪华车型,每日79.99美元,0租金长度,0总费用。我理解为什么我会得到这些价值观;当地宣布的唯一一件事就是每日费用和汽车大小。我不明白为什么LuxuryCarRental在没有专用设置的情况下无法提取名称和其他值。除非我非常可能(非常可能),否则第二个块将逐行进行,将值发送到相应的变量,然后当它到达if块时,如果选择Luxury,则为真,因此转到该文件的display()块。上面列出的那个块引用了CarRentalUse所做的相同内容。

理解/其他批评的任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:0)

正如@bennyvnq所述,对main方法中声明的两个不同对象有两种不同的引用(即rentalCar和luxuryRentalCar)。类与对象不同,您可以根据需要从类中声明任意数量的对象,除了将在类的所有对象(包括派生类)之间共享的任何静态成员之外,它们将彼此完全分离。 / p>

阅读多态性和设计模式(http://www.amazon.com/Head-First-Design-Patterns-Freeman/dp/0596007124),看看是否可以改变程序的设计。一个提示是拥有一个RentalCar类而不是从其派生其他类,它具有使用继承和多态来区分不同行为的字段。例如,RentalCar类可能有一个DriverType字段,其中DriverType是一个接口。然后,您将拥有其他实现此接口的类,如ChauffeurDriven和SelfDriven,它们定义了不同类型汽车之间的差异。这样,您只有一个RentalCar类,并且许多派生的DriverType类和设计变得更加健壮。在您的程序中,您将只有一个RentalCar对象,该对象在程序开始时声明,并在用户输入后与正确的DriverType一起实例化。

我希望这不会让人感到困惑,但如果你能够理解它并开始使用这样的原则就会变得更加容易!