カプセル化、ポリモーフィズム、継承は、オブジェクト指向プログラミングの3つの主要な特徴です。
カプセル化
カプセル化の目的は、変数の安全性を確保することです。ユーザーは特定の実装の詳細を気にする必要はありませんが、クラスのメンバーにアクセスするための外部インターフェイスを介してのみ気にする必要があります
カプセル化しない場合、クラス内のインスタンス変数を直接表示および変更できます。これは、コード全体に悪影響を与える可能性があります。
したがって、メンバー変数は通常、クラスを作成するときにプライベート化され、外部クラスはgetterメソッドとsetterメソッドを使用して変数を表示および設定する必要があります。
継承
継承し、実際にあるコードの再利用性と拡張性を向上させる、いくつかのプロパティは、異なる種類の定義が同時に存在し、これらの共通の属性の使用を容易にするために、親クラスに抽象化することができ、他のサブクラスを定義するときに継承することができます親クラス、カスタムコードの重複を減らし、サブクラスの親クラスを非プライベートメンバーとして使用できます。
継承を定義するための形式は次のとおりです。
クラスサブクラスは親クラスを拡張します{}
次の例で表すことができます。
public class Fu {
public void show() {
System.out.println("父类中的show方法被调用");
}
public void method() {
System.out.println("父类中的method方法被调用");
}
}
public class Zi extends Fu {
@override
public void method() {
System.out.println("子类中的method方法被调用");
}
}
public class Demo {
public static void main(String[] args) {
//创建对象,调用方法
Fu f = new Fu();
f.show(); // 父类中的show方法被调用
Zi z = new Zi();
z.method(); // 子类中的show方法被调用
z.show(); // 父类中的show方法被调用
}
}
上記のコードでは、ZiはFuを継承し、ZiクラスのFuクラスのメソッドメソッドを書き換えます。Ziクラスは、メソッドメソッドの実行時に書き換えられたメソッドを実行し、showメソッドの実行時にFuクラスを実行します。メソッド。これから取得できます。サブクラスが親クラスのメソッドを書き換える場合、サブクラスはメソッドを呼び出すときに書き換えられたメソッドを実行します。
さらに、新しい変数とメソッドをサブクラスで定義できます
継承関係を使用すると、単一レベルの継承だけでなく、一般に明らかな階層関係を持つ継承ツリーが形成されます。オオカミの定義では、その親クラスに犬と動物のクラスを含めることができます。次の図は、もう少し複雑な例を示しています。 。JavaAPIでは、それらの間の関係は、ほとんどの継承関係が3つのレベルを超えることはありません。
継承に関する注意:
-
親クラスは自分が持っているサブクラスを知らないかもしれませんが、サブクラスは自分が持っている親クラスについて明確でなければなりません
-
サブクラスが親クラスを書き換えるときに、親クラス関数に基づいて新しい関数を追加する場合は、superを使用して次のように実現できます。
-
public void roam(){ // 父类中的方法 super.roam(); // 新增的行为 new stuff; }
-
-
継承されたサブクラスとして使用することはできません:
- アクセス制御
- 最終修飾子を使用して、親クラスのメソッドがオーバーライドされないようにします。通常、最終修飾子が追加されます。
- プライベートコンストラクターのみ
-
サブクラスのパラメーターの数と型は親クラスと完全に同じである必要があり、戻り値の型は互換性がある必要があります
-
サブクラスのメソッドのアクセス権限は、親クラスのメソッドのアクセス権限よりも低く、高くすることはできません。
ポリモーフィズム
ポリモーフィズムとは、同じオブジェクトが複数の形式を示す可能性があることを意味します。一般に、オブジェクトの参照型は、実際のクラスまたは実際のクラスの親クラスのいずれかです。
次のコード例は視覚化できます
public class Animal {
public int age = 40;
public void eat() {
System.out.println("动物吃东西");
}
}
public class Cat extends Animal {
public int age = 20;
public int weight = 10;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playGame() {
System.out.println("猫捉迷藏");
}
}
public class AnimalDemo {
public static void main(String[] args) {
//有父类引用指向子类对象,向上转型
Animal a = new Cat();
Cat c = new Cat();
System.out.println(a.age); // 40
a.eat; // 猫吃鱼
// 向下转型
Cat t = (Cat) a;
System.out.println(t.age); // 20
System.out.println(t.weight); // 10
System.out.println(c.age); // 20
System.out.println(a.weight); // 10
}
}
上記のコードには、ポリモーフィズムのアップキャストとダウンキャストの問題も含まれています。Animala= new Cat();は一種のアップキャストであり、のオブジェクトを指すように動物タイプの参照変数aを定義するのと同じです。 Catクラス、Cat t =(Cat)aはダウンキャストであり、Animalタイプの参照は、Catタイプの参照変数tよりもCatタイプの参照変数tに渡されます。2つの呼び出しはメンバーが異なります。変数とメンバーメソッド:
- メンバー変数呼び出し
- aによって呼び出されるメンバー変数は、Animalのメンバー変数です。
- tによって呼び出されるメンバー変数は、Catのすべてのメンバー変数です。
- メンバーメソッド呼び出し
- メンバーメソッドが呼び出されると、Animalで宣言されたメンバーメソッドのみを呼び出すことができます。Animalで宣言されたメソッドを書き換えると、書き換えられたメソッドが呼び出されます。そうでない場合は、Animalでメソッドが呼び出されます。
- メンバーメソッドを呼び出すと、Catのすべてのメンバーメソッドが呼び出されます
インターフェイスと抽象クラスでのObjectの導入では、アップキャストとダウンキャストの絵文字も示されています。コンパイラーは、参照型に基づいて呼び出すことができるメソッドを決定します
さらに、次のコードに示すように、ポリモーフィズムをパラメーターと戻り値の型に適用することもできます。
class Vet{
public void giveShot(Animal a){
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v = new Ver();
Dog d = new Dog();
Hippo h = new Hippo();
v.getShot(d); //调用Dog类中的makeNoise方法
v.getShot(h); //调用Hippo类中的makeNoise方法
}
}
メソッドのオーバーライドとオーバーロードの違い
メソッドのオーバーロード:メソッドのオーバーロードとは、同じクラス内の同じ名前の複数のメソッドの定義を指します。同じ名前のこれらのメソッドのパラメーターの数とタイプは異なり、戻り値の型とアクセス許可は異なる場合があります。
メソッドのオーバーライド:メソッドのオーバーライドとは、継承関係のあるサブクラスが親クラスのメソッドを継承し、異なるメソッド本体を定義することを指します。サブクラスと親クラスのメソッド名とパラメータータイプは完全に同じである必要があります。これは一種のカバレッジ。