java - toString() 方法没有继承自它的父类(super class)

标签 java oop inheritance tostring

我正在处理具有以下类的任务:

  1. Vehicle.java(抽象类)
  2. NewVehicle.java Vehicle.java 的子类
  3. UsedVehicle.java Vehicle.java 的子类
  4. VehicleParser.java 用作解析器
  5. Drive 用作 main 的类

VehicleParser 类中,我确定它是哪个对象。它要么是 NewVehicle 对象,要么是 UsedVehicle。在 Drive 类中,我用 Vehicle 对象填充了一个 ArrayList

现在,当我尝试System.out.println 一个Arraylist 时,驱动类只是调用在 中声明的toString 方法>UsedVehicle/NewVehicle 但不调用在 Vehicle.java 类中声明的方法。我需要它首先调用 Vehicle 的方法 toString 然后用它连接 UsedVehicle/NewVehicletoString .

代码如下:

车辆

public abstract class Vehicle {

    protected String make;
    protected int modelYear;
    protected String motivePower;
    protected double licenseFee;

    public Vehicle(String make,int modeYear,String motivePower) {
        this.make = make;
        this.modelYear= modeYear;
        this.motivePower = motivePower;
        this.licenseFee = 0.0;
    }

    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public int getModelYear() {
        return modelYear;
    }

    public void setModelYear(int modelYear) {
        this.modelYear = modelYear;
    }

    public String getMotivePower() {
        return motivePower;
    }

    public void setMotivePower(String motivePower) {
        this.motivePower = motivePower;
    }

    public double getLicenseFee() {
        return licenseFee;
    }

    public void setLicenseFee(double licenseFee) {
        this.licenseFee = licenseFee;
    }

    public abstract void computeLicenseFee();

    public String toString()
    {
        return "\nMake:\t\t"+getMake()+
                "\nModel Year:\t"+getModelYear()+
                "\n Motive Power:\t"+getMotivePower()+
                "\nLicense Fee:\t"+getLicenseFee();
    }

    public static class UsedVehicle extends Vehicle
    {
        public String previousLicenseState;
        public int currentYear;
        int yearsOld = 0;

        public UsedVehicle(String make, int modelYear, String power, String previousState, int currentYear)
        {
            super(make,modelYear,power);
            this.previousLicenseState = previousState;
            this.currentYear = currentYear;
        }


        public String getPreviousLicenseState() {
            return previousLicenseState;
        }


        public void setPreviousLicenseState(String previousLicenseState) {
            this.previousLicenseState = previousLicenseState;
        }


        public int getCurrentYear() {
            return currentYear;
        }


        public void setCurrentYear(int currentYear) {
            this.currentYear = currentYear;
        }


        public void computeLicenseFee() {
            double baseFee = 100.00;
            double titleTransferFee = 15.00;
            double smogWaiverFee = 0.00;
            double smogAbatement = 0.00;

            yearsOld = getCurrentYear() - getModelYear();
            if(yearsOld > 5)
            {
                smogWaiverFee = 8.00;
            }

            if("gas".equalsIgnoreCase(getMotivePower()))
            {
                smogAbatement = 20.00;
            }

            licenseFee = baseFee + smogAbatement + titleTransferFee + smogWaiverFee; 
        }

        public String toString()
        {
            return "\n Years Old:\t"+yearsOld+
                    "\n Previous State:\t"+getPreviousLicenseState();
        }
    }

    public static class NewVehicle extends Vehicle
    {
        public double vehiclePrice;

        public NewVehicle(String make, int modeYear, String motivePower,double price) {
            super(make, modeYear, motivePower);
            this.vehiclePrice = price;
        }


        public double getVehiclePrice() {
            return vehiclePrice;
        }


        public void setVehiclePrice(double vehiclePrice) {
            this.vehiclePrice = vehiclePrice;
        }


        public void computeLicenseFee() {

            double baseFee = 150.00;
            double smogAbatement = 0.00;
            double priceFee = 0.00;

            if("gas".equalsIgnoreCase(getMotivePower()))
            {
                smogAbatement = 20.0;
                priceFee = getVehiclePrice()*0.15;
            }

            licenseFee = baseFee + smogAbatement + priceFee; 
        }

        public String toString()
        {
            return "Price:\t\t$"+getVehiclePrice();
        }
    }
}

解析器

public class VehicleParser {

    public static Vehicle parseStringToVehicle(String lineToParse)
    {
        Vehicle vehicleObj = null;

        Vehicle.UsedVehicle usedVeh = new Vehicle.UsedVehicle(make, modelYear, power, previousState, currentYear);

        return vehicleObj;
    }
}

驱动类

 Vehicle obj = VehicleParser.parseStringToVehicle(inputInfo);
 vehicleList.add(obj);
 System.out.println(vehicleList.get(i));

最佳答案

您正在覆盖 toString() 方法。 Java 在这里没有做任何特殊的魔术。如果你想调用父类(super class)的方法,你需要用 super 关键字明确地这样做:

@Override
public String toString()
{
    return super.toString() + // Here
            "\n Years Old:\t"+yearsOld+
            "\n Previous State:\t"+getPreviousLicenseState();
}

关于java - toString() 方法没有继承自它的父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39313900/

相关文章:

java - 选择哪一个 - Android 1.5 还是 Android 2.2? (我是初学者)

ios - Swift:UIViewController常用函数继承

scala - 案例类继承另一个类/特征

python - 什么是 "inheritable alternative constructors"?

c++ - 使用具有多态行为的重载函数

java - 如何使用 Java 8 在 Map 和 value 属性上使用多个比较器

java - String ... Java 中的键

java - 用于匹配注释字段上的公共(public)方法调用的 Aspectj 切入点

oop - 私有(private)变量还是 protected 变量?

C++:动态内存分配和类构造函数