Javaの概念理解ポリモーフィズムのまとめ

WBOY
リリース: 2022-09-01 14:48:01
転載
1725 人が閲覧しました

この記事は、java に関する関連知識を提供します。主に Java のポリモーフィズムの詳細な説明について説明します。継承関係により、サブクラスは親クラスの特性を継承し、いくつかの新しい機能を追加できます。サブクラスは親クラスを特殊化したものです。サブクラスの各インスタンスは親クラスのインスタンスですが、その逆は当てはまりません。皆様のお役に立てれば幸いです。

Javaの概念理解ポリモーフィズムのまとめ

推奨学習: 「java ビデオ チュートリアル

1. ポリモーフィズムの概念

継承関係サブクラスは親クラスの特性を継承し、いくつかの新しい特性を追加できます。サブクラスはその親クラスを特殊化したものであり、サブクラスのすべてのインスタンスはその親クラスのインスタンスですが、その逆は当てはまりません。たとえば、すべての円は幾何学オブジェクトですが、すべての幾何学オブジェクトが円であるわけではありません。したがって、親タイプを必要とするパラメーターにサブクラスのインスタンスをいつでも渡すことができます。参照ケースは次のとおりです。

public class PolymorphismDemo{
/** Main method */
public static void main(String[] args){
  displayObject(new Circle(1,"red",false));
  displayObject(new Rectangle(1,1,"black",true));
}
 
public static void displayObject(GeometriicObject object){
  System.out.println("Created on "+ object.getDateCreated()+".Color is"+object.getColor());
}
}
ログイン後にコピー

Created on Mon Mar 09 19:25:20 EDT 2011.Color は red

Created on Mon Mar 09 19:25:20 EDT 2011.色は黒です

メソッド displayObject には、GeometricObject 型のパラメータがあります。 displayObject は、GeometricObject のインスタンスを渡すことによって呼び出すことができます。サブクラスのオブジェクトは、親クラスのオブジェクトが使用される場所であればどこでも使用できます。これは一般にポリモーフィズムと呼ばれます。 簡単に言えば、ポリモーフィズムとは、親型の変数がサブタイプ のオブジェクトを参照できることを意味します。

2. ポリモーフィズムの特徴

ポリモーフィズムの前提: 継承 (つまり、子と親のクラス関係が存在する必要があります) ポリモーフィックな親クラス参照変数を使用してメソッドを呼び出す場合、これは、サブクラスによってオーバーライドされたメソッドと呼ばれます。定義形式:親クラス型変数名 = new サブクラス型(); # #3.instanceof演算子

InstanceofはJavaのキーワードです。 Java キーワードの各文字は

小文字

です。

型変換をよりよく理解するために、これらは動物、シロクマ、パンダの間の関係に似ていると考えることができます。動物クラス Animal はシロクマ クラス Polar bear の親クラスであり、パンダクラス パンダクラス。シロクマは動物なので、いつでもシロクマのインスタンスを Animal 変数に安全に割り当てることができます。 このキーワードは、オブジェクトが特定のデータ型に属するかどうかを判断するために使用されます

。戻り値はブール型です。

 
        Fu Zz=new Xu();
        Fu Zzz=new yiting();
        if(f1 instanceof Xu){
            System.out.println("Zz是Xu的类型");
        }
        else{
            System.out.println("Zzz是yiting的类型");
        }
ログイン後にコピー
4. ポリモーフィック変換

1. 上方変換

サブクラスのインスタンスを

と呼ばれる親クラスの変数にいつでも変換できます。 Upcast

、サブクラスのインスタンスは常にその親クラスのインスタンスであるためです。

関数:

繰り返しコードを削減します。オブジェクトをインスタンス化するときに、さまざまなニーズに応じてさまざまなオブジェクトをインスタンス化できます

package project2;
	class Animal{
		int num=100;
		void say(){
			System.out.println("It's an Animal.");
		}
	}
 
	class Cat extends Animal{
		int num=50;
		void say(){
			System.out.println("It's a Cat.");
		}	
		void bark(){
			System.out.println("喵喵喵!");
		}
	}
 
	public class project2{
		public static void main(String[] args) {
			Animal cat=new Cat();//向上转型	
			System.out.println(cat.num);
			cat.say();
//			cat.bark();
		}
	}
ログイン後にコピー

実行結果:

#100

It's a Cat.

アップキャスト時に変換を強制しないでください。親クラス参照によって指定または呼び出されるメソッドは、サブクラスのメソッドです。これは動的バインディングと呼ばれます。上方変換後、親クラス参照はサブクラス独自のメソッドを呼び出すことができなくなります。

2. 下方変換

親クラスのインスタンスをそのサブクラス変数に変換します。明示的な変換を実行してコンパイラに意図を示すには、変換マーカー (サブクラス名) を使用する必要があります。変換を成功させるには、変換されるオブジェクトがサブクラスのインスタンスであることを確認する必要があります。

関数:

アップキャストすると、サブクラス オブジェクトに固有の他のメソッドは失われます。ダウンキャストしてから再度キャストし直すことができます。

package project2;
class Animal{
	int num=100;
	void say(){
		System.out.println("It's an Animal.");
	}
}
 
class Cat extends Animal{
	int num=50;
	void say(){
		System.out.println("It's a Cat.");
	}	
	void bark(){
		System.out.println("喵喵喵!");
	}
}
 
public class project2{
	public static void main(String[] args) {
		Animal cat=new Cat();//向上转型
		Cat cat2=(Cat) cat;//向下转型
		System.out.println(cat2.num);
		cat2.say();
		cat2.bark();
	}
}
ログイン後にコピー

実行結果:

50

It's a Cat.

Meow Meow Meow!


5. メソッドの書き換え

ヒント: メソッドをオーバーライドするには、親クラスと同じシグネチャを持つサブクラスでメソッドを定義する必要があります。

サブクラスは親クラスからメソッドを継承します。場合によっては、サブクラスが親クラスで定義されたメソッドの実装を変更する必要があることがあります。これはメソッドのオーバーライドと呼ばれます。

次の点に注意してください。

オーバーライドされたメソッドは、オーバーライドされたメソッドと同じシグネチャ、および同じまたは互換性のある戻り値の型を持つ必要があります。互換性とは、オーバーライドするメソッドの戻り値の型が、オーバーライドされるメソッドの戻り値の型のサブタイプになる可能性があることを意味します。インスタンス メソッドがアクセス可能な場合にのみオーバーライドできます。サブクラスで定義されたメソッドが親クラスでプライベートである場合、これら 2 つのメソッドにはまったく関係がありません。インスタンス メソッドと同様に、静的メソッドも継承できます。ただし、静的メソッドをオーバーライドすることはできません。親クラスで定義された静的メソッドを子クラスで再定義すると、親クラスで定義された静的メソッドは非表示になります。非表示の静的メソッドは、「親クラス名.静的メソッド名」の構文を使用して呼び出すことができます。継承と上書きを防止する

一个被final修饰的类和方法都不能被继承。被final修饰的数据域是一个常数。

有时候,可能希望防止类被继承。在这种情况下,使用final修饰符表明一个类是最终类,是不能作为父类的。Math类就是一个最终类。String、StringBuilder和StringBuffer类以及所有基本数据类型的包装类也都是最终类。例如,如下类A 就是最终类,不能被继承:

public final class A{
  //Data fields,constructors, and methods omitted
}
ログイン後にコピー

也可以定义一个方法为最终,最终方法不能被它的子类重写。例如如下,不能被重写:

public class Test {
  //Data fields,constructors, and methods omitted
 
  public final void m() {
    // Do something
 }
}
ログイン後にコピー

注:修饰符public、protected、private、static、abstract以及final可以用在类和类的成员上,只有final修饰符还可以用在方法中的局部变量上。方法内的final局部变量就是常量。

六、小结

为了重写一个方法,必须使用与它的父类中的方法一样的签名、一样或者兼容的返回类型来定义子类中的方法。实例方法只有在可访问时才能重写。这样,私有方法是不能重写的,因为它是不能在类本身之外访问的。如果子类中定义的方法在父类中是私有的,那么这两个方法是完全没有关系的噢!静态方法与实例方法一样可以继承。但是,静态方法不能重写,如果父类中定义的静态方法在子类中重新定义,那么父类中定义的方法被隐藏。可以使用表达式obj instanceof AClass 测试一个对象是否是一个类的实例。可以使用final修饰符来表明一个类是最终类,是不能被继承的;也可以表明一个方法是最终的,是不能被重写的。

推荐学习:《java视频教程

以上がJavaの概念理解ポリモーフィズムのまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート