【问题标题】:Calling a Non-Static Method from Another Method in Another Class从另一个类中的另一个方法调用非静态方法
【发布时间】:2014-07-27 20:02:30
【问题描述】:

我创建了 2 个类:PayPaycheckCalculator。这是进行计算的方法:

public class Pay {   
    private double hoursWorked;
    private double rateOfPay;
    private double withRate;
    private double grossPay;
    private double netPay;

    public Pay ()
    {
        withRate = 15;
        rateOfPay = 5.85;
    }

    public void computeNetPay(double hours, double ratePay, double rateWith)
    {
        grossPay = hours * ratePay;
        double newAmt = grossPay*rateWith/100;
        netPay = grossPay - newAmt;       
    }

    public void computeNetPay(double hours, double ratePay)
    { 
        grossPay = hours * ratePay;
        double newAmt = grossPay*withRate/100;
        netPay = grossPay - newAmt;       

    }

    public void computeNetPay(double hours)
    {
        grossPay = hours * rateOfPay;
        double newAmt = grossPay*withRate/100;
        netPay = grossPay - newAmt;        
    }       
}

这是调用并显示结果的那个,不幸的是,我无法根据本书要求它运行的方式让它运行。

public class PayCheckCalculator {
    public static void main(String[] args) {

        Pay employee1 = new Pay(37.00, 12.00, 15.00);
        Pay employee2 = new Pay (25.00, 11.00);
        Pay employee3 = new Pay (15.00);
        display(employee1);
        display(employee2);
        display(employee3);
    }

    public static void display (Pay paycheck)
    {
         System.out.println("Employee pay is" + Pay.computeNetPay);
    }
}

任何提示都会在我的再教育过程中帮助我。

【问题讨论】:

  • 使用paycheck.computeNetPay,因为它是一个实例方法。
  • 究竟是什么问题?
  • 在提问之前先花点时间搜索一下;您会注意到右侧有 10 个问题几乎与您的标题完全相同。
  • 我不明白所有new Pay(...) 行是如何编译的。您只定义了一个不带参数的Pay 构造函数,但您尝试使用一个、两个或三个参数进行构造。您是否定义了其他遗漏的构造函数?

标签: java


【解决方案1】:

您需要一个对象的实例,才能从中调用方法,除非该方法被声明为静态。如上所述,您可以调用:

paycheck.computeNetPay(无论您需要什么参数)

这将调用你传递给display方法的类paycheck中的方法。
如果你想首先创建一个对象,该方法不需要声明为静态的,可以这样调用:

p1.computeNetPay(无论您需要什么参数)

其中 p1 是 Pay 类的实例。因为这里类的对象实例被称为paycheck,所以这是您调用(非必要的)静态方法的对象。
此外,当您编写 Pay employee1 = new Pay(37.00, 12.00, 15.00); 时,这看起来像一个 构造函数 您不应该将它用作构造函数。构造函数是创建类的实例,在这里看起来就像您正在尝试将参数从方法传递到构造函数,并且只有 ,没有 类型

您为Pay 类定义的唯一构造函数不带任何参数,因此当您要创建对象时不能将任何参数传递给它。

Here 很好地解释了构造函数的工作原理。

这应该让您朝着正确的方向前进,对其他方法使用相同的方法,但参数更多。

  public class Employee {

     // These should be public unless you have getters and setters  
     public double hoursWorked;
     public double rateOfPay;
     public double withRate;
     public double grossPay;
     public double netPay;

     public Employee()
     {
         withRate = 15;
         rateOfPay = 5.85;
     }

     // Return the double netPay from this method
     public double computeNetPay(double hours)
     {
         grossPay = hours * rateOfPay;
         double newAmt = grossPay*withRate/100;
         netPay = grossPay - newAmt;        
         return netPay;
     }       

     public static void main(String []args){
        Employee Ben = new Employee();
        System.out.println("Ben gets paid " + Ben.computeNetPay(8.0));
       }
     }

【讨论】:

  • 我认为我必须根据方法所在的类编写调用,如 pay.compute 中
  • 将所有这些都放在一个类中,我会不会让我的生活更轻松?
  • OOP 是关于管理对象之间的依赖流,如果您认为这证明了多个类的合理性,那么您可以这样做。您基于类进行静态方法调用,静态基本上意味着“不需要对象”,因此该方法属于该类并且不需要实例。如果方法不是静态的,则必须先创建它的实例。
  • 如果是我,我可能会有一个 Employee 类并为每个员工创建该类的实例。你会创建一个像 Employee Ben = new employee();然后从每个实例调用方法。
  • 看到我想到了,但是书中对问题的表述方式并没有暗示我应该这样做,但似乎这样会容易得多。
【解决方案2】:

非静态方法只能在对象上调用,例如:

paycheck.computeNetPay(...);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多