我实例化其中一个类的所有对象都使用与实例化该类型的最后一个对象相同的值进行打印

Mac*_*zie 0 java

我无法理解它,我声明/实例化具有单独名称和值的所有对象,如下所示:

// Initialise cars - null constructors and non-null constructors.
    ParkedCar car1 = new ParkedCar();
    ParkedCar car2 = new ParkedCar("BBB 222", "Toyota", "Echo", "Black", 200);
    ParkedCar car3 = new ParkedCar("CCC 333", "Ford", "Taurus", "Silver", 100);
    ParkedCar car4 = new ParkedCar("DDD 444", "Dodge", "Charger", "Blue", 500);
    ParkedCar car5 = new ParkedCar("EEE 555", "Kia", "Rio", "Grey", 75);
//Initialise meters
    ParkingMeter pm1 = new ParkingMeter(car1, 60);
    ParkingMeter pm2 = new ParkingMeter(car2, 60);
    ParkingMeter pm3 = new ParkingMeter(car3, 120);
    ParkingMeter pm4 = new ParkingMeter(car4, 0);
    ParkingMeter pm5 = new ParkingMeter(car5, 60);
Run Code Online (Sandbox Code Playgroud)

(这是来自其他班级的构造函数,以防你好奇:

public ParkedCar()
{
    licensePlate = "AAA 111";
    carMake = "Honda";
    carModel = "Accord";
    carColour = "Red";
    minutesParked = 15;
}

public ParkedCar(String license, String carMa, String carMod, String carCol, int time)
{
    carMake = carMa;
    carModel = carMod;
    carColour = carCol;
    licensePlate = license;
    minutesParked = time;
}
Run Code Online (Sandbox Code Playgroud)

因此,目标是让ParkedCar对象具有ParkingMeter对象(仅在ParkedCar对象上设置timePaid变量),以及PoliceOfficer对象检查"付费时间"与"停放时间"并签发停车票(实例化一个ParkingTicket对象),罚款对应于他们已经停放了多长时间.我可以提供完整的类,但这里是ParkingTicket类的相关部分,因为它是从以下位置打印的地方:

public ParkingTicket(ParkedCar car)
{
    ParkedCar illegalParker = car;
    licensePlate = illegalParker.getLicensePlate();
    carMake = illegalParker.getCarMake();
    carModel = illegalParker.getCarModel();
    carColour = illegalParker.getCarColour();
    minutesParked = illegalParker.getMinutesParked();
    minutesPaid = illegalParker.getMinutesPaid();
    fineAmount = ParkingTicket.getFineAmount(illegalParker);
    badgeNumber = PoliceOfficer.getBadgeNumber();
    officerName = PoliceOfficer.getOfficerName();
}
public static String getTicketText(ParkedCar car, PoliceOfficer issuer)
{
    PoliceOfficer ticketIssuer = issuer;
    ParkedCar illegalParker = car;
    ticketText = "PARKING TICKET $"+ParkingTicket.getFineAmount(illegalParker)+".\n"
        +"License Plate: "+illegalParker.getLicensePlate()+".\n"
        +"Car Description: "+illegalParker.getCarColour()+" "+illegalParker.getCarMake()+" "+illegalParker.getCarModel()+".\n"
        +"Issued by: "+ticketIssuer.getOfficerName()+", Badge Number: "+ticketIssuer.getBadgeNumber()+".\n";
    return ticketText;
}
public String toString()
{
    return "PARKING TICKET $"+this.fineAmount+".\n"
        +"License Plate: "+this.licensePlate+".\n"
        +"Car Description: "+this.carColour+" "+this.carMake+" "+this.carModel+".\n"
        +"Issued by: "+this.officerName+", Badge Number: "+this.badgeNumber+".\n";
}
Run Code Online (Sandbox Code Playgroud)

通过直接打印对象或打印.getTicketText()方法返回的String来使用.toString()方法无关紧要......

为什么所有ParkedCar对象的值都设置为car5的值?

随意请求更多的代码片段,因为这个分配的目的是演示类之间的连接,并且来回进行大量的引用.

Ell*_*sch 5

static字段由所有实例共享.除掉static

private String carMake; // <-- not static
private String carModel; // <-- not static
private String carColour; // <-- not static
private String licensePlate; // <-- not static
private int minutesParked; // <-- not static
Run Code Online (Sandbox Code Playgroud)

这样每个实例都可以获得自己的实例.

JLS-8.3.1.1.static菲尔兹说(部分),

如果声明static了一个字段,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身.初始化类时,静态字段(有时称为类变量)会显示(第12.4节).

未声明的字段static(有时称为非static字段)称为实例变量.每当创建一个新的类实例(第12.5节)时,就会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量.