首先让我说这个程序正常运行,所以我所寻找的只是对其工作原理的解释。这是其中之一,"好吧,也许这样做会......"时刻。
这是一项家庭作业,显示方法覆盖。这三个文件位于[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所做的相同内容。
理解/其他批评的任何帮助都表示赞赏。
答案 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一起实例化。
我希望这不会让人感到困惑,但如果你能够理解它并开始使用这样的原则就会变得更加容易!