【问题标题】:Main method incorrectly displays class string?Main 方法错误地显示类字符串?
【发布时间】:2014-11-27 00:55:49
【问题描述】:

我正在编写一个程序,它提供酒店住宿的最终账单,其中包含房间号、客人数量、住宿时间和每人每晚的价格等参数。

我的 BBroom 类中的数学是正确的,但它似乎没有获取和处理类参数中的信息?

驱动类:

public class BedAndBreakfastDriver {

public static void main(String[] args) {

    //float price, int rmNum, int numOccupants, int duration
    //or
    //int rmNum, int numOccupants, int duration, float price

    BBRoom Smith;

    Smith = new BBRoom(29.95, 16, 1, 5);

    System.out.println(Smith);

}

}

BB Room 类:

public class BBRoom {

final int MAXCAP = 4;
final int MINCAP = 1;
final int MINSTAY = 1;

int room;
int persons;
int nights;
double cost;
double surcharge;
double cleanUp;
double cottageCost;

NumberFormat fmt1 = NumberFormat.getCurrencyInstance();

BBRoom(double price, int rmNum, int numOccupants, int duration){}


BBRoom( int rmNum, int numOccupants, int duration, double price){}

       private int getRoomNumber(int rmNum){
           room = rmNum;       
           return room;
       }

       private int getPersons(int numOccupants){
           if (numOccupants < MINCAP){
               persons = MINCAP;
           }if(numOccupants > MAXCAP){
                persons = MAXCAP;
             }else{
               persons = numOccupants;
           }
           return persons;
           }

       private int getNights(int duration){   

           if(duration < MINSTAY){
               nights = MINSTAY;

           }else{

               nights = duration;

           }

           return nights;
       }

       private double setCost(double price){
           return price;

       }
       private double getCost(double price){



         if (persons < 2){
             cost = price*2*nights;
            }else{
             cost = (persons*price*nights);
         }

           return cost;
             }

        private double BBCottage(double cost){

               surcharge =  (12.95*nights);

               cleanUp = 47.99;

               cottageCost = cost+surcharge+cleanUp;

               return cottageCost;

           }

        public String toString(){

               String bill = ("Room Number"+room+"   "+"Guests:"+persons+"   "+"Nights:"+nights+"   "+"Basic Package:"+ fmt1.format(cost)+"   "+"Cottage Upgrade:"+fmt1.format(cottageCost) );
               return bill;
           }

        }

出于某种原因,我不断得到输出以将每个变量显示为

“房间数:0 客人:0 晚:0 基本套餐:0.00 小屋升级:0.00”

任何帮助将不胜感激。谢谢!

附:我也更喜欢将我的 BBCottage 方法变成一个子类,但我不太确定如何实现这一点。如果我也能在这方面得到一些指导,那就太好了!

【问题讨论】:

  • 为什么你的构造函数什么都不做?一个理智的人怎么会期望一个什么都不做的函数调用来做某事?

标签: java string class methods subclass


【解决方案1】:

你的构造函数有一个空的主体

BBRoom(double price, int rmNum, int numOccupants, int duration){} // <<<<<<< nothing going on in {}

所有相关字段都被初始化为其默认值0。实现构造函数来做你想做的事。

【讨论】:

    【解决方案2】:

    您从未真正在 BB Room 中设置值。此外,getVariable(int something) 方法应拆分为单独的 get() 和 set(int something) 方法,否则您将同时获取和设置变量。

    在您的 toString 方法中,您调用将从 get() 返回的值,但这些值从未设置。要修复它,您需要在构造函数中设置它们。

    【讨论】:

      【解决方案3】:

      您的构造函数需要设置初始值。

      BB 房间:

      public class BBRoom {
      
      final int MAXCAP = 4;
      final int MINCAP = 1;
      final int MINSTAY = 1;
      
      int room;
      int persons;
      int nights;
      double cost;
      double surcharge;
      double cleanUp;
      double cottageCost;
      
      NumberFormat fmt1 = NumberFormat.getCurrencyInstance();
      
      BBRoom(double price, int rmNum, int numOccupants, int duration){
         someInstanceVariable = price;
         room = rmNum;
         persons = numOccupants;
         ..and so on..
      }
      
      
      BBRoom( int rmNum, int numOccupants, int duration, double price){
          ..do the same here..
      }
      
             private int getRoomNumber(int rmNum){
                 room = rmNum;       
                 return room;
             }
      
             private int getPersons(int numOccupants){
                 if (numOccupants < MINCAP){
                     persons = MINCAP;
                 }if(numOccupants > MAXCAP){
                      persons = MAXCAP;
                   }else{
                     persons = numOccupants;
                 }
                 return persons;
                 }
      
             private int getNights(int duration){   
      
                 if(duration < MINSTAY){
                     nights = MINSTAY;
      
                 }else{
      
                     nights = duration;
      
                 }
      
                 return nights;
             }
      
             private double setCost(double price){
                 return price;
      
             }
             private double getCost(double price){
      
      
      
               if (persons < 2){
                   cost = price*2*nights;
                  }else{
                   cost = (persons*price*nights);
               }
      
                 return cost;
                   }
      
              private double BBCottage(double cost){
      
                     surcharge =  (12.95*nights);
      
                     cleanUp = 47.99;
      
                     cottageCost = cost+surcharge+cleanUp;
      
                     return cottageCost;
      
                 }
      
              public String toString(){
      
                     String bill = ("Room Number"+room+"   "+"Guests:"+persons+"   "+"Nights:"+nights+"   "+"Basic Package:"+ fmt1.format(cost)+"   "+"Cottage Upgrade:"+fmt1.format(cottageCost) );
                     return bill;
                 }
      
              }
      

      关于将Cottage分成另一个类:

      BBCottage:

      public class BBCottage {
        public BBCottage(double cost){
      
                 surcharge =  (12.95*nights);
      
                 cleanUp = 47.99;
      
        }
      
        public double getCottage() {
           cottageCost = cost+surcharge+cleanUp;
      
           return cottageCost;
        }
        }
      

      编辑:我还意识到,在您的主要内容中,您正在执行System.out.println(Smith);。您已经打印了方法,而不是 Smith。因此,首先,我将 BBroom 更改为拥有 getter 和 setter:

      void setRmNum(int rm) {
          room = rm;
      }
      
      int getRmNum() {
          return room;
      }
      

      然后,在你的主要,做System.out.println(Smith.getRmNum());

      【讨论】:

      • 所以我对构造函数进行了更改,但是程序似乎没有通过 getCost 方法计算成本,也没有检查客人的数量是否在 2 到 4 之间?跨度>
      • 啊,我知道这个问题。你在做System.out.println(Smith);。您需要实际运行这些方法。所以,System.out.println(Smith.getRoomNumber(2));。另外,我会摆脱这些方法中的参数。拆分它,所以你有 setRoomNumber(int rm) 和 getRoomNumber()。
      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多