ITエンジニアのプレイングマネージャー化応援サイト

12.抽象クラス

この記事では、当社 の新人エンジニア研修の参考にJava8を解説します。

前回はカプセル化について解説しました。

今回は抽象クラスについて解説します。

抽象クラスはインスタンス化できないクラスです。

しかし、巧妙な役割が与えられたクラスです。

今回は少し寄り道をしながらその存在意義について解説します。

 

1.Integerクラス

例によって、JavaのAPIから、今回はIntegerというクラスを見てみましょう。

Integerクラスは、プリミティブ型intの値をオブジェクトにラップします。Integer型のオブジェクトには、型がintの単一フィールドが含まれます。

さらにこのクラスは、intStringに、Stringintに変換する各種メソッドや、intの処理時に役立つ定数およびメソッドも提供します。

このような解説があります。

ラップするというのはwrap、すなわち、サランラップと同じように包み込むという意味です。

基本型を参照型に(包み込んで)変換するという意味です。

なぜ、基本型を参照型(オブジェクト)として扱う必要があるのでしょうか?

それは、オブジェクトにはいろいろと便利なメソッドがあるからです。

以下のサンプルプログラムを見てください。

<結果>

1536

文字列の”1024″と”512″を足し算しています。

文字列のままではできない相談ですが、上記では出来ています。

Integer.parseInt(num1)

のところでIntegerクラスのparseIntメソッドを使っています。

parseという英語の意味は”解析する”です。

intとして解析する、つまり整数として扱うというメソッドなわけです。

 

文字列を整数として扱うことがなぜ必要なのでしょうか?

一例ですが、皆さんがWebアプリケーションを作るときに必要です。

Webページのフォームに入力した数値は文字列扱いなので、それを数値として扱いたいときに使います。

いまから覚えておいてください。

 

こういうと、そもそもなぜ、基本型があるのかという鋭い疑問を持たれる方もいらっしゃいます。

基本型が存在する一番の理由は、パフォーマンスです。

参照型はヒープ領域にインスタンスを作るのでパフォーマンスが悪いのです。

現代であればそれほど問題にならないかもしれませんが、Javaが企画されたのは1990年代ですので、マシンパワーが非力だった訳ですね。

ちなみに、近年iOSなどで人気のswiftという言語にはプリミティブ型はなく、すべてがオブジェクトです。

 

さらにIntegerクラスを使うと次のようなことが可能です。

<結果>

2147483647
-2147483648

int型の範囲を覚えなくてよい、と嬉しくなりますね。
※ただし、エンジニアのたしなみとして±約21億ということは覚えましょう。

なぜ、Integerクラスを抽象クラスの説明で持ち出したかといいますと、理由はその親クラスのNumberクラスにありました。

クラスInteger

APIはこのようになっていたと思いますので、java.lang.Numberをクリックしてみてください。

そうすると、

public abstract class Number

と定義されているのが見えます。

このabstract というキーワードが抽象クラスを意味しています。

 

2.Numberクラス

ところで、Numberつまりは、”数”のインスタンスとはどのようなものでしょうか?

“1”も”3.14”も数といえば数ですが、それぞれ、IntegerとDoubleというもっとふさわしいクラスがJavaには存在します。

Integerは一種のNumberである。

Doubleは一種のNumberである。

これは、どこかで聞いたようなお話ですね。

子クラスは一種の親クラスである 。

といことで、NumberクラスはIntegerクラスやDoubleクラスの親クラスなのでした。

抽象クラスとは、親クラスであるということだけが存在意義でインスタンス化できないクラスです。

ですから、以下のサンプルプログラムはエラーが表示されます。

<結果の抜粋>

java.lang.Numberはabstractです。インスタンスを生成することはできません

 

では、抽象クラスにはどのような意義があるのでしょうか?

抽象クラスには抽象メソッドを1つ以上定義しなければなりません。

そして抽象クラスを継承した子クラスは抽象メソッドをオーバーライドしなければならないという決まりがあります。

つまり、ある抽象クラスの子クラスには必ず、親クラスの抽象メソッドの実装があることが保証されるのです。

例えば、Numberには抽象メソッドintValueがあります。

整数値を返すメソッドです。

つまり、IntegerクラスにもDoubleクラスにも(Byte, Float, Shortにも)このintValueがオーバーライドされていることが保証されているのです。

以下のサンプルプログラムを見てください。

※ちなみに、コンストラクタに渡す値は数値でも文字列でも構いません。(オーバーロードされている)

<結果>

128
3

このように確かにintValueメソッドがあります。

 

子クラスに親クラスの抽象メソッドのオーバーライドを義務付けるというのが抽象クラスの役割です。

では、もしも、抽象クラスという存在がなかったら同じことは可能でしょうか?

もちろん気を付けてオーバーライドすれば可能かもしれません。

しかし、人はうっかりしやすく、忘れやすいものです。

そのため、抽象クラスの仕組みを採用したのです。

 

この抽象クラスの仕組みを皆さんも使うことができます。

ただ、このお話は実務についてもすぐに活用するレベルのお話ではないので参考までに聞いてください。

 

3.オリジナルの抽象クラスを作る

ここでは、あくまでサンプルとして簡単な抽象クラスを作成してみます。

会社員クラスという抽象クラスを用意してworkという抽象メソッドを定義しました。

workメソッドの実装は、会社員クラスの子クラスとして、社長クラスとマネージャークラスを用意して定義しています。

※IDEを使っていると「@Override注釈の追加」などというアドバイスが表示されると思います。@Overrideは正しくオーバーライドされていない時に、コンパイラがエラーを出してくれるという便利なannotation(注釈)です。ちなみに、アノテーションは今後も出てきます。@で始まるものがあればアノテーションだと思ってください。

<結果>

社長の仕事をします。
マネジメントの仕事をします。

抽象クラスを使うことで、このようなことができます。

抽象クラスの考え方自体は以前から存在したのですが、実用化したJavaの開発者には頭が下がります。

なお、今回クラス名の先頭に「Abstract」をつけているのは一目で抽象クラスであるということが分かるようにという配慮です。

 

4.オートボクシングとアンボクシング

今回、ラッパークラスのお話が出てきましたので、ついでにオートボクシングとアンボクシングのお話もしておきます。

どういうお話かといいますと、基本型とラッパーの間の変換に手間はいらないというお話です。

次のサンプルコードを見てください。

この6行目のように基本型からラッパーに代入できることをオートボクシング(autoboxing)といいます。

逆に、ラッパーから基本形に代入できることをアンボクシング(unboxing:箱から出す)といいます。

ちょうど、購入した電化製品を箱から出すことも英語でunboxingといいます。

実は、ラッパーが真価を発揮するのは後ほど学ぶcollectionsフレームワークというものと組み合わせた時です。

したがって今はまず、覚えましょう。

 

5.NumberFormatException

抽象クラスとは直接関係がありませんが、今回、Integer.parseIntのお話が出てきましたので、ついでにそれにまつわる例外の話もしておきたいと思います。

NumberFormatExceptionといいます。

Number:数値のformat:フォーマットの例外ということで文字通りですね。

以下のサンプルプログラムを見てください。

<結果>

Exception in thread “main” java.lang.NumberFormatException: For input string: “2byte”

(以下略)

 

 

ここまで理解できたら練習問題をやってみましょう。

10.抽象クラス

 

今回は抽象クラスについて見てきました。

抽象クラスを使うことで、子クラスに親クラスの抽象メソッドのオーバーライドを義務付けることができました。

より、堅牢なクラス体系を作り出すことができるということが理解できたのではないでしょうか?

次回のテーマはインターフェースです。

インターフェースもインスタンス化できないクラス(のようなもの)です。

なぜ、インターフェースが必要なのでしょうか?

抽象クラスで十分ではないでしょうか?

その理由のヒントは、多重継承できないJavaの仕組みにあります。

推理しながら次回を楽しみに待っていてください。

 

JavaSE8の解説に戻る

新入社員研修ポータル

IT企業の人財育成に関することなら全てお任せ下さい TEL 0120-559-463 受付時間 10:00 - 17:00 (土・日・祝日除く)

ZOOMを使った遠隔研修メニュー(PDFが開きます)

ZOOMを使った遠隔研修

新人エンジニアのためのJavaタイピングゲーム

新人プログラマのためのプログラミング動画

YouTubeチャンネル

お問い合わせはこちらから

    お名前 (必須)

    メールアドレス (必須)

    題名(件名)

    メッセージ本文

    確認画面は表示されません。上記内容にて送信しますので、よろしければチェックを入れてください。

    新入社員研修ポータル

    PAGETOP
    Copyright © Say Consulting Group, Inc. All Rights Reserved.