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

Java 传递方法结果/重载方法-为什么这样做有效?,java,methods,overloading,Java,Methods,Overloading,首先,我要说的是,我让这个程序运行起来了,所以我想要的只是解释一下为什么它会运行。这是其中的一个“好吧,也许这可以……”时刻 这是一个家庭作业,显示方法重写。这三个文件位于[Pastebin] (). UseCarRental是主要类别,LuxuryCarRental是凌驾于CarRental之上的类别 目前,在main()中,我有以下块: rentalCar.setName(name); rentalCar.setZip(zip); rentalCar.setCarSize(carSize)

首先,我要说的是,我让这个程序运行起来了,所以我想要的只是解释一下为什么它会运行。这是其中的一个“好吧,也许这可以……”时刻

这是一个家庭作业,显示方法重写。这三个文件位于[Pastebin] (). 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相同的GET,那么应该有相同的值。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,则为true,因此转到该文件的display()块。上面列出的那个块引用的get与CarRentalUse相同


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

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


我希望这不会太让人困惑,但如果你能改变你的想法,开始使用像这样的原则,生活就会变得容易多了

你还没有给我们所有的代码,但我认为luxuryRentalCar与rentalCar是不同的对象。在一个对象上设置值通常不会影响另一个对象。正在获取/设置的变量在CarRental中,并且受到保护。豪华公寓和二手公寓类扩展了公寓。我认为这意味着他们可以直接接触到它。你是说这是因为新对象只有对变量的引用?类定义了对象实例将具有的值容器。对象实例定义这些值容器中的内容。类A扩展类B只是意味着类A将拥有类B拥有的所有价值容器,还有更多。好的,谢谢。那么,将来有没有更优雅的方法来实现这一点,或者你必须独立地获取/设置每一个呢?创建一个构造函数,它接受你想要设置的所有属性,并在你想要创建对象时调用该构造函数。尝试使方法通用化,例如
processExtras()
对某些汽车没有任何作用,但对其他汽车有很多作用。