ポリモーフィズム
1.メソッドのポリモーフィズム:オーバーロードと上書き
オーバーロード:異なるパラメーターのタイプと数に応じた同じメソッド名は、異なる関数を完了することができます;
上書き:異なるインスタンス化されたサブクラスに応じた同じメソッドオブジェクトごとに機能が異なります。
2.オブジェクトのポリモーフィズム:親クラスと子クラスのオブジェクトの
変換上方への変換:子クラスのオブジェクトは親クラスのオブジェクトになり、形式:親クラスの親クラスのオブジェクト=子クラスのインスタンス、自動変換;
下方への変換:親クラスのオブジェクトは子になりますクラスオブジェクト、形式:サブクラスサブクラスオブジェクト=(サブクラス)親クラスインスタンス、強制変換;
例:オブジェクトは下向きに変換されます。
class A4{
public void print(){
System.out.println("父类");
}
}
class B4 extends A4{
public void print(){
System.out.println("子类");
}
}
public class Test1_1_3_7 {
public static void main(String args[]){
A4 a=new B4();
a.print();
}
}
//结果:
//子类
最終的な実行は、インスタンス化されたオブジェクトが存在するクラスが親クラスのメソッドをオーバーライドするかどうかに基づいて決定されます。このプログラムはサブクラスオブジェクトをインスタンス化し(新しいB4())、print()メソッドはサブクラスによって上書きされます。次に、最後の呼び出しは上書きされたメソッドでなければなりません(クラス名を調べないでください。ただし、インスタンス化されたオブジェクトのクラスによって異なります)。
例:オブジェクトは下向きに変換されます
class A4{
public void print(){
System.out.println("父类");
}
}
class B4 extends A4{
public void print(){
System.out.println("子类");
}
}
public class Test1_1_3_7 {
public static void main(String args[]){
A4 a=new B4(); //实例化的是子类对象,对象向上转型
B4 b=(B4)a; //对象需要强制性地向下转型
b.print(); //调用被子类覆写过的方法
}
}
//结果:
//子类
強制変換操作があるため、下向きの変換操作自体に前提条件があります。つまり、下向きの変換は、上向きの変換が発生した後に実行する必要があります。
例:間違ったダウンコンバージョン操作
class A4{
public void print(){
System.out.println("父类");
}
}
class B4 extends A4{
public void print(){
System.out.println("子类");
}
}
public class Test1_1_3_7 {
public static void main(String args[]){
A4 a=new A4(); //直接实例化子类对象,没有进行向上转型
//此时并没有发生子类对象向上转型的操作,所以强制转型会带来安全隐患
B4 b=(B4)a; //强制向下转型,产生异常
b.print(); //此语句无法执行
}
}
特徴:
アップキャスト:オブジェクトパラメータが統一されているが、サブクラスのメソッドによって上方遷移は、コール親クラス・オブジェクトは、親クラスのメソッドを介して定義することができ、インスタンス化され、
意気消沈:の目的親クラスのオブジェクトは、それをインスタンス化するサブクラスで特別なメソッドを使用する必要がありますが、下方変換は強制的な変換であるため、このような操作はセキュリティリスクを引き起こしやすいです。
スムーズな移行を確実にするために、Javaはキーワードinstanceofを提供しています。これは、オブジェクトが指定されたクラスのインスタンスであるかどうかを判別するために使用できます。
使用形式は次のとおりです。
对象 instanceof 类 返回boolean型
オブジェクトがクラスのインスタンスである場合はtrueを返し、そうでない場合はfalseを返します。
例:instanceofを使用して判断する
class A6{
public void print(){
System.out.println("父类");
}
}
class B6 extends A6{
public void print(){ //覆写
System.out.println("子类");
}
public void funB(){
System.out.println("子类扩充的方法");
}
}
public class Test1_1_3_9 {
public static void main(String args[]){
fun(new B6()); //对象向上转型
}
public static void fun(A6 a){
a.print();
if(a instanceof B6){ //如果a对象是B6类的实例
B6 b=(B6)a; //向下转型
b.funB(); //调用子类扩充的方法
}
}
}
//结果
//子类
//子类扩充的方法