java - 我可以为动态数组列表父类(super class)类型对象创建子类对象吗?

标签 java subclass superclass dynamic-arrays

如果我想使用正在初始化 Worker 类的动态数组列表,我可以添加扩展 Worker 类的子类并尝试用以下测试类之类的数据填充它们吗?...每当我尝试调用某个函数时我的子类之一出现错误,我需要调用这些函数,那么我怎样才能正确执行呢?

    public class Worker extends Person {
        private int id;

        Worker() {
        }

        Worker(int i) {
            id = i;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String toString() {
            return super.toString() + "ID: " + id + " ";
        }
    }


    public class HourlyWorker extends Worker implements Annual {
        private double rate;
        private double AnnualPayment;
        private double percentageIncrease;

        HourlyWorker() {
        }

        HourlyWorker(double r) {
            rate = r;
        }

        public double getAnnualPay(double Annualpayment) {
            return Annualpayment = rate * 52 * 40;
        }

        public double getRate() {
            return rate;
        }

        public void setRate(double rate) {
            this.rate = rate;
        }

        public double getAnnualPayment() {
            return AnnualPayment;
        }

        public void setAnnualPayment(double AnnualPayment) {
            this.AnnualPayment = AnnualPayment;
        }

        public double getpercentageIncrease() {
            return percentageIncrease;
        }

        public void setpercentageIncrease(double percentageIncrease) {
            this.percentageIncrease = percentageIncrease;
        }


        public void increasePayment(double r) {
            increasePayR(r);
        }

        public double increasePayR(double r) {
            return rate = (AnnualPayment + getAnnualPay(r) * percentageIncrease) / 2080;
        }

        public String toString() {
            return "Your rate : " + rate + " ";
        }
    }


    public class SalariedWorker extends Worker implements Annual {
        private double salary;
        private double AnnualPayment;
        private double percentageIncrease;

        SalariedWorker() {
        }

        SalariedWorker(double s) {
            salary = s;
        }

        public double getAnnualPay(double Annualpayment) {
            return Annualpayment = salary * 12;
        }

        public void increasePayment(double r) {
            increasePayS(r);
        }

        public double increasePayS(double r) {
            return salary = (AnnualPayment + getAnnualPay(r) * percentageIncrease) / 12;
        }

        public double getSalary() {
            return salary;
        }

        public void setSalary(double salary) {
            this.salary = salary;
        }

        public double getAnnualPayment() {
            return AnnualPayment;
        }

        public void setAnnualPayment(double AnnualPayment) {
            this.AnnualPayment = AnnualPayment;
        }

        public double getpercentageIncrease() {
            return percentageIncrease;
        }

        public void setpercentageIncrease(double percentageIncrease) {
            this.percentageIncrease = percentageIncrease;
        }

        public String toString() {
            return " ";
        }
    }


    public class Test {

        public static void main(String[] args) {
            Scanner prompt = new Scanner(System.in);
            ArrayList<Worker> Worker1 = new ArrayList<Worker>();

            Worker1.add(new SalariedWorker());// is it alright to create a subclass object here?
            Worker1.add(new SalariedWorker(1000.0));// index 1
            Worker1.add(new HourlyWorker());// index 2
            Worker1.add(new HourlyWorker(100.0));// index 3

            System.out.println("Enter your monthly salary: ");
            double salary = prompt.nextDouble();
            Worker1.get(0).getSalary(salary);//gets me an error
            System.out.println("Enter your hourly rate: ");
            double HourlyRate = prompt.nextDouble();

            System.out.println("Enter the Percentage Increase for a Salaried worker: ");
            double PercentIncreaseS = prompt.nextDouble();
            Worker1.get(0).getpercentageIncrease(PercentIncreaseS);//gets me an error
            System.out.println("Your Increased payment is: ");
            System.out.println("Enter the Percentage Increase for an Hourly worker: ");
            double PercentIncreaseH = prompt.nextDouble();
        }
    }

最佳答案

您收到错误是因为 Worker 类没有 getSalary() 方法。

您需要将列表中的对象转换为适当的子类类型。

例如:

SalariedWorker sw = (SalariedWorker) Worker1.get(0);
sw.getSalary(salary);

关于java - 我可以为动态数组列表父类(super class)类型对象创建子类对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37202364/

相关文章:

java - 我必须返回什么?方法插入

python - 在 python 2.x 中,我应该调用 object.__del__ 吗?

java - 限制号Java中类的实例

ios - 快速引用子类中的 Outlet

java - 试图理解 Java 中的继承

Javax.enterprise.context.SessionsScoped 的行为类似于 SpringContainer 中的 Singleton,以 JSF 作为前端

java - 如何用 Jackson 编写扁平化列表反序列化器?

java - 有效计算大 n 的 nCr(n,m) mod k

objective-c - PDFPage 子类上没有调用 init 吗?

java - 子类和父类(super class)中的同名变量