koboriakira.com

あらすじ

Swingが楽しくて、『やさしいJava活用編(第4版)』を3分の1ほど進めることができた。やった。

ということで、メールフォームとかに必要な部品(ラジオボタンとか)が作れることはわかったのだが、肝心のコードの意味はわからないままだ。

クラスとかオブジェクトとかインスタンスとかコンストラクタとか

結局のところ、クラスとかオブジェクトとかインスタンスとかコンストラクタとかが分からないのだ。 ということで、dot installの「JAVA入門」を見てみる。すると、なんとなくイメージは掴めてきた。誤りがあることを承知で書けば、

  • クラス:設計図らしい。あるインスタンスたちが持つ特徴をまとめて書いておくようなものか。

  • インスタンス:クラスをもとに作られた個別具体的なもの。

  • オブジェクト:「インスタンス」の抽象化されたような言い方か?

  • コンストラクタ:上2つとは全く異なる種類の用語。単純にインスタンス化したときに呼ばれる初期処理のこと。

という感じだろうか。オブジェクトがかなりあやふやだ(苦笑)。

クラスだからといって「new Hoge();」しないものもある

という感じで理解したのだが、少し進めているうちに、次なる関門にぶつかった。 それは、APIを利用する際に思った。たとえばCalendarを使いたいとき、

public class Sample {public static void main(String arg[]) {Calendar cal = Calendar.getInstance();System.out.println(cal.get(Calendar.DATE));}}と書くのだが、Calendarクラスを利用するのだから、

Calendar cal = new Calendar();cal = Calendar.getInstance();のように、「インスタンス化しないといけないのでは?」と思ったのだ。調べてみると解答が出た。

abstractはクラス・メソッド宣言時に付与し、クラス・メソッドを抽象クラス(abstractクラス)・抽象メソッド(abstractメソッド)として宣言します。
抽象クラスはそのクラス自身のオブジェクトを生成することはできません。
通常抽象クラスは実装のないいくつかの抽象メソッドを持っています。抽象クラスをサブクラスで継承し、そのサブクラス内で抽象クラスで実装されていない抽象メソッドを実装(オーバーライド)しオブジェクトを生成する形をとります。
Javaの道:クラス(13.abstract)

ということで、Calendarは抽象クラスなのだ。つまり、Calendarを継承したサブクラスがあるということだろうか(それが何かわからない)。

ただ、このことは理解できても、実感としてはいまいちピンときていない。少し考えてみよう。

クラス型変数calは宣言されただけで、オブジェクトは作られていない。オブジェクトじゃないということは、つまり変数calは、私が値を入れたりして新しく作り出すものではない。

変数calは宣言されただけで、そこにはCalendarクラスのgetInstanceメソッドを使って作られた値が代入される。

わかりづらいが、これを一応の結論としておくかー。 みたいに進めていたら、dot installの講習は全て終わってしまった。うーん、この後が本当によくわからないんだよな…。

プログラムの順番がだんだん分かってきた

このノートを書きながら、だんだんと分かってきたことだが、処理の順番として、まずmainメソッドですぐあとに使うクラスやメソッドを宣言し、あとは数珠つなぎ的にクラスやメソッドが繋がっているのだろう。

そういったことが掴めてきたので、ためしにコードを書いてみた。今日から1週間の日付と曜日を表すコードだ。

Sample.java

import java.util.Calendar;public class Sample {public static void main(String arg[]) {SampleCalendar sc = new SampleCalendar();sc.testCalendar();}}#### SampleCalendar.java

import java.util.Calendar;public class SampleCalendar {public void testCalendar() {Calendar cal;cal = Calendar.getInstance();for (int i = 0; i < 7; i++) {dispCalendar(cal);addCalendar(cal);}}public static void dispCalendar(Calendar cal) {String[] day = {“日”, “月”, “火”, “水”, “木”, “金”, “土”};int date = cal.get(Calendar.DATE);int daynum = cal.get(Calendar.DAY_OF_WEEK);System.out.println(date + “日は” + day[daynum-1] + “曜日。”);}public static Calendar addCalendar(Calendar cal) {cal.add(Calendar.DAY_OF_WEEK, 1);return cal;}}なんか「それっぽい」コードになってきたぞ。ITを知らない人になら「エンジニアです」と名乗れるようなコードかもしれない(笑)。ブレークスルーなるか。


    Kobori Akira

    IT業界の社会人。最近はプロレスと音楽の話題が多め。
    読む価値のある記事は Qiitanote に投稿します。
    過去人気だったブログ記事はこちらから。