オブジェクト指向プログラミングの特徴は、抽象化、カプセル化、継承、 多相性です。
抽象化とは、対象の重要でない性質を剥ぎ取り、適切な性質だけを残すことです。 このようなデータとデータの操作によって、抽象データ型が作られます。 関連するデータをまとめて取り扱う機能を構造体とかレコードと呼びます。
以下の c プログラムと同じ動作をする java のプログラムを比較してみましょう。
java では、データの定義やコードは1つのクラスにまとまっています。
[ c ] #include <stdio.h> typedef struct { int gram; int cals_per_gram; } Fruit; int total_calories(Fruit *this) { return (this->gram) * (this->cals_per_gram); } void peel() { printf("peel a Fruit\n"); } int main(int argc,char *argv[]) { Fruit plum = {5,45}; Fruit apple ={55,0}; int cals ; cals = total_calories( & plum); printf("total calories of plum =%d\n",cals); cals = total_calories( & apple); printf("total calories of apple =%d\n",cals); }
[ java ] class Fruit { int grams; int cals_per_gram; Fruit() { grams = 55; cals_per_gram = 0; } Fruit(int g,int c) { grams = g; cals_per_gram = c; } int total_calories() { return grams * cals_per_gram; } void peel() { System.out.println("peel a Fruit"); } public static void main(String[] argv) { Fruit plum,apple,peer; int cals; plum = new Fruit(5,45); apple = new Fruit(); cals = plum.total_calories(); System.out.println("total calories of plum = "+cals); cals = apple.total_calories(); System.out.println("total calories of apple = "+cals); } }
継承とは、すでに定義されたクラスを基に、 そのクラスをなんらかの意味で拡張するために、別のクラスを作ることです。
class Citrus extends Fruit { void squeeze() { : } }
public static int parseInt(java.lang.String, int); public static int parseInt(java.lang.String); public static java.lang.Integer valueOf(java.lang.String, int); public static java.lang.Integer valueOf(java.lang.String); public java.lang.Integer(int); public java.lang.Integer(java.lang.String);
class Citrus extends Fruit { void squeeze() { System.out.println("squeeze"); } void peel() { System.out.println("peel a Citrus"); } public static void main(String[] argv) { Fruit somefruit = new Fruit(); Citrus lemon = new Citrus(); somefruit.peel(); lemon.peel(); if (somefruit instanceof Fruit) System.out.println("somefruit is Fruit"); somefruit = (Fruit) lemon; somefruit.peel(); if (somefruit instanceof Citrus) System.out.println("somefruit is Citrus"); } }
osaka-68] java Citrus peel a Fruit peel a Citrus somefruit is Fruit peel a Citrus somefruit is Citrus
キャストは、cから受け継がれた機能で、型変換を意味します。
整数から浮動小数点数にキャストできるのと同じように、 拡張クラスから被拡張クラスへのキャストは可能です。 その逆は、安全ではないキャストで常に正しいとは限りません。 正しくない場合は実行時に例外が発生します。 キャストするには、型名を括弧でくくって、キャストされる オブジェクトの直前に置きます。
somefruit = (Fruit) lemon;
まとめ |