0.2 この講座の趣旨
... さて、次章から解説を始めますが、その前に、「Javaの基本的な使い方」については理解しておくようお願いいたします。 と言っても、「簡単なクラスの作り方」「変数の宣言」「最初にmain()メソッドが呼び出される」や、「ソースファイルの作り方」「コンパイルと実行」といったことができれば問題ありません。 具体的に言えば、上記のプログラムを「SortWithComparator.javaソースファイルに...
3.1 メソッドを作ってみよう
...) { // HasMethodクラスの参照型変数とインスタンスを作ります。 HasMethod ref = new HasMethod(); // printHello()メソッドを呼び出します。 ref.printHello(); // 出力結果: // Hello world! } } このプログラムのHasMethodRunnerクラスは「メソッド」を1つ...
3.2 メソッドからフィールドを使ってみる
...eld ref = new HasMethodAndField(); // dataフィールドに数値を入れます。 ref.data = 100; // printData()メソッドを呼び出します。 ref.printData(); // 出力結果: // 100 } } このプログラムのHasMethodAndFieldクラスは、dataフィールドとprintD...
3.3 thisフィールドで自分を見る
...hisField ref = new UseThisField(); // dataフィールドに数値を入れます。 ref.data = 100; // printData()メソッドを呼び出します。 ref.printData(); // 出力結果: // 100 } } このプログラムのUseThisFieldクラスは、前ページのHasMethodAndFiel...
3.4 フィールドを守ろう!
...dRunner.java:40: // dataPrivate は PublicOrPrivateField で private アクセスされます。 // printData()メソッドを呼び出します。 ref.printData(); // 出力結果: // 100 // 0 // 注: // フィールドは自動的に0が入れられるので0が出力されます。 } } ...
4.3 staticメソッドからstaticフィールドを使う
...staticメソッドが作られます。 静的領域のstaticメソッド staticメソッドの使い方は、staticフィールドと同じ「クラス名.メソッド名()」となります。 staticメソッドを呼び出す箇所(再掲) // staticメソッドで出力します。 HasStaticMethod.printData(); staticメソッドはstaticフィールドを使うことができます。...
4.5 main()メソッドと「実行するクラス」
...は、まずHasMainRunnerクラスの静的領域を作成します。 次に、静的領域の中から「メソッド名が『main』で引数が『String[]』のstaticメソッド」を探します。 見つけたらそれを呼び出します。 HasMainRunnerクラスを実行する 呼び出したら、main()メソッドの中でHasMainクラスのインスタンスを作り、dataフィールドに数値を入れて出力する、といういつもの...
5.3 オーバーライドで「上書き」する
...ng[] args ) { // インスタンスを1つ作ります。 OverridedSub ref = new OverridedSub(); // printMyName()メソッドを呼び出します。 ref.printMyName(); // 出力結果: // OverridedSub } } まず、フツーのクラス、HasOneMethodSuperクラスがありま...
5.4 オーバーライドされたメソッドを呼び出すと?
オーバーライドされたメソッドを呼び出すと? このページで説明する内容は、実は非常に重要な内容です。 結構さらっと説明していますが、ここで説明したことを後で出てくる重要な項目に使うので、しっかり覚えておいてください。 「上書き...
5.5 スーパーからサブは見えません
...Runner.java /** * 普通のクラス。 * メソッドを1つ持ちます。 */ class UseSubClassSuper { /** * printMyName()メソッドを呼び出すメソッドです。 */ void callPrintMyName() { // サブクラスのprintMyName()メソッドを……? printMyName(); // コンパ...
6.1 オーバーライドするとメソッドはなくなる?
...per2 { /** * 自クラスの名前を出力するメソッドです。 * オーバーライドしています。 */ void printMyName() { // スーパークラスのメソッドを呼び出します。 super.printMyName(); } } /** * 実行用クラス。このクラスを実行してください。 */ class UseSuperSubRunner { publ...
6.2 3段以上オーバーライドしたら?
... args ) { // SubOfSubクラスのインスタンスを1つ作ります。 SubOfSub ref = new SubOfSub(); // printMyName()メソッドを呼び出します。 ref.printMyName(); // 出力結果: // SubOfSub // Subクラスのインスタンスを1つ作ります。 Sub ref2 = new Sub...
6.5 「スーパー」と「サブ」の意味は?
...perクラスから継承するので、インスタンスを作ると共通機能も持つことができます。 こうして作られたクラスの内、共通部分のクラスは「スーパーセット」の機能を持つクラスなので「スーパークラス」と呼びます。 そして、各インスタンスの部分のクラスは「サブセット」の機能を持つクラスなので「サブクラス」と呼びます。 というわけで、「スーパークラス」「サブクラス」という名前が付けられたわけです。 ...
7.3 オーバーライドされたメソッドを呼び出すと?再び
オーバーライドされたメソッドを呼び出すと?再び オーバーライドされたメソッドを呼び出す 前ページでは、アップキャストをすることで「使えるフィールド・メソッドがスーパークラスのものに限られる」ということを説明しました。 この状...
7.4 ポリモーフィズム!
ポリモーフィズム! 「ポリモーフィズム」しよう! 前ページで説明したように、スーパークラスの参照を通してメソッドを呼び出しても、そのメソッドがオーバーライドされていたら、オーバーライドしたメソッドが呼び出されます。 この機能を使うと「ポリモーフィズム」という面白い機能を使うことができます。 まずは具体例を見てみま...
7.5 インスタンスはどのクラス?
...を使って // インスタンスを取得します。 PolySuper2 refSuper = PolySuper2.getInstance( i ); // printMyName()メソッドを呼び出します。 refSuper.printMyName(); // 出力結果はコマンドライン引数にどの値を渡したかで変わります。 } } 前回の例と、スーパークラス・サブクラスはほぼ同...
8.1 「ポリモーフィズム」ってどういう意味?
...組み合わせて、「ポリ-モーフィズム」となります。 日本語では「多態性」(たたいせい)、もしくは「多相性」(たそうせい)と訳されています。 前の章で説明したとおり、ポリモーフィズムは「同じメソッドを呼び出しているのにインスタンスによって結果が変わる」というものです。 これはつまり、一見スーパークラスを使っているように見えて、実際には違うクラスを使っていた、つまり「姿を変えていた」ということになるわ...
8.2 Objectクラスってなに?
...ラスの参照型変数とインスタンスを作ります。 ObjectInherited ref = new ObjectInherited(); // ObjectクラスのtoString()メソッドを呼び出します。 String str = ref.toString(); System.out.println( str ); // 出力結果: // ObjectInherited@39...
8.3 アップキャストしたあと元に戻すには?
...照型変数はスーパークラスの型にします。 NoMemberSuper refSuper = new AddedMethodSub(); // refを通してprintMyName()メソッドを呼び出すことは // できません。 // refSuper.printMyName(); // コンパイルエラー: // AddedMethodSubRunner.java:38: シンボ...
8.4 インスタンスの型を調べるには?
...キャストできません! 「AddedMethodSub2 refSub = (AddedMethodSub2)refSuper;」という形でダウンキャストし、printMyName()メソッドを呼び出そうとしています。 ところが、これは失敗して、ClassCastException例外が投げられます。 なぜなら、インスタンスの型はNoMemberSuper2クラスですから、キャスト先のAdd...
9.1 abstractクラスとabstractメソッド
...す。 // 参照型変数はAbstractSuperクラスです。 AbstractSuper refSuper = new ConcreteSub(); // オーバーライドしたメソッドを呼び出します。 refSuper.printMyName(); // 実行結果: // ConcreteSub } } まず、AbstractSuperクラスが抽象クラスです。 抽...
9.2 抽象クラスの使い道
... // 参照型変数はNonAbstractSuperクラスです。 NonAbstractSuper refSuper = new TypoSub(); // オーバーライドしたメソッドを呼び出します。 refSuper.printMyName(); // 実行結果: // NonAbstractSuper // ……あれ? } } まず、NonAbstract...
9.4 「抽象」って何?
...etical」は「理論上」という意味です。 ここで、「9.1 abstractクラスとabstractメソッド」の、抽象クラスの使用例を思い返してみましょう。 オーバーライドしたメソッドを呼び出している箇所(再掲) // オーバーライドしたメソッドを呼び出します。 refSuper.printMyName(); // 実行結果: // ConcreteSub ref...
10.1 インタフェースという「抽象クラスっぽいもの」
...ンスを1つ作ります。 // 参照型変数はPrintInterfaceクラスです。 PrintInterface ref = new Implemented(); // 実装したメソッドを呼び出します。 ref.printMyName(); // 実行結果: // Implemented } } まず最初に出てくるPrintInterfaceが「インタフェース」という...
10.2 インタフェースはクラスと一緒に「継承」できる!
...つ作ります。 // 参照型変数はCalcInterfaceクラスです。 CalcInterface ref = new ImplementedAndSub(); // 実装したメソッドを呼び出します。 int i = ref.calc( 100, 200 ); System.out.println( i ); // 実行結果: // 300 } } まず最初にC...
10.4 インタフェースは「抽象クラスの強力版」?
...ンタフェースと抽象クラスは持つことができます。 この抽象メソッドを使うことで、インタフェースは実装クラスに、抽象クラスはサブクラスに、強制的にメソッドを作らせることができて、ポリモーフィズムを使って呼び出すことができるというわけです。 また、抽象メソッドを持つため、インスタンスが作れないという点も共通しています。インタフェースも抽象クラスも、参照型変数を作れるだけで、newでインスタンスを作ること...
10.6 インタフェースはインスタンスを作らない!
...ingInterfaceインタフェースです。 HasToStringInterface ref = new InheritedFromObject(); // toString()メソッドを呼び出します。 String s = ref.toString(); System.out.println( s ); // 実行結果: // InheritedFromObject@1c...
10.7 「したい」と「する」を分ける!
... メソッドを使う時には、まず「したい」があります。文字列を出力したい、計算をしたい、データベースにアクセスしたい――そういった「したい」がまず最初にあります。 その「したい」を元に実際にメソッドを呼び出すと、呼び出されたメソッドが処理を「する」ことになります。メソッドは、文字列を出力する、計算をする、データベースにアクセスする――そういった処理を実際に「する」わけです。 インタフェースを使うと、...
11.1 結局「オブジェクト指向」ってなに?
...てくれさえすればいいんです。 これがオブジェクト指向プログラミングです。 オブジェクト中心! オブジェクト指向プログラミングでは、オブジェクト同士の通信、具体的にはインスタンス同士がメソッドを呼び出しあうことで処理を行います。 その時、相手のインスタンスの型は気にしません。 メソッドを呼ぶことで「どういう結果がもたらされるか」は、メソッドごとの仕様で決められているはずです。 呼び出す側は...
11.3 オブジェクト指向を使えば!
...なったわけです。変な使われ方をしないようになったわけですね。 ここまで来ればだいぶ安全になりましたが、もう一歩がんばってみましょう。 インタフェースと実装に分ける 最後に、クラスの各メソッドを呼び出すためのインタフェースを作りましょう。 グローバル変数の使用例(GlobalVariableRunner.java) // AverageInterfaceRunner.java /** * ...
11.5 オブジェクト指向の問題点
...クラスが持っているメソッドが使いたい!」という状況が多々あります。 本来であれば、ポリモーフィズムさせる=インスタンスの型は問わない、ということなのですが、インタフェースから実装していないメソッドを呼び出したかったり、特定の型の場合に処理をしたかったりすることがでてきたりします。 インタフェース邪魔! このような場合、インタフェースに抽象メソッドを追加して実装させればいいのですが、インスタンス...