当前位置: 首页 > 知识库问答 >
问题:

重写和继承

郜俊健
2023-03-14

“编写一个名为clsWorker的超类和子类clsHourlyWorker和clssalariedworker。每个工人都有一个名字和一个工资率。编写计算每个员工周薪的方法computePay(int hours)。小时工按实际工作小时数获得小时工资,如果小时数最多为40小时。如果小时工工作超过40小时,则按时间半支付超出部分。受薪工人得到40小时的小时工资,无论实际小时数是多少。为继承编写一个测试程序。输入员工姓名、工作时数和员工类型,H表示每小时,S表示受薪员工,即员工的薪资率。显示输入的每个工人的工资。“

我们需要做重写和继承。我总是遇到NoSuchMethodError

我的超类:

     public class clsWorker
{   
    int hours=0,excess=0;
    double salary,newSalary=0.0;
    String sType;


    public clsWorker()
    {

    }

    public clsWorker(double sal,String type)
    {
        //this.hours=hours;
        salary=sal;
        sType=type;
    }

    public double computePay(int hours)
    {   
        sType=sType.toUpperCase();
        if(sType.equals("H"))       
        newSalary=(salary*hours)*7;
        else if(sType.equals("S"))
        {   if(hours>=40)
            newSalary=salary*40;
            else if(hours>40)
            {
            excess=hours-40;
            newSalary=(newSalary+((newSalary*excess)*1.5))*7;
            }
        }
        return newSalary;       
    }


}
public class clsHourlyWorker extends clsWorker
    {   
        double dSalary=0.0;
        int iHours=0;

        public clsHourlyWorker()
        {
            //super();
        }

        public clsHourlyWorker(int iHours, double salaryph,String sRate)
        {

            super(iHours,salaryph,sRate);   
            //clsWorker w=new clsWorker();
            dSalary=newSalary;  

        }




        public double getSalary()
        {
            return dSalary;
        }
    }

public class clsSalariedWorker extends clsWorker
{
    double dSalary=0.0;
    int iHours=0;   

    public clsSalariedWorker()
    {
        //super();
    }

    public clsSalariedWorker(int iHours,double salaryph,String sRate)
    {

        super(iHours,salaryph,sRate);
        //super(salaryph,sRate);
        //this.iHours=iHours;   
        //clsWorker w=new clsWorker();
        dSalary=newSalary;
    }

    /*public void setSalary(int iHourjs)
    {

    }*/ 

    public double getSalary()
    {
        return dSalary;
    }
}
import java.util.*;

public class testSalary
{

    public static void main(String[]args)
    {


        Scanner console=new Scanner(System.in); 

        System.out.println("Input Salary per hour: ");
        double salaryph=console.nextDouble();
        System.out.println("Input number of hours: ");
        int iHours=console.nextInt();
        console.nextLine();
        System.out.println("Input Worker Name: ");
        String sName=console.nextLine();
        System.out.println("Input Type of Worker: ");
        String sRate=console.next();


        clsHourlyWorker hw=new clsHourlyWorker(iHours,salaryph,sRate);
        clsSalariedWorker sw=new clsSalariedWorker(iHours,salaryph,sRate);

        //System.out.println("Worker Name: "+sName+"\nSalary: "+hw.getSalary());
        if(sRate.equals("H"))
        System.out.println("Worker Name: "+sName+"\nSalary: "+hw.getSalary());
        else if (sRate.equals("S"))
        System.out.println("Worker Name: "+sName+"\nSalary: "+sw.getSalary());


    }

}

有人能告诉我如何解决我的问题吗?谢了。

共有1个答案

司寇苗宣
2023-03-14

这说不通:

    public clsHourlyWorker(int iHours, double salaryph,String sRate)
    {

        super(iHours,salaryph,sRate);   
        //clsWorker w=new clsWorker();
        dSalary=newSalary;  

    }

因为超类的构造函数不接受int、double和String,而是接受String、double、int表示name、dRate和hours。sRate真的应该是一根绳子吗?我强烈怀疑。

我建议您的子类构造函数在参数中接受超级构造函数所需的所有信息(Strinng表示name,double表示dRate和int表示hours),外加附加参数新子类字段的附加信息。您可能希望重新考虑这些字段,因为有些字段似乎是超级字段的重复,因此是不必要的。

 类似资料:
  • 本文向大家介绍java中重载,继承,重写和多态的区别,包括了java中重载,继承,重写和多态的区别的使用技巧和注意事项,需要的朋友参考一下 重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员。 2)重写是继承后重新实现父类的方法。 3)重载是在一个类里一系列参数不同名字相同的方法。 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护。 网上看到一个有趣的说法是:继承是子类使用父类

  • 我偶然发现了这段代码。 在实际运行它之前,我试图猜测运行它的结果是什么。当我看到它们时,我真的很困惑&需要一些解释。 这是代码: 为什么会这样? ? 为什么还要出现?我根本没有实例化。 并且如果出现,为什么会出现在之后?

  • 本文向大家介绍Java和多重继承,包括了Java和多重继承的使用技巧和注意事项,需要的朋友参考一下 Java不支持多重继承。这意味着一个类不能扩展一个以上的类。因此,跟随是非法的 但是,一个类可以实现一个或多个接口,这帮助Java摆脱了多重继承的可能性。extend关键字仅使用一次,并且父接口在逗号分隔的列表中声明。例如,如果Hockey接口同时扩展了Sports和Event,它将被声明为- 下面

  • 问题内容: 我有两个课,和。它们看起来像这样: 此错误指向Field的: 我希望首先调用Background init ()。要将“ a,b”传递给Fields的 init (),Field会分配a和b,然后将其中包含三个0的列表分配给field。然后让Background的 init ()继续,然后调用它自己的buildField()并用包含c的列表覆盖self.field。 似乎我还没有完全理

  • 我创建了一个(个人、学生、员工、教职员工)类。Person必须将Student和Employee分为子类。Employee有两个子类:教员和职员。我已经完成了所有的编码,他们工作得很好,除了我的驱动程序类TestPerson程序给出了编译错误 注:一个测试程序,创建一个人、学生、员工、教职员工,并调用他们的toString方法。 驱动程序类TestPerson的错误。以下是java:- **我只是

  • 问题内容: 我的课是: 我在这个类中写一个子类: 注意在 覆盖类中 的 getX 方法时,我已经从方法定义中删除了该子句,现在它导致编译器出现异常行为,这是预期的: 不会如预期那样将其封闭在一个块中而无法编译。 编译而不将它封闭在一个块中。 但是下面的代码行需要try-catch块。 就像可以预见的那样,即在运行时多态期间使用父类引用来调用子方法,为什么Java的设计人员在覆盖特定的父类方法时没有