1

我认为我的代码存在一些基本问题。我对java语法不太熟悉,所以我不太确定我哪里出错了。任何帮助将不胜感激。

我尝试在中间使用构造函数,并在底部使用一些访问器,但我认为我自己过于复杂了。

import java.util.Scanner;    
public class FerryBooking {

    public static void main(String args[]){
        class VehicleBooking {
            private String booking_ID = new String("");
            private String registration = new String("");
            private String make_model = new String("");
            private int number_passengers = 1;
            private boolean insurance_choice = false;
            private boolean insurance_flag = false;

            public static final int booking_fee= 100;
            public static final int extra_passenger = 50;
            public static final int insurance_fee = 50;

            VehicleBooking() {
                Scanner input = new Scanner(System.in);
                Scanner scan = new Scanner(System.in);

                System.out.print("Enter booking ID");
                booking_ID = input.next();
                System.out.print("Enter registration number");
                registration = input.next();
                System.out.print("Enter vehicle make/model");
                make_model = input.next();
                System.out.print("Enter number of passengers");
                number_passengers = scan.nextInt();
            }

            public String getBookingID(){
                return booking_ID;
            }
            public String getRegistration(){
                return registration;
            }
            public String getMakeModel(){
                return make_model;
            }
            public int getPassengers(){
                return number_passengers;
            }
            public boolean getInsurance(){
                return insurance_choice;
            }
            public boolean addInsurance(){
                insurance_choice = true;
                if (insurance_flag = false) {
                    insurance_flag = true;
                    return true;
                } else if (insurance_flag = true) {
                    return false;
                }
                return true;
            }
            public double getBookingFee(){
                int final_cost = booking_fee + (getPassengers()*extra_passenger);
                if (insurance_choice = true){
                    final_cost = final_cost + insurance_fee;
                }
                return final_cost;
            }
        }
    }
}

- 编辑 -

我重写了很多代码,并将其缩小到我的大问题所在;构造函数。但是,我收到与提供给我的代码的构造函数相关的错误。

import java.util.Scanner;

public class VehicleBooking {

    private String booking_ID = "";
    private String registration = "";
    private String make_model = "";
    private int number_passengers = 1;
    private boolean insurance_choice = false;

    public static final int BOOKING_FEE= 100;
    public static final int EXTRA_PASSENGER = 50;
    public static final int INSURANCE_FEE = 50;

    public VehicleBooking(String booking_ID1, String registration1,  String make_model1, int number_passengers1) {

        /** Initialise the variables **/
        booking_ID = booking_ID1;
        registration = registration1; 
        make_model = make_model1;
        number_passengers = number_passengers1;
    }

    public static void main(String args[]) {
        VehicleBooking vb = new VehicleBooking(booking_ID1, registration1, make_model1, number_passengers1);
    }       
}
4

2 回答 2

6

首先不要像下面这样初始化一个字符串:-

private String booking_ID = new String("");

而是使用String.valueOf()或仅将空字符串分配给变量:-

private String booking_ID = "";

其次,养成CONSTANTSUPPER_CASE信声明自己的习惯:-

public static final int BOOKING_FEE = 100;

第三,看看你的构造函数: -

    VehicleBooking()  {
        Scanner input = new Scanner(System.in);
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter booking ID");
        booking_ID = input.next();
        System.out.print("Enter registration number");
        registration = input.next();
        System.out.print("Enter vehicle make/model");
        make_model = input.next();
        System.out.print("Enter number of passengers");
        number_passengers = scan.nextInt();
    }

你不应该I/O在你的构造函数中进行操作..Constructors用于初始化对象的状态。它的唯一目的是initialize

出于 I/O 目的,创建不同的方法readInput()并在创建对象后调用它。

另一件事: - 这是你if-else-if用过的块..

         if (insurance_flag = false) {
             insurance_flag = true;
             return true;
         } else if (insurance_flag = true) {
             return false;
         }

在这段代码中,你if的总是false和你else if的总是true..因为你实际上是把这些分配values给你的insurance_flag..你应该==用于比较目的..

所以,使用if (insurance_flag == false).. 实际上你不需要与布尔文字比较......

只需使用: - if (!insurance_flag).. 它们是等价的..

理想情况下,您应该将包含上述方法的方法更改为以下方法:-

       public boolean addInsurance(){
            boolean returnValue = !insurance_flag;
            insurance_flag = true;
            return returnValue;
       }

因为这就是您的方法正在做的事情,但是以一种奇怪的方式..

您也可以final_cost = final_cost + insurance_fee;用以下代码替换:-

final_cost += insurance_fee;

通过这种方式使用它,final_cost将不会被评估twice..

编辑 ** : -

constructor应该看起来像这样: -

public VehicleBooking(String bookingId, String registration, String makeModel, 
                      String numberOfPassengers)  {

    /** Initialize the instance variables **/
    /** this represent the reference to current object **/
    this.booking_ID = bookingId;
    this.registration = registration; 
    this.make_model = makeModel;
    this.number_passengers = numberOfPassengers;
}

因此,您实际上是将读取的那些值作为参数传递给构造函数,并使用这些参数初始化实例属性。

我想这会清除你的疑问..

于 2012-10-01T13:36:18.117 回答
0

首先,不要使用

private String booking_ID = new String("");

您正在创建一个新的空不可变对象。您至少应该让 JVM 实习生空白字符串!

if (insurance_flag = false)

那是分配,而不是评估,使用 ==,如果 (!insurance_flag) 更好

    public boolean addInsurance(){
        insurance_choice = true;
        if (insurance_flag = false) {
            insurance_flag = true;
            return true;
         } else if (insurance_flag = true) {
            return false;
         }
        return true;
    }

这整个函数没有多大意义,你已经在圈子里编码了。只需将保险标志设置为真。Insurance_flag 除了返回之外没有在任何地方使用……为什么你只想在第一次设置标志时返回 true?就让它作废吧。用于“设置”动作。

此外,您将品牌和型号组合成一个字符串,这并不是一种非常面向对象的构建项目的方式。理想情况下,您应该将 Vehicle 对象附加到您的 VehicleBooking 而不是 Vehicle 本身的属性。

抛弃内部类,不要在构造函数中执行输入。从输入构造(即传入)或使用构建器。

于 2012-10-01T13:28:45.957 回答