オブジェクト指向プログラミングの特徴は、抽象化、カプセル化、継承、 多相性です。
抽象化とは、対象の重要でない性質を剥ぎ取り、適切な性質だけを残すことです。 このようなデータとデータの操作によって、抽象データ型が作られます。 関連するデータをまとめて取り扱う機能を構造体とかレコードと呼びます。
以下の 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;
| まとめ |