第2週目 Jump to java 読み
ジャワはオブジェクト指向言語である
ジャワはオブジェクト指向(ObjectOriented)プログラミング言語である。
オブジェクト指向にはクラス、オブジェクト、インスタンス、相続、インタフェース、多形成、抽象化などの多くの概念が存在する。
class Animal {
}
最も簡単な形のクラスだ。 クラスの宣言だけあって中身のない殻だけのクラスだ。 しかし、この殻だけのクラスも非常に重要な機能を持っている。 その機能はオブジェクトを作る機能である。
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
}
}
簡単なクラス宣言により、数多くのオブジェクト生成が可能である。
クラスによって作られたオブジェクトをインスタンスともいう。 それでは客体とインスタンスの違いは何だろうか。
こう考えてみよう。 Animalcat=newAnimal()このように作られたcatはオブジェクトである。 そしてcatというオブジェクトはAnimalのインスタンス(instance)だ。 インスタンスという言葉は、特定のオブジェクト(cat)がどのクラス(Animal)のオブジェクトなのかを関係中心に説明する時に使われる。 つまり、「catはインスタンス」よりは「catはオブジェクト」という表現が「catはAnimalのオブジェクト」よりは「catはAnimalのインスタンス」という表現がはるかによく似合う。
クラスによって生成されるのはオブジェクト、そしてそのクラスに宣言された変数はオブジェクト変数だと考えると簡単だ
客体·客体変数への呼び出し
クラスにはオブジェクト変数と共にメソッド(Method)というものがある。 メソッドはクラス内に具現された関数を意味するが、普通の関数とは言わずメソッドと言う。
オブジェクト·オブジェクト変数=値
class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("boby");//メソッド呼び出し
Animal dog = new Animal();
dog.setName("happy");
System.out.println(cat.name);
System.out.println(dog.name);
}
}
クラスで最も重要な部分は、その何と言ってもこのオブジェクト変数の値が独立して維持されるという点だ。 事実、この点がまさにクラス存在の理由でもある。 オブジェクト指向的(ObjectOriented)という言葉の意味もよく考えると、結局このオブジェクト変数の値が独立的に維持されるために可能なのだ。
他のプログラミング言語には関数というものが別に存在する。 しかし、ジャワはクラスを離れて存在することはあり得ないため、ジャワの関数は別に存在せず、クラス内に存在する。
ジャバはこのようなクラス内の関数をメソッドと呼ぶ。
入力を持ってあることを遂行した後に結果を出すこと、これがメソッドがすることだ。
int sum(int a, int b) {
return a+b;
}
上記メソッドの意味は次のように定義される。
sumメソッドは入力値で二つの値(int資料型a,int資料型b)を受け取り、リターン値は二つの入力値を加えた値(int資料型)である。
ここでreturnはメソッドの結果値を返すコマンドである。
メソッドは、入ってきた入力値を持ってある処理をして適切なリターン値を返すブラックボックスと同じだ。
入力値--->メソッド(ドライブレコーダー)--->リターン値
メソッドに入ってくる入力値とリターン値について詳しく調べてみよう。
int sum(int a, int b) {
return a+b;
}
リターン値を受け取る変数=オブジェクト。メソッド名(入力人数1、入力人数2、...)
sumメソッドの使用例は以下の通りである。
Sample sample = new Sample();
int result = sample.sum(3, 4);
public void varTest(int b) {
b++;
} メソッド内でのみ使われる変数をローカル変数(localvariable)とも言う。
相続
子クラスが親クラスの機能を受け継ぐこと
Javaで作る全てのクラスはObjectクラスを相続する。 実際、私たちが作ったAnimalクラスは次の機能的に完全に同じである。 しかし、あえて下のコードのようにObjectクラスを相続するようにコーディングしなくても、Javaで作られるすべてのクラスはObjectクラスを自動的に相続するようになっている。
class Animal extends Object {
String name;
void setName(String name) {
this.name = name;
}
}
親クラスのメソッドを子クラスが同じ形で再び具現する行為をメソッドオーバーライディング(MethodOverriding)という。 (※メソッド上書き)
入力項目が異なる場合、同じ名前のメソッドを作ることができるが、これをメソッドオーバーローディング(methodoverloading)
多重相続はクラスが同時に一つ以上のクラスを相続することを意味する。 C++、パイソンなど多くの言語が多重相続を支援するが、ジャワは多重相続を支援しない。
クラス名と同一でリターン資料型を定義しないメソッドを生成者(Constructor)という。
生成者の規則
1。クラス名とメソッド名が同一である。
2.リターンタイプを定義しない。 (voidも使わない。)
生成者が宣言された場合、生成者の規則どおりにオブジェクトを生成することができる。
. 生成者の入力項目がなく、生成者内部に何の内容もない生成者をデフォルト生成者と呼ぶ。
. 入力項目が異なる生成子を複数作ることができるが、このようなものを生成子オーバーローディング(Overloading)という。
インターフェースinterface
インタフェース実装はimplementsというキーワードを使う。
種類だけのメソッドが必要だったクラスをインターフェースを利用して具現したところ、たった一つのメソッドで具現できるようになった。 ここで重要な点はメソッドの数が減ったという点ではなく、クラスが動物の種類に依存的なクラスで動物の種類と関係のない独立的なクラスになったという点だ。 まさにこの点がインターフェースの核心だ。
インタフェースはインタフェースのメソッドを必ず実装すべき"強制性"を持つことを必ず覚えよう。
多型性
instanceofは、どのオブジェクトが特定クラスのオブジェクトなのかを調べる際に使われるJavaの内蔵コマンドである。 animalinstanceofTigerは「animalオブジェクトはTigerクラスで作られたオブジェクトなのか?」を尋ねる条件文だ。
抽象クラス(AbstractClass)はインターフェースの役割もしながらクラスの機能も持っているジャワの突然変異のようなクラスだ。 ある人は抽象クラスはインターフェースに置き換えるのが良いデザインだとも話す。
抽象クラスについて調べるために作成したPredatorインターフェースを次のように抽象クラスに変更してみよう。
abstract class Predator extends Animal {
abstract String getFood();
defaultvoidprintFood(){//defaultを除去する。
System.out.printf("my food is %s\n", getFood());
}
staticintLEG_COUNT=4;//抽象クラスの定数はstatic宣言が必要である。
static int speed() {
return LEG_COUNT * 30;
}
}
抽象クラスを作るためにはclassの前にabstractと表記しなければならない。 また、インターフェースのメソッドのような役割をするメソッド(ここではgetFoodメソッド)にもやはりabstractを付けなければならない。 abstractメソッドはインターフェースのメソッドと同様に胴体がない。 すなわち、abstractクラスを相続するクラスで該当abstractメソッドを具現しなければならないのだ。 そしてAnimalクラスの機能を維持するためにAnimalクラスを相続した。 そして、インターフェースのデフォルトメソッドはこれ以上使用できないため、defaultキーワードを削除して一般メソッドに変更した。 そして、LEG_COUNT上水道インターフェースでは自動的にstaticと認識するが、抽象クラスは明示的にstaticと記さなければならない。
インターフェースと抽象クラスの違い
Java8バージョンからインターフェースにdefaultメソッドが追加され、抽象クラスとの違いが少し曖昧になった。 しかし、抽象クラスはインターフェースとは異なり、一般クラスのようにオブジェクト変数、生成者、privateメソッドなどを持つことができる。