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 = "";

CONSTANTS第二に、手紙であなたを宣言する習慣をつけてくださいUPPER_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フラグをtrueに設定するだけです。Insurance_flagは、return以外の場所では使用されません...フラグの最初の設定でのみtrueを返したいのはなぜですか?ただそれを無効にしてください。「設定」アクションの場合。

また、makeとmodelを一緒に1つの文字列に変更しているのであり、実際には非常にOOな方法でアイテムを作成しているわけではありません。理想的には、Vehicle自体の属性ではなく、VehicleオブジェクトをVehicleBookingにアタッチする必要があります。

内部クラスを破棄し、コンストラクターで入力を実行しないでください。入力からFROMを作成する(つまり、入力を渡す)か、ビルダーを使用します。

于 2012-10-01T13:28:45.957 に答える