1.クラスと「オブジェクト」:
クラスは抽象化であり、いくつかのことを一般化するプロパティと動作のコレクションであると言えます。それは非常に抽象的または具体的である可能性があります。たとえば、動物。哺乳類、軟体動物、鳥、魚などが含まれます。このことから、犬や猫など、動物よりも少し特異的な哺乳類を取り出すことができます。また、猫など、多くのカテゴリに分類できます。さまざまなクラスには、その動作とプロパティがあります。クラスは私たちの生活のいたるところにありますが、それらは抽象的な存在です。そして、私たちが直接触れることができるのは「オブジェクト」です。
オブジェクトはクラスのインスタンスであり、実際に存在する「もの」です。たとえば、兄と弟がいて、家族には3人の男の子がいます。あなたの3人がそこにいるとき、あなたのお父さんが「息子」と呼んだら、彼があなたを呼んでいるのか、それとも兄弟か兄弟か知っていますか?不適切な例を挙げると、「息子」はクラスに属しています。彼にあなたの名前または兄弟の名前が含まれている場合、彼が誰を呼んでいるのかがわかります。ここで、「あなた」または「兄弟」はオブジェクトに属します。
第二に、オブジェクト指向の3つの特徴:
1.パッケージ:
カプセル化は文字通りパッケージ化を意味し、専門的なポイントは情報の隠蔽です。これは、抽象データ型を使用してデータとデータベースの操作を一緒にカプセル化し、分割できない独立したエンティティを形成することを指し、データは抽象データ型で保護されます。内部の細部を可能な限り詳細にし、外部と接続するために一部の外部接続のみを保持します。システムの他のオブジェクトは
、データをラップした許可された操作を介してのみ、このカプセル化されたオブジェクトと通信および対話できます。つまり、ユーザーは
オブジェクトの内部の詳細を知る必要はなく、オブジェクトによって提供される外部インターフェイスを介してオブジェクトにアクセスできます。
カプセル化の利点:カプセル化後、独立したエンティティが形成され、独立したエンティティをさまざまな環境で再利用できます。明らかに、カプセル化により、プログラムの結合度が低下し、プログラムのスケーラビリティが向上し、再利用または再利用できます。シンプルで安全な操作エントリのみが外部に提供されるため、カプセル化後、エンティティはより安全になります。
2.継承:
私たちの実際の継承を見てみましょう:
継承中、サブクラスは親クラスの特性と動作を継承するため、サブクラスオブジェクト(インスタンス)は親クラスのプロパティを持ち、サブクラスは親クラスからメソッドを継承するため、サブクラスはと同じ動作をします。親クラス。ウサギと羊は草食動物であり、ライオンとヒョウは肉食動物です。草食動物と肉食動物は動物のカテゴリーに属します。したがって、継承が準拠する必要のある関係は、is-a(Bird is-a Animal)であり、親クラスはより一般的であり、子クラスはより具体的です。草食動物と肉食動物はどちらも動物に属していますが、特性と行動が異なるため、サブクラスには親クラスの一般的な特性と、それ自体の特性があります。
継承の利点:
また、異なるクラスに共通の機能とアクションが存在する場合があり、これらの共通の機能とアクションを1つのクラスに配置して、他のクラスで共有することができます。したがって、ジェネリッククラスを定義してから、ジェネリッククラスの機能とアクションを継承する他のいくつかの特定のクラスに拡張することができます。継承は、Javaでソフトウェアの再利用を実現するための重要な手段であり、重複を回避し、保守が容易です。
次の点に注意してください
。1)Javaには単一の継承のみがあり、多重継承はありません。つまり、クラスは1つの「親クラス」のみを持つことができます。多重継承を実現するには、インターフェースを使用できます。
2)Javaでは、サブクラスが親クラスを継承することが規定されています。コンストラクターとprivateによって変更されたデータ(継承できない)を除いて、残りは継承できます。
3)Javaのクラスがクラスを継承しない場合、デフォルトでObjectクラスを継承します。ObjectクラスはJava言語によって提供されるルートクラスです。
つまり、オブジェクトはオブジェクトのすべての特性を備えて生まれます。タイプ。
3.ポリモーフィズム:
その前提は、カプセル化して独立したボディを形成することであり、独立したボディ間には継承関係があり、その結果、ポリモーフィックなメカニズムが生じます。ポリモーフィズムは、同じ行動の複数の異なる症状または形態を持つ能力です。ポリモーフィズムとは、「同じ動作」が「異なるオブジェクト」で発生し、異なる効果をもたらす場合です。次のコードを見てみましょう。
public class Animal {
public void move(){
System.out.println("Animal move!");
}
}
public class Cat extends Animal{
//方法覆盖
public void move(){
System.out.println("I can jump");
}
//子类特有
public void catchMouse(){
System.out.println("I can catch mouse");
}
}
[点击并拖拽以移动]
public class Bird extends Animal{
//方法覆盖
public void move(){
System.out.println("I can fly");
}
//子类特有
public void catchBug(){
System.out.println("I can catch bugs");
}
}
CatクラスとBirdクラスは、どちらもAnimalクラスを継承しています。上記のクラスをテストしてみましょう。
/*
在没有接触到继承和多态之前,我们一直使用这样的方式来创建对象。很容易理解,
运行结果为:
Animal move!
I can jump
I can fly
*/
public class Test01 {
public static void main(String[] args) {
//创建Animal对象
Animal a = new Animal();
a.move();
//创建Cat对象
Cat c = new Cat();
c.move();
//创建鸟儿对象
Bird b = new Bird();
b.move();
}
}
実際、CatオブジェクトとBirdオブジェクトも次のように作成できます。
/*
这就是多态,多态就是“同一个行为(move)”作用在“不同的对象上”会有不同的表现结果,
java允许一个父类型的引用指向一个子类型的对象。
也就是说允许这种写法:
Animal a2 = new Bird(),因为Bird is a Animal是能够说通的。其中Animal a1 = new Cat()
或者Animal a2 = new Bird()都是父类型引用指向了子类型对象,都属于向上转型(Upcasting),
或者叫做自动类型转换。
*/
public class Test02 {
public static void main(String[] args) {
//左边为父类引用,右边是子类对象。
Animal a1 = new Cat();
a1.move();
Animal a2 = new Bird();
a2.move();
}
}
/*
再来看看一下程序。结果是编译失败:
java: 找不到符号
符号: 方法 catchMouse()
位置: 类型为Exercises.Animal的变量 animal
这是因为在编译的时候,看的是左边的 Animal 类型的引用,而Animal类中没有catchMouse()方法。
其实你想完成的这一步被称为“向下转型”。前面的向上转型是可以自动进行的,不难理解,因为前面
提到过一个子类,他的父类只有一个,向上自然是父类。而向下转型就不一样了,一个父亲可以有多个儿子,
如果你不指定是谁的话,是找不到的,所以我们可以使用()来进行强制类型转换,将Animal转换为Cat
再去让他 catchMouse()就没有问题了。
*/
public class Test03 {
public static void main(String[] args) {
Animal animal = new Cat();
animal.move();
animal.catchMouse();
}
}
上記のコードはエラーでコンパイルされます。このような問題を回避するには、左にコンパイルして右に実行することを忘れないでください。
多型が存在するために必要な3つの条件は次のとおりです。
●継承
●メソッドのオーバーライド
●親タイプの参照はサブタイプオブジェクトを指します