初心者がJavaで練習問題をしようとしています。Carクラスの燃料の使い方について教えてください。

このQ&Aのポイント
  • Javaで練習問題をする初心者が、Carクラスの燃料の使い方について質問しています。
  • Carクラスのインスタンスを作成し、フィールドである燃料を操作している際に問題が発生しています。
  • car2とcar3のフィールドの値が一緒になってしまう問題があり、その解決方法を教えて欲しいとのことです。
回答を見る
  • ベストアンサー

初心者で練習問題をしています

Javaで練習問題をしています Carというclassを作成して(public, privateを明示) フィールドはStringでmake(型式),colour(色),intでfuel(燃料)です。 コントラクタを作成して、 car1:make(Ferarri),colour(red),intでfuel(100) car2:make(Volvo),colour(blue),intでfuel(200) car3 = car2、 ↓ car2では色をgreenにし、car3では燃料を20使うと car2:make(Volvo),colour(green),intでfuel(180) car3:make(Volvo),colour(green),intでfuel(180) 両方とも180になってしまいますが、 (greenはいっしょになってかまいません) car2の燃料を200のまま減らないようにするには どうしたらいいでしょうか どうぞよろしくお願いします。 Public class Car { . . public void setColour(String newColour) { colour = newColour; } public void useFuel(int amount) { fuel = fuel - amount; } public static void main(String[] args) { Car car2 = new Car(); car2.make = "Volvo"; car2.colour = "blue"; car2.fuel = 200; System.out.println("car2make="+car2.make); System.out.println("car2colour="+car2.colour); car2.toString(car2.colour,car2.make); Car car3 = new Car(); car3 = car2; car2.setColour("green"); System.out.println("car2colour=blue -> green"); System.out.println("car2colour="+car2.colour); System.out.println("car3colour="+car3.colour); car3.useFuel(20); System.out.println("car2fuel="+car2.fuel); System.out.println("car3fuel="+car3.fuel); } . .

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

簡単に説明します。 キーワードは 【Javaはオブジェクトを値ではなく参照として管理している】です。 1.Car car2 = new Car(); でメモリ空間にはcar2というインスタンスを生成します。 2.Car car2 = new Car(); でメモリ空間にはcar2とは別のcar3という情報を確保します。 3.car3 = car2; この代入によりcar3というクラスはcar2で作ったメモリ空間を参照することになります。 つまり、car2もcar3も2で作ったメモリを参照することになります。 つまりjavaの=というのは値をその【メモリ空間に配置された情報をコピーする】わけではなく、【どこを参照する?】という式になるのです。 3.で確保されたメモリ空間はどこからも参照されなくなるので、ガーベジコレクションといわれるJavaVMにより勝手にクリアされます。 ですので、方法としてはcar3 = car2;は使用せず、car1やcar2を作成したのと同様に行うことが一般的です。 ただ、cloneというメソッドもあり、コピーを作成することが出来る方法もあります。が、こちらは以上のことを理解されてから適切に使うことをお勧めします。

参考URL:
http://www.javaworld.jp/technology_and_programming/-/27077.html
arumisoy
質問者

お礼

ありがとうございます 助かります 読んですぐにはすべてが理解できませんが、 これからも勉強していきます

関連するQ&A

  • 実行するにはどうすれば良いのでしょうか?

    まず、 class Car{ private String name; private int width; private int height; private int length; private double x; private double y; private double fuel; Car(String name,int width,int height,int length,double fuel){ this.name=name; this.width=width; this.height=height; this.length=length; this.fuel=fuel; x=y=0; } double getX() {return x;} double getY() {return y;} double getFuel() {return fuel;} void putSpec(){ System.out.println("名前:"+name); System.out.println("車幅:"+width+"mm"); System.out.println("車高:"+height+"mm"); System.out.println("車長:"+length+"mm"); } boolean move(double dx, double dy){ double dist = Math.sqrt(dx*dx+dy*dy); if(dist < fuel) return false; else { fuel -= dist; x += dx; y +=dy; return true; } } } のファイルをcar.javaと名前をつけて保存しました。 次に import java.util.Scanner; class CarTester2{ public static void main(String[] args){ Scanner stdIn = new Scanner(System.in); System.out.println("車のデータを入力せよ。"); System.out.println("名前は:"); String name = stdIn.next(); System.out.println("車幅は:"); int width = stdIn.nextInt(); System.out.println("高さは:"); int height =stdIn.nextInt(); System.out.println("長さは:"); int length =stdIn.nextInt(); System.out.println("ガソリン量は:"); double fuel= stdIn.nextDouble(); Car myCar = new Car(name,width,height,length,fuel); while(true){ System.out.println("現在地("+myCar.getX()+","+myCar.getY()+")・残り燃料"+myCar.getFuel()); System.out.print("移動しますか[0…No/1…Yes]:"); if(stdIn.nextInt()==0) break; System.out.print("X方向の移動距離:"); double dx = stdIn.nextDouble(); System.out.print("Y方向の移動距離:"); double dy = stdIn.nextDouble(); if(!myCar.move(dx,dy)) System.out.println("燃料が足りません!"); } } } のファイルをCarTester2.javaという名前で保存しました。 この2つのファイルは同一フォルダに入っています。 それで、 javac CarTester2.javaという風にコンパイルしても 「エラー4  変数myCarのシンボルが見つけられません」 といった感じにコンパイルエラーとなってしまいます。 何が原因なのでしょうか?

  • 初心者なので教えてほしいです。

    下記のコードなんですが、どこか間違っていますか? テキスト通りに入力したはずなんですが、 『メソッド本体がないか、abstractとして宣言されています』 というエラーが出てしまいます。 どういう意味なのか分らなくて・・・ **************************************************** //車クラス class Car{ int num; double gas; } //車クラスのオブジェクトを作成する class Sample1{ public static void main(String[] args); { Car car1; car1 = new Car(); car1.num = 1234; car1.gas =20.5; System.out.println("車のナンバーは" +car1.num+ "です。"); System.out.println("ガソリンの量は" +car1.gas+ "です。"); } } *************************************************************

    • ベストアンサー
    • Java
  • "add"とは?f

    class Car { int num; double gas; void setNum(int n) { num = n; System.out.println("ナンバーを" + num + "にしました。"); } void setGas(double g) { gas = g; System.out.println("ガソリン量を" + gas + "にしました。"); System.out.println("この車は満タンで40リットル入ります。"); } void show() { System.out.println("車のナンバーは"+num+"です。"); System.out.println("ガソリン量は"+gas+"です。"); } } class Prog11_1 { public static void main(String args[]) { Car car1 = new Car(); Car car2 = new Car(); car1.setNum(1234); car1.setGas(20.5); car2.setNum(5678); car2.setGas(30.8); car1.addGas(10.0); car2.addGas(10.0); car1.show(); car2.show(); } } 上記のプログラムの足りないところを補い、完成させるというものなんですが、"add"というのは一体どのような役割を持っているものなんでしょうか? 分かる方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスのフィールドの比較方法

    2つのクラスのフィールドを比較して、その結果を以下のように表示させたいのですが、どのようにプログラミングをすればいいのでしょうか? 例 class Car { String carname; int height; int width; int length; } class Garage { String garagename; int height; int width; int depth; } public class example { public static void main (String[] args) throws IOException { Car car[]; car = new Car[5]; System.out.println("車の情報を入力してください。"); BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in); for(int i=0; i<5; i++){ car[i] = new Car(); System.out.println(i+1 + "台目の車の名前を入力してください。"); String str1 = br1.readLine(); System.out.println("車の高さを入力してください。"); String str2 = br1.readLine(); System.out.println("車の幅を入力してください。"); String str3 = br1.readLine(); System.out.println("車の長さを入力してください。"); String str4 = br1.readLine(); int h1 = Integer.parseInt(str2); int w1 = Integer.parseInt(str3); int l1 = Integer.parseInt(str4); car[i].carname = str1; car[i].height = h1; car[i].weith =w1; car[i].length =l1; } for(int i=0; i<5; i++){ garage[i] = new Garage(); System.out.println(i+1 + "つ目の車庫の名前を入力してください。"); String str5 = br2.readLine(); System.out.println("車庫の高さを入力してください。"); String str6 = br2.readLine(); System.out.println("車庫の幅を入力してください。"); String str7 = br2.readLine(); System.out.println("車庫の長さを入力してください。"); String str8 = br2.readLine(); int h2 = Integer.parseInt(str6); int w2 = Integer.parseInt(str7); int d2 = Integer.parseInt(str8); garage[i].garagename = str2; garage[i].height = h2; garage[i].weith =w2; garage[i].depth =d2; } } 出力例 garage1 car3 garage2 car5 garage3 car4 garage4 car2 garage5 car1 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスのフィールドの値を配列に代入する方法

    フィールドの値を代入したいのですが、 java.lang.ArrayIndexOutOfBoundsException というエラーが出てしまい、どうすればいいのかわかりません。 どのように対処すればいいのでしょうか? class Car { String carname; int height; int width; int length; } class public static void main(String[] args) throw IOException { Car car[]; car = new Car[5]; System.out.println("車の情報を入力してください。"); BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in); for(int i=0; i<5; i++){ car[i] = new Car(); System.out.println(i+1 + "台目の車の名前を入力してください。"); String str1 = br1.readLine(); System.out.println("車の高さを入力してください。"); String str2 = br1.readLine(); System.out.println("車の幅を入力してください。"); String str3 = br1.readLine(); System.out.println("車の長さを入力してください。"); String str4 = br1.readLine(); int h1 = Integer.parseInt(str2); int w1 = Integer.parseInt(str3); int l1 = Integer.parseInt(str4); car[i].carname = str1; car[i].height = h1; car[i].weith =w1; car[i].length =l1; } for(int i=0; i<5; i++){ int c_h[] = new int[5]; c_h[i] = car[i].height; } } よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaの戻り値のコード

    Java初心者です。returnの例文で分からない所があります。 (1)考え方として car1.setNumGas(1234, 20.5); の時点で void setNumGas(int n, double g) はvoid setNumGas(1234, 20.5)になり 次にgetNum( ) そのものを引っ張ってきているので、 ナンバーを調べました という文字まで一緒に引っ張らないのでしょうか? なぜ 次の行のretun文だけを拾うのですか? (2)returnのイメージがまだ出来ていません。 int number = car1.getNum(); とした時点で int getNum()  にジャンプし、 その中の returnを見つけ、 そしてreturnが numを使っている所をコードを下に降りて順に探しに行く というイメージで合ってますか? -------------------------------------------------------------------- return num; →よーし探しに行こう! まずdouble getGas()の中 → うーんない 次にvoid setNumGas(int n, double g) の中 { num = n;    →   お、あった! nは今1234だな、だから表示結果は1234 --------------------------------------------------------------------------- こんな認識で合ってますでしょうか? class Car { int num; double gas; int getNum() { System.out.println("ナンバーを調べました。"); return num; } double getGas() { System.out.println("ガソリン量を調べました。"); return gas; } void setNumGas(int n, double g) { num = n; gas = g; System.out.println("車のナンバーを" + num + "にガソリン量を" + gas + "にしました。"); } void show() { System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } class Sample6 { public static void main(String[] args) { Car car1 = new Car(); car1.setNumGas(1234, 20.5); int number = car1.getNum(); double gasoline = car1.getGas(); System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは"+ number + "ガソリン量は" + gasoline + "でした。"); } }

    • ベストアンサー
    • Java
  • 初心者Javaの件。

    いつも大変お世話になりありがとうございます。 初心者Javaの件です。 下記のコードがエラーになります。 修正方法を教えてください。 public class ToyShop { public static void main(String[] args) { Shopkeeper suzuki = new shopkeeper(); CarToy car1 = new CarToy(); CarToy car2 = new CarToy(); TrainToy train1 = new TrainToy(); suzuki.name_= "鈴木"; car1.code_ ="c001"; car1.price_ = 500; car2.code_ ="c002"; car2.price_ = 500; train1.code_ ="t001"; train1.price_ = 700; System.out.println(suzuki.name_); System.out.println(car1.code_); System.out.println(car1.price_); System.out.println(car2.code_); System.out.println(car2.price_); System.out.println(train1.code_); System.out.println(train1.price_); car1.go(); car1.light(); car2.go(); car2.light(); train1.go(); train1.horn(); } } エラーメッセージ: エラー: メイン・クラスToyShopが見つからなかったかロードできませんでした

  • javaの問題

    import java.util.Scanner; class test6{ static void printArray(int[] a) { for(int i=0;i<a.length;i++) System.out.print(String.format("%1$6s", (a[i]+" "))); System.out.println(); } static void printArray(int[][] a) { for(int[] i:a) { for(int j:i) System.out.print(String.format("%1$6s",(j+"\t"))); System.out.println(); } } public static void main(String[] args) { int[] a = {12,536,-8,7}; int[][] c = {{32,-1,32,45,67}, {535,99999,2}, {2,5,-123,9}}; printArray(a); printArray(c); } } このプログラムを表示するとこのようになるのですが、 12 536 -8 7 32 -1 32 45 67 535 99999 2 2 5 -123 9 これに一工夫加えて見やすくしたいです。 このような形にするのはどのようにすればよいのでしょうか + + | 32 -1 45 67 | | 535 99999 2 | | 2 5 -123 9 | + +

  • 初歩的な メソッドの引数について

    参考書のサンプルなんですが、 Carクラスのメソッドの引数のところで num = n と代入しているのですが、 これを直接void setNum(int num)としたほうがらくだと思うのですがなにか意味があるのでしょうか? class Sample4{ public static void main(String args[]){ Car car1 = new Car(); car1.setNum(33); } } class Car{ int num; void setNum(int n){ num = n; System.out.println("台数" + num); } }

    • ベストアンサー
    • Java
  • Javaの問題

    (1) /* CarApp.java */ public class CarApp{ public static void main(String[] args){ Car c2 = new Car(4,45,5); System.out.println("乗員数:"+c2.getPeple()); System.out.println("タイヤ数:"+c2.getTire()); System.out.println("ガソリン残量:"+c2.getGas()); c2.setPeople(8); c2.ridePeople(10); c2.ridePeople(3); for(int i=0; i<179; i++) c2.speedUp(); for(int i=179; i<182; i++){ c2.showSpeed(); c2.speedUp(); } for(int i=0; i<179; i++) c2.speedDown(); for(int i=179; i<182; i++){ c2.showSpeed(); c2.speedDown(); } } } ____________________________________ /* Car.java */ class Car{ private int tire , people , speed ; //タイヤ数、乗員数、速度 private int 【****】,【***】; private double gas; //ガソリン public Car(int tire, double gas, int people){ this.tire = tire; this.gas = gas; this.people = people; speed = 180; nowPeople = 0; nowSpeed = 0; } public double getGas(){ 【****】} public int getPeople() { 【****】 } public int getTire() { 【****】 } public int getSpeed() { 【****】 } public void setSpeed(int speed){ this.speed = speed; } public void speedUp( ) { if(speed < nowSpeed+1 ){ 【****】 【****】 } else{ nowSpeed++; } } public void speedDown( ) { if(nowSpeed-1<0){ 【****】 else{ nowSpeed--; } } public void showSpeed( ) { 【****】 } public void setPeople(int people){ 【****】 showPeople( ); } public void ridePeople(int ride) { int tmp = nowPeople + ride; if(【****】 ) { 【****】; } else { 【****】; } showPeople( ); } public void showPeople( ) { System.out.println(【****】) ; } public void show(){ System.out.println("タイヤ数" + tire); System.out.println("ガソリン" + gas); System.out.println("乗員数:" + people); } } 実行結果 >java CarApp2 ガソリン残量:45.0 定員数:8 現在の乗員数:0 定員オーバーです 定員数:8 現在の乗員数:0 定員数:8 現在の乗員数:3 速度:180 現在の速度:179 速度:180 現在の速度:180 最大速度です 速度:180 現在の速度:180 最大速度です 速度:180 現在の速度:1 速度:180 現在の速度:0 既に停止しています 速度:180 現在の速度:0 既に停止しています ___________________ (2) /* RaceCarApp2.java */ public class RaceCarApp2{ public static void main(String[] args){ RaceCar2 rc2 = new RaceCar2("JapanTour", "TouringCar",350); System.out.println("乗員数:" + rc2.getPeople()); System.out.println("タイヤ数:" + rc2.getTire()); System.out.println("ガソリン残量:"+rc2.getGas()); rc2.show(); for(int i=0; i<349; i++) rc2.speedUp(); for(int i=349; i<352; i++){ rc2.showSpeed(); rc2.speedUp(); } for(int i=0; i<349; i++) rc2.speedDown(); for(int i=349; i<352; i++){ rc2.showSpeed(); rc2.speedDown(); } } } _______________________________ class RaceCar2 extends Car{ String raceName; String type; public RaceCar2( String raceName, String type , int speed ){ 【****】; //親のコンストラクタ this.raceName = raceName; this.type = type; 【****】; //スピード設定 } public void show(){ 【****】; 【****】; 【****】; } } 実行結果 >java RaceCarApp2 乗員数:0 タイヤ数:4 ガソリン残量:30.0 Type:TouringCar RaceName:JapanTour タイヤ数4 ガソリン30.0 乗員数:1 速度:350 現在の速度:349 速度:350 現在の速度:350 最大速度です 速度:350 現在の速度:350 最大速度です 速度:350 現在の速度:1 速度:350 現在の速度:0 既に停止しています 速度:350 現在の速度:0 既に停止しています __________________________ この様になるように【****】部分を埋め回答せよという問題です。 途中まで自分でやってみましたが、エラーが出てしまうため断念してしまいました。 回答お願いします。