Javaのクラス、オブジェクト、継承、マルチステートなどの概念を簡単に理解する

2873 ワード

一、クラス
クラス(class)は、オブジェクトを構築するテンプレートまたは青写真です.簡単に理解すると、「人間」はクラスであり、明ちゃんという人はそのクラスのオブジェクトです.クラスによってオブジェクトを構築するプロセスは、クラスを作成するインスタンスになります.
二、対象
オブジェクトはクラスのインスタンスで、ステータスと動作があります.例えば、明ちゃんは相手で、名前、身長、体重などがあります.行動には、走る、踊る、食べるなどがあります.
三、継承
キーワードextendsは継承を表します.キーワードextendsは、構築中の新しいクラスが既存のクラスに派生していることを示します.既存のクラスはスーパークラス(superclass)、ベースクラス(base class)、または親クラス(parent class)、新しいクラスはサブクラス(subclass)、派生クラス(derived class)、または子供クラス(child class)と呼ばれます.
サブクラスはスーパークラスよりも多くの機能とコンテンツを持っています.Objectは最大のスーパークラスであることが知られており、Javaのすべてのクラスが直接または間接的にObjectクラスを継承しているが、Objectクラスには11のメソッドと1の構造メソッドしかなく、Stringクラスには構造メソッドを含む80以上のメソッドがObjectから中継されるメソッドも含まれていない.つまりStringクラスには全部で100近くの方法があります.
スーパークラスを拡張してサブクラスを定義する場合は、サブクラスとスーパークラスの違いを指摘するだけです.したがって,設計時には汎用的な方法をスーパークラスに,特殊な用途を持つ方法をサブクラスに置くべきである.
サブクラスでは、ドメインを追加したり、メソッドを追加したり、スーパークラスを上書きしたりすることができますが、継承されたドメインやメソッドは削除できません.
継承はチェーン状の形式で現れることができて、つまり多層継承、B継承A、C継承B......いかなるクラスにあるクラスを修正させたくないならば、つまり他のクラスが1つのクラスを継承することを許さないならば、クラスの声明の中でfinal修飾を追加するだけで、例えばpublic final classString.継承は許可されますが、サブクラスがメソッドを変更したくない場合は、メソッドの宣言でfinalを使用して修飾するだけです.
Javaではマルチ継承はサポートされていません.
四、多態
マルチステートとは、異なるクラスのオブジェクトが同じメッセージに応答することを許可することを意味します.すなわち、同じメッセージは、送信オブジェクトによって異なる動作方式を採用することができる.(メッセージの送信は関数呼び出しです)
マルチステートを実装する技術は、動的バインディング(dynamic binding)と呼ばれ、実行中に参照されるオブジェクトの実際のタイプを判断し、その実際のタイプに応じて対応するメソッドを呼び出すことを意味する.例えば、new String(「Hello」)を使用してStringのインスタンスを構築する場合、プログラムは、他の構築方法ではなくString(String original)構築メソッドを自動的に選択する.
多態の存在の3つの必要条件:1、継承がある;2、書き換えが必要です.3、親参照が子オブジェクトを指す
簡単に言えば、サブクラスのオブジェクトをスーパークラスオブジェクトに割り当てることができます.例えば、すべてのりんごは果物ですが、必ずしもりんごではない果物もあります.1つのリンゴには必ず果物のすべての特徴が含まれており、これはなぜサブオブジェクトがスーパーオブジェクトに値を与えることができるのかを説明することができます.しかし、果物は必ずしもリンゴの特徴を持っているとは限らない.果物は比較的公共の対象であるため、逆に賦値操作を行うと、コンパイラが間違って報告される.
class Fruit {
	private String color;
	private String name;
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
class Watermelon extends Fruit{
	private boolean isBig;
	public boolean isBig() {
		return isBig;
	}

	public void setBig(boolean isBig) {
		this.isBig = isBig;
	}
}
class Peach extends Fruit{
	private boolean isBig;
	public boolean isBig() {
		return isBig;
	}

	public void setBig(boolean isBig) {
		this.isBig = isBig;
	}
}

上のコードでは、果物、スイカ、桃の3つのクラスが定義されています.スイカと桃は果物類から受け継がれており、果物には2つのドメイン(属性):color,name,スイカと桃にはそれぞれisBig属性があります.上の3つのクラスをテストします.
		Fruit f = new Fruit();
		Watermelon w = new Watermelon();
		Peach p = new Peach();
		f = w;
		f = p;
のようなテスト文は問題ありませんが、後の2つの文=前後の変数を逆さまにするとエラーが報告されます.
スイカの対象には必ず
color
および
name
属性ですが、果物の対象には必ずしも
isBig
で行ないます.これと比較すると,サブクラスオブジェクトをスーパークラスオブジェクトに一方向に割り当てるしかない理由が理解できる.