• 締切済み

インナークラスの身近な例

Javaにインナークラスってあるじゃん。理解が難しいのですが、身近な例がありますでしょうか? スーパークラスとサブクラスは分かり易いですよね。 class Car{ void accelerate(){System.out.print("加速");} void stop(){System.out.print("停止");} } class Taxi experience Car{ void pay(){System.out.print("交通費を支払う");} } こんな感じで、自動車とタクシーの親子関係が分かります。Javaの解説書にもよく書いてある例だね。 その一方で、インナークラスはドーかしら? class OuterClass{ void outer(){System.out.print("外");} class InnerClass{ void inner(){System.out.print("内");} } } これだと、必要性がわかりにくいです。「クラスの中にもクラスが書けるのね」とは思うのですが、「クラスの中にクラスを書きたい」とは思いません。 色々と解説書を調べて見たのですが、どれもこれもプログラム例がこんなのばっかです。 class Train{ void gateopen(){System.out.print("切符で改札を入る");} class GreenCar{ void check(){System.out.print("乗務員にグリーン券を見せる");} } } こんな感じ?

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

みんなの回答

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.1

小さな例ではインナークラスの必要性は分かりにくいでしょうね。 例えるなら2人しかいないのにクラスなのに「チーム分けできます」と告げられたような状況ですから。 例えば60行ほどになる記述で50行が対象インスタンスが異なるだけの4行からなる同じ条件分岐だとしたらどうです?

関連するQ&A

  • ローカルインナークラス

    ローカルインナークラスとは、 メソッド内で宣言されるクラス、 ですよね? ある問題に 「メソッドのブロック内でローカルインナークラスを定義した場合正しいものを選びなさい。 ○、インナークラスはfinalで宣言されたローカル変数しか使えない」 ???? ローカルクラスは「外部クラスのメンバ変数への参照更新は可能」ですよね??? 例 class Outer{   int count=0;     void func(){       class Inner{         void display(){           count++;         }       }     } } 外部クラスのcountにアクセスできますよね?? 問題が間違っているのか、 私が考え違いをしているのか、教えてください。

    • ベストアンサー
    • Java
  • スーパークラスとサブクラスについて

    Parent pc = new Children(); pc.getName(); 下記、2つのクラスがある状態で上記のようにしてgetName()を実行したところ サブクラスのgetName()が呼ばれました。このことからpcオブジェクトの実態はChildrenクラス なのだと理解していたのですが、サブクラスにしか存在しないメソッドを呼ぼうとして pc.getChildName()と記述したところコンパイルエラーになってしまいました。 pc.getParentName()となら記述することができるのですがpcオブジェクトのをどう理解すれば よいのでしょうか。 【親クラス】 public class Parent { public void getName() { System.out.println("Parent"); } public void getParentName() { System.out.println("親クラス特有のメソッド"); } } 【サブクラス】 public class Children extends Parent{ @Override public void getName() { System.out.println("Children"); } public void getChildName() { System.out.println("サブクラス特有のメソッド"); } }

    • ベストアンサー
    • Java
  • クラスの拡張について

    Teacher クラスを変更し、newTeacher()の時は、名前「TARO」、年齢「25」、科目「国語」で初期化し、newTeacher(名前、年齢、科目)のときはそれぞれのパラメータでオブジェクトを作るようにしたい。 Person クラスのコンストラクタが使ってもかまわない という問題で //ClassRoom3.java class Person{ String name; int age; Person(String name,int age){ this.name = name; this.age = age; } void print(){ System.out.println("[Name]"+name); System.out.println("[age]"+age); } } class Teacher extends Person{ String subject; void print(){ System.out.println("私は"+name+" といいます。"); System.out.println("年齢は"+age+" 才です。"); System.out.println(subject+" を教えています。"); } } class ClassRoom3{ public static void main(String args[]){ Teacher obj1 = new Teacher(); Teacher obj2 = new Teacher("JIRO",27,"算数"); obj1.print(); System.out.println(); obj2.print(); } } /* 実行例 >java ClassRoom3 私は TARO といいます。 年齢は 25 才です。 国語 を教えています。 私は JIRO といいます。 年齢は 27 才です。 算数 を教えています。 */ という出力結果をだしたいのですが、なんどもやっても失敗してしまい。なかなかできません。 どう直したらよいのですか?

  • インナークラスについて

    JAVAについて友人に質問されたのですが、 わかりやすく解説をすることが出来ませんでした。 よろしくお願い致します。 ----------------------------------------------- インナークラスについてですが、 ローカルクラスの修飾子はabstractと finalのみ可なのは、どういった理由からですか? それと、ローカルクラスと匿名クラスは、 そのクラスを宣言しているメソッドの final変数のみ参照が可能というのは どういった理屈でfinalのみなのでしょうか?

    • ベストアンサー
    • Java
  • 別ファイルのclassの読み込みについて

    Javaを勉強し始めたばかりのものです。 購入した参考書を見ながら勉強していますが、表題の件の項目で参考書ではうまくいくように表記されておりますが、実際にやってみると下記エラーが表示されます。 --------------------------------------------- C:\XXXXXXXXXX>javac ../../sample/Sample1.java ..\..\sample\Sample1.java:3: シンボルを見つけられません。 シンボル: クラス Car 場所 : Sample1 の クラス Car car1 = new Car(); ^ ..\..\sample\Sample1.java:3: シンボルを見つけられません。 シンボル: クラス Car 場所 : Sample1 の クラス Car car1 = new Car(); ^ エラー 2 個 ------------------------------------------------------ ちなみに下記はソースとなります。 -------------------------------------------- 【Car.java】 //Carクラス class Car { private int num; private double gas; public Car(){ num = 0; gas = 0.0; System.out.println("車を作成しました。"); } public void setCar(int n, double g){ num = n; gas = g; System.out.println("ナンバーを" + num + "ガソリン量を" + gas + "にしました。"); } public void show(){ System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } 【Sample1.java】 class Sample1 { public static void main (String args[]){ Car car1 = new Car(); car1.show(); } } --------------------------------------------------- なんとなくエラーが出るだろうとはわかりますが、上記の記載方法だとやはりうまくいかないのでしょうか? お忙しいところ申し訳ありませんが、どなたかご教示の程お願いいたします。

    • ベストアンサー
    • Java
  • 親クラスの初期化についてご教授ください

    javaの勉強を始めた者です。質問させてください。 以下のようなコードの、 親クラスの初期化をしている部分の挙動が、 うまく理解できません。 class p{ public int i = 3; public void foo(){}; } class c extends p{ public int i = 0; public void foo(){ System.out.print("foo "); } } public class b{ public static void main(String[] s){ p bar = new c(); // ←ここです bar.foo(); System.out.print(bar.i); } } 実行結果は「foo 3」です。 以下の点が理解できません。 ・なぜメソッドは子クラスのものが実行されるのに、プロパティは親クラスのものが表示されるのか? ・子クラスのコンストラクタを利用することで、いったいどのような挙動となるのか? オブジェクト指向の基礎を理解しれません・・・よろしくお願いします。

    • ベストアンサー
    • Java
  • オーバーライドの必要性

    まだまだJavaを勉強している途中なのですが、下記のサンプルコードでオーバーライド(メソッドをオーバーロードすることをオーバーライドというのでしょうか…!?)のの必要性がよく分からなくなってしまったので質問させて頂きました。 /* sample.java */ abstract class super_class{  void write(){} } class CLASS1 extends super_class{  void write(){ System.out.println("CLASS1"); } } class CLASS2 extends super_class{  void write(){ System.out.println("CLASS2"); } } class sample{  public static void main(String args[]){   super_class obj = new CLASS2();   obj.write();   obj = new CLASS1();   obj.write();  } } 以上のコードを実行した場合 CLASS2 CLASS1 と表示されるのは多少なりとも勉強して分かったつもりでした…。 しかし、あくまでサンプルであるために特に意味がないことでもオーバーライドの説明をしているのだろうという風に考えてしまったのですが、 結局は、 スーパークラスとサブクラスに同じシグネチャのメソッドがあった場合、各サブクラスのメソッドが実行される と言うことは、スーパークラスのwrite()メソッドは何をしているのでしょうか? 多様性はJavaでも大切なものであるとのことなので質問させて頂きました。 なるべくわかりやすく説明して頂きたいと思います。 どうかお答えをお願いします。

    • ベストアンサー
    • Java
  • publicクラス

    クラスの修飾子にpublicをつける理由を教えて下さい。 さらに、なにも修飾子をつけなときは 同一パッケージ(ファイル)内からでしかアクセスできないはずですよね? Test.javaとBase.javaを以下のように定義します。 class Test { public static void main(String[] args) { Base b = new Base(); } } class Base { public void show() { System.out.println("hello!"); } } この2つのファイルは同じディレクトリにあります。 public修飾子をつけていないにも関わらず、なぜインスタンス化ができるのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • クラスを呼び出した時のオブジェクト名の出力について

    ご覧いただいてありがとうございます。 java勉強中の者です。現在クラスについての勉強をしています。 質問内容ですが、クラスを呼び出した時に対象のオブジェクトの名前を表示させたいというものです。 以下、サンプルのコードを記載してその後詳しい説明をします。 class Car{//車の情報を保持 int number; //車のナンバーを保持 double gas;//ガソリンの量を保持 void show(){//車の情報を出力 NAMEの部分は後程説明します System.out.println("車のナンバーは"+ number +"です。"); System.out.println("車のガソリン量は"+ gas +"です。"); } public class Sample1{ public static void main(String[] args){ Car car1 = new Car();//car1のオブジェクト car1.number = 1111; car1.gas = 10; Car car2 = new Car(); car2.number = 2222; car2.gas = 20; car1.show(); } 以上がサンプルのプログラムです。 上記のclass Car内のvoid show()の中にあるSystem.out.printlnの2つの文あたりです。 「車のナンバーは~」の直前に、呼び出したオブジェクトの名前を出力したいのです。今回であれば、メインメソッド内の一番下の「car1.show();」のオブジェクト名を表示させたいです。 具体的には「car1の車のナンバーは1111です。」と表示させたいです。 関数か何かがあるのかと思い、少し調べてみましたが見当たらなかったため投稿させていただきました。関数が存在しないのであれば、具体的な簡単なサンプル等書いていただけるととてもありがたいです。 よろしくお願いします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • クラス名

    JAVAの初心者です。 今実行しているクラスのクラス名を求めたいのですが うまくいかず困っております。 public class Person {   public static void main(String args[]);   {     String classname;     classname = this.class.getClass().getName();     System.out.println(classname);   } } イメージ的にはこんな感じなのかなと思ってやってみたのですが、 どうやら違うみたいです。どうぞご教授よろしくおねがいします。

    • ベストアンサー
    • Java