• 締切済み

public class

★mybicycle1というオブジェクト★       ↓ public class myBicycle1{ private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public myBicycle1(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; id = ++numberOfBicycles; } public int getID() { return id; } public static int getNumberOfBicycles() { return numberOfBicycles; } public int getCadence(){ return cadence; } public void setCadence(int newValue){ cadence = newValue; } public int getGear(){ return gear; } public void setGear(int newValue){ gear = newValue; } public int getspeed(){ return speed; } public void applyBrake(int decrement){ speed -= decrement; } public void speedUp(int increment){ speed += increment; } } ☆これの初期状態を ペダル回転数 60 スピード 0 ギア 1 ☆次にmybicycle2というオブジェクトで ペダル回転数 62 スピード 0 ギア 1 ☆作られた直後のmybicycle1,2に情報を出力できるようにする 自転車ナンバー(ID) 回転数 スピード ギア です。どなたか分かる方よろしくお願いします。。

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

みんなの回答

  • zozy
  • ベストアンサー率60% (20/33)
回答No.2

オブジェクト思考の概念が理解しきれていない ようなので、回答を交えつつ説明させていただきます。 (具体的に指摘するとオブジェクトとインスタンスの理解がごっちゃになってるように見えます) このプログラムでは まず、myBicycleクラスで自転車の設計図を書いています。 メインクラスは自転車を作っている人と考えられます。 自転車の設計図の初期手順がコンストラクタにあたります。 コンストラクタとは public myBicycle1(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; id = ++numberOfBicycles; } の部分です。 -------------------------超重要--------------------------------- 下記ではメインクラスからなにかをすると表記していますが、このプログラムの設計上そうする必要があるからであって、 下記のことは別名のクラスからであればメインクラスからでなくてもできます。 ---------------------------------------------------------------- myBicycle1のよこの()の中身は引数と言って、メインクラスで インスタンスを生成した際に設定します。 このプログラムでは初期値に引数を代入してますね。 つまりは、インスタンス生成時に初期値を設定できます。 次にメインクラスでmyBicycleクラスのメソッドや変数を 使うにはインスタンスを生成する必要があります。 インスタンスを生成するということはつまり、 myBicycleという設計図に沿って自転車を作ることを意味します。 上記でも述べたとおり、このタイミングにコンストラクタの引数を設定します。 myBicycle mybicycle1=mybicycle(60,0,1); なお、 myBicycle mybicycle2=mybicycle(60,0,1); としたときにはmyBicycle1の設計図に沿っていますが mybicycle1とは別個の自転車を作っています。 次にsetterメソッドについて説明します。 public void setGear(int newValue){ gear = newValue; } のような(void メソッド名で宣言)ものをsetterメソッドといいます。 setterメソッドとはメインクラスからmyBicycle1クラスの変数を設定(このプログラムの場合は変更)するために使用します。 つまり、自転車の製作途中に設計図を変更するということにあたります。 メインクラスからは使用するには インスタンス名.setterメソッド名(引数); myBicycle2.setCadance(62); としましょう。 *重要*なぜ、こんなめんどくさい手続きを踏む必要があるかというと、作ってる人が勝手に設計図を変更すると困ったことになりますね? または、設計図の内容が独りでに変わっても困ります。(現実ではありえませんがプログラムではありがちなことです。) 最後にgetterメソッドについてです。 public int getCadence(){ return cadence; } のようなもの(返り値については下記で解説します) 返り値の型 getterメソッド名(){ return 返り値; } になります。 getterメソッドとはmyBicycle1クラスから変数の値をとってくるために利用します。その変数が上記の返り値にあたります。 メインクラスから使用するには インスタンス名.getterメソッド名(); とします。 つまり、System.out.print(mybicycle1.getCadance()); とすれば、mybicycle1のペダルの回転数が出力されます。 -------------下記のことは気が進んだら読んでください------------- Q,ぶっちゃけ、setter,getterメソッドとかなくてもプログラム書けるんじゃない? A,確かになくても、書けますね。   ただ、javaの設計ポリシー上はとっても重要です。   そもそもjavaはネイティブな言語など(大体はC言語です)で設計さ  れていますが、基になっているCとは大きく違うところがありま   す。それは仮想マシン上のメモリーを参照するということです。C  では使用するメモリーを自分で指定するのでめんどくさい上に危険  です。   たとえば、OSの格納されているメモリーの中身変更した→OS動かな   い。もっとも、エラーになることがほとんどだそうですが。   それでも厄介ですね。   その点javaは使っていいメモリー空間を事前に用意するので安全で   す。  その安全性を確保するため、またはめんどくさくないようにするた   めにC言語で書かれている部分を使用者に勝手にいじらせない必要  があるわけです。そのためにsetter,getterメソッドの概念が必要だ   ったわけです。  これはjava言語自体の設計だけにかかわらず、多人数で同じプログ  ラムを開発するさいでも、役に立つようです。まぁ、一人で作る際  にでも安全だし、見やすいプログラムになるので使っとくべきでし  ょうね。

sayo0824
質問者

お礼

ありがとうございます!! とっても助かりました☆ 分かりやすい内容で理解できました 本当にありがとうございます。

  • zozy
  • ベストアンサー率60% (20/33)
回答No.1

学校の課題のように見えるのであえて答えはいわず、ヒントとして手順だけを回答させていただきます 1)mainクラスでmybicycle1とmybicycle2というインスタンスを生成 インスタンスの引数はコンストラクタの引数の指定、つまり初期値になります 2)最後に情報の出力ですが、mybicycle1,2のgetterメソッドから取り出すことができます。(getterメソッドそのものが情報になります) 以上が手順になります。 回答でわからない点、わからない用語などがありましたら返信ください

sayo0824
質問者

補足

回答本当に助かります!! 1)で public myBicycle1(int startCadence, int startSpeed, int startGear){ startGear = 1; startCadence = 60; startSpeed = 0; id = ++numberOfBicycles; } //////////////////////////////////////// public myBicycle2(int startCadence, int startSpeed, int startGear){ startGear = 1; startCadence = 62; startSpeed = 0; id = ++numberOfBicycles; } にすればよろしいのでしょうか?

関連するQ&A

  • クラスの設計の問題

    今C++でクラスの設計をしています。 どう設計すれば、いいか分からないので、しっている方に教えていただきたいですが。 class A{ private: int id; public: int getId(); void setId(); }; class B{ private: int id; public: int getId(); void setId(); } class C{ private: int id; public: int getId(); void setId(); } この三つのクラスが、共通な機能があります。また、実装も同じで、 継承を利用して、どう設計すれば、いいですか? よろしくお願いします。

  • classを使って座標軸を求めるコード

    やさしいJavaからの問題です。 次のように、整数値の座標をあらわす MyPoint クラスを作成してください。 フィールド private int x; (X座標) private int y; (Y座標) メソッド public void setX(int px); (X座標を設定する) public void setY(int py); (Y座標を設定する) public int getX(); (X座標を得る) public int setY(); (Y座標を得る) という問題で、回答は以下の通りですが、 class MyPoint { int x; int y; void setX(int px) { x = px; } void setY(int py) { y = py; } int getX() { return x; } int getY() { return y; } } class Sample5 { public static void main(String[] args) { MyPoint p1; p1 = new MyPoint(); p1.setX(10); p1.setY(5); int px = p1.getX(); int py = p1.getY(); System.out.println("p1のX座標は" + px + "Y座標は" + py + "でした。"); } } 教科書の関連の章ではreturnが先に来ているのですが、突然この問題ではvoidから始まっているのですが、int getX()~return y;までとvoid setX~y = py;までの部分 の順番を変えてもいいですか?

    • ベストアンサー
    • Java
  • public class Power {

    public class Power { static long pow(int a, int b){ if (b<=0) return 1; else return a*pow(a,b-1); } public static void main(String args[]){ System.out.println(pow(1,3)); } } run: 1 BUILD SUCCESSFUL (total time: 0 seconds) 簡単な問題ですが。。。 僕の予想では答えは2でした 1 * (1, 2) 1 * 1 * 2 じゃないんですか?

    • ベストアンサー
    • Java
  • java classの呼び出し方を教えて下さい。

    java classの呼び出し方を教えて下さい。 public class test extends Applet implements Runnable,ActionListener,KeyListener{ Thread th; // スレッド宣言 AudioClip IdoSound,KaitenSound,KesiSound,SetSound,CrySound; public void init(){ }   ・   ・   ・ public void test(){ ここで、最下欄の class stream{ public static void main(String args[]){ } を実行させたいのですが、記入方法が解りません・・・ } public int kesiOne(int VP,int HP){ }    ・    ・    ・ class stream{ public static void main(String args[]){ try{ File file = new File("c:\\java\\data.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); pw.println("12345"); pw.close(); }else{ System.out.println("ファイルに書き込めません"); } }catch(IOException e){ System.out.println(e); } } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } } 解りにくい書き方で申し訳け有りませんが、宜しくお願いします。

  • javaの同期について

    javaの同期について package rwlock; public class App1 extends Thread { static private final int REFER = 0; static private final int UPDATE = 1; static private final int[] conf1 = { REFER, REFER, REFER, UPDATE }; static private final int[] conf2 = { REFER, UPDATE, REFER, REFER }; static private MyObj0 mo = new MyObj0(); // App1 + MyObj0 int id; private int[] conf; public App1(int id, int[] conf) { this.id = id; this.conf = conf; } public void run() { long tStart = Time.current(); for (int i = 0; i < conf.length; i++) { switch(conf[i]) { case REFER: mo.refer(); break; case UPDATE: mo.update(); break; default: assert false : "internal error"; } } if (id == 1) { Time.printElapsed(tStart); } } public static void main(String[] args) { App1 th1 = new App1(1, conf1); App1 th2 = new App1(2, conf2); th1.start(); th2.start(); } } public class MyObj0 { private Object countLock = new Object(); private int count; private void enter() { synchronized(countLock) { count++; } } private void leave() { synchronized(countLock) { count--; } } public MyObj0() { count = 0; } public void refer() { enter(); Time.sleep(300); leave(); } public void update() { enter(); synchronized(countLock) { assert count == 1; } Time.sleep(500); leave(); } において、updateの実行中は、他のスレッドでもupdateもreferも実行されないが、二つのスレッドで同時にreferは実行されうるという条件を満たすにはどうしたらよいでしょうか?updateにsynchronizedをつけてみましたが、referが同時に実行されてしまいました

    • ベストアンサー
    • Java
  • javaの同期について

    javaの同期について package rwlock; public class App1 extends Thread { static private final int REFER = 0; static private final int UPDATE = 1; static private final int[] conf1 = { REFER, REFER, REFER, UPDATE }; static private final int[] conf2 = { REFER, UPDATE, REFER, REFER }; static private MyObj0 mo = new MyObj0(); // App1 + MyObj0 int id; private int[] conf; public App1(int id, int[] conf) { this.id = id; this.conf = conf; } public void run() { long tStart = Time.current(); for (int i = 0; i < conf.length; i++) { switch(conf[i]) { case REFER: mo.refer(); break; case UPDATE: mo.update(); break; default: assert false : "internal error"; } } if (id == 1) { Time.printElapsed(tStart); } } public static void main(String[] args) { App1 th1 = new App1(1, conf1); App1 th2 = new App1(2, conf2); th1.start(); th2.start(); } } public class MyObj0 { private Object countLock = new Object(); private int count; private void enter() { synchronized(countLock) { count++; } } private void leave() { synchronized(countLock) { count--; } } public MyObj0() { count = 0; } public void refer() { enter(); Time.sleep(300); leave(); } public void update() { enter(); synchronized(countLock) { assert count == 1; } Time.sleep(500); leave(); } において、updateの実行中は、他のスレッドでもupdateもreferも実行されないが、二つのスレッドで同時にreferは実行されうるという条件を満たすにはどうしたらよいでしょうか?updateにsynchronizedをつけてみましたが、referが同時に実行されてしまいました。

    • ベストアンサー
    • Java
  • Javaについて教えてください!

    public class Number{ private final String noo; private int ct; public Number(String noo){this.noo = noo;} public String getName(){return noo;} public void increment(){ct++;} public int getCount(){return ct;} public void reset(){ct = 0;} } このクラスを複数スレッドで使うためには、reset()とgetName()とgetCount()をsyncronizedで宣言すれば可能ですか?

    • ベストアンサー
    • Java
  • シンボルが解釈できない???

    ファイルは全て同じディレクトリ中に入っています。 ItemS.javaというファイルをコンパイルするとシンボルを解釈処理できません,というエラーが表示されます。ソース内容は以下です。 //商品ID指定による商品の検索 public Item getItem(int id) { Item item = null; for(int i = 0; i < items.size(); i++) { item = getItemByIndex(i); if(item.getId() == id) { return item; } } return null; } <エラー内容MS-DOSより> Items.java:39:シンボルを解釈処理できません。 シンポル : クラス Item 位置 :Itemのクラス public Item getItem(int id) {     ^ という内容です。 ちなみにItem.javaの一部ソース内容です。 private int id; public class Item { public Item(int id, String name, double price) { this.id = id; }  //商品IDプロパティ public void setId(int id) { this.id = id; } public int getId() { return id; }   以上です。なぜ解釈処理されないか原因が分かりません。アドバイスお願い します。

    • ベストアンサー
    • Java
  • staticで初期化した変数(?)を使って初期化

    次の3つのプログラム、1番目はコンパイルエラーになりますが、下2つはエラーになりません。1番目のプログラムのエラーメッセージ:初期化子が定数ではありません。 処理系にかかわらずそうだとしたら、その理由はなんでしょうか。 ---------------------------------- int main(void) { static int a=5; static int b=a; return 0; } ---------------------------------- int main(void) { static int a=5; int b=a; return 0; } ---------------------------------- int main(void) { int a=5; int b=a; return 0; }

  • 参照・値渡しについて

    下記プログラム(ソース1)を実行すると「1」という値が出力されます。しかし、2行目をprivate static int a;とすると「0」という値が出力されます。 オブジェクトは参照渡しで基本データ型は値渡しと思ったのですが、2行目の値をString型で行ったところ全く変更されていない値が出力されました。(ソース2) 一体どういうことでしょうか? 回答のほどよろしくお願い致します。 (ソース1) public class X{ private static int a[] = new int[1]; public static void main(String []args){ modify(a); System.out.println(a[0]); } public static void modify(int a[]){ a[0]++; } } (ソース2) public class X{ static String a = "a"; public static void main(String []args){ modify(a); System.out.println(a); } public static void modify(String a){ a = "b"; } }

    • ベストアンサー
    • Java