ホームページ > バックエンド開発 > PHPチュートリアル > メソッドの書き換えとメソッドのオーバーロード

メソッドの書き換えとメソッドのオーバーロード

伊谢尔伦
リリース: 2023-03-01 10:20:01
オリジナル
1954 人が閲覧しました

継承とポリモーフィズムはどちらもオブジェクト指向プログラミングの特性です。継承を使用すると、親クラスに基づいてサブクラスを作成できます。このサブクラスは、親クラスのプロパティとメソッドを持つだけでなく、独自のプロパティとメソッドも作成できます。サブクラスと親クラスの関係により、メソッドの書き換えとメソッドのオーバーロードの問題が発生します。継承とポリモーフィズムにおけるメソッドの書き換えとメソッドのオーバーロードの適用には多くの問題があります。これらの概念は混同されやすいため、ポリモーフィックなメソッドを使用してプログラムを作成し、プログラムの信頼性を向上させることを学ぶことが非常に重要です。基礎。

1. メソッドの書き換え (0veriding)
書き換えの定義方法: Java プログラムでは、クラスの継承関係により、サブクラスが親クラスのすべての特性を継承して生成されます。すべてのメソッドと変数。サブクラスは新しい機能を定義できます。機能を拡張および強化するためにサブクラスが親クラスの一部のメソッドを変更する必要がある場合、プログラム設計者はそのような操作メソッドの書き換えを「上書き」または「上書き」とも呼びます。書き換えは Java の優位性を反映しており、継承関係に基づいているため、言語構造がより豊かになります。 Java の継承では、サブクラスは親クラスのメソッドを非表示にしたりアクセスしたりすることができ、親クラスから継承したメソッドをオーバーライドすることもできます。 Java で継承された親クラスのメソッドをオーバーライドするには、メソッドを書き換えます。

いわゆるメソッドの書き換えとは、サブクラスのメソッドが、親クラスから継承したメソッドとまったく同じ戻り値の型、メソッド名、パラメータの数、パラメータの型を持つことを意味します。このようにして、親クラスのメソッドを上書きできます。例: 次のコードはメソッドのオーバーライドを実装します。

class Person//定义父类
fpublic void print(){//父类中的方法
System.out.println( 父类Person的print方法! );
}
}
class Student extends Person//定义子类继承Person类
{public void print(){//方法的重写
System.out.println( 子类Student的print方法! );
}
}
public class 0verrideExampleO1
{public static void main(String args[])
{Student s=new Student();
S.print();
}
}
ログイン後にコピー

実行結果: サブクラス Student の print メソッド!


サブクラスが親クラスの print() メソッドをオーバーライドした後、サブクラスの print() メソッドが S を使用して呼び出されていることがわかります。 ) クラス内のメソッドがオーバーライドされます。言い換えれば、サブクラスが親クラスのメソッドをオーバーライドした場合、呼び出されたときに必ずオーバーライドされたメソッドが呼び出されます。このとき、この関数を呼び出す必要がある場合はどうなるでしょうか。 super キーワードを使用すると、サブクラスから親クラスのコンテンツにアクセスできます。オーバーライドされたメソッドにアクセスする場合は、「super.メソッド名 (パラメーター リスト)」の形式を使用して呼び出します。


例:

Class Person
{public void print () {
System.out.println( 父类Person的print方法! );
}
}
class Student extends Person
{public void print () {
super.print(://访问父类中被子类覆写过的方法
System.out.println(" 子类Student的print方法!" );
}
}
public class OverrideExample02
{public static void main(String args[])
{Student s=new Student();
S.print();
}
}
ログイン後にコピー

実行結果: 親クラス person! の print メソッド

サブクラス Student! の print メソッド
super キーワードを使用したい場合は、メソッドの書き換え後に使用する必要はありません。明示的に使用することもできます。メソッドが親クラスから継承されることを示します。 super


を使用すると、サブクラスではなく親クラスから検索したいことがより明確になります。

2. 書き換えルール

メソッドをオーバーライドするときは、次のルールに従う必要があります:

(1) 親クラスのメソッドのパラメーター リストは、サブクラスによってオーバーライドされるメソッドのパラメーター リストと完全に同じである必要があります。そうしないと、Rewrite を呼び出すことはできませんが、オーバーロードされます。 ..
(2) 親クラスの戻り値の型は、サブクラスによってオーバーライドされるメソッドの戻り値の型と同じである必要があります。そうでない場合は、書き換えではなくオーバーロードと呼ぶことができません。 ..
(3) Java では、サブクラスによってオーバーライドされるメソッドは、親クラスのメソッドよりも制限的なアクセス権を持つことができないと規定しています。アクセス許可の関係は次のとおりです。

Java プログラムを書いたことがある人は、親クラスのメソッドのアクセス許可修飾子が private の場合にのみ、親クラスのメソッドを書き換えることができないことを知っています。外部クラスではなく、独自のクラスによってアクセスされ、サブクラスによってオーバーライドすることはできません。親クラスで定義されたメソッドがパブリックであり、サブクラスのメソッドがプライベートとして定義されている場合、プログラムの実行時にエラーが報告されます。例:


class Person
{public void print()(//public访问权限
System.out.println( "父类Person的print方法! ");
}
}
Class Stedent extends Person
{private void print()(//重写方法降低了访问权限,错误
System.out.println( "子类Student的print方法!" );
}
}
ログイン後にコピー

(4) 親クラスのアクセス許可修飾子は、サブクラスによってオーバーライドされるメソッドのアクセス許可修飾子より大きくなければならないため、プライベート許可は最小になります。したがって、親クラスの特定のメソッドのアクセス許可がプライベートである場合、サブクラスでそれをオーバーライドすることはできません。再定義しても新しいメソッドが定義されるだけで、書き換えの効果は得られません。

(5) 継承プロセス中に、親クラスのメソッドが例外をスローした場合、サブクラスで親クラスのメソッドをオーバーライドするときにも例外をスローする必要があり、スローされる例外の数はそれ以上にすることはできません親クラスでスローされた例外と同じです (親クラスでスローされた例外と同じである可能性があります)。つまり、オーバーライドされたメソッドは、新しいチェック例外、またはオーバーライドされたメソッドによって宣言されたものよりも広範囲のチェック例外をスローしてはなりません。たとえば、親クラスのメソッドがチェック済み例外 IOException を宣言している場合、このメソッドをオーバーライドする場合、例外をスローすることはできません。また、スローできるのは IOException のサブクラスの例外のみです。




同様に、サブクラスでメンバー変数を作成し、その変数が親クラスの変数と同じ名前を持つ場合、それを変数オーバーライドまたは属性オーバーライドと呼びます。しかし、ほとんど意味がないため、この概念を研究する人はほとんどいません。

三、方法重载(Overloading)

(一) 如何定义重载。方法的重写和重载只有一个字不同,很多初学者认为这两者十分相似,其实不然。方法重载是让类以统一的方式处理不同类型数据的一种手段。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性。
所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。参数列表不同指的是参数个数、参数类型或者参数的顺序不同。方法的重载在实际应用中也会经常用到。不仅是一般的方法,构造方法也可以重载。下面通过一个实例来分析。
重载的定义和使用方法。

Class Person {
{String name; 
int age;
void print(){ 
System.out.println("姓名:" +name+"年龄:" +age); 
}
void print(String a,int b){ 
System.out.println("姓名:" +a+"年龄:"+b); 
void print(String a,int b,intC){ 
System.out.println("姓名:"+a+"年龄:" +b+"ID号:" +c); 
}
void print(String a,int b,doubleC){ 
System.out.println("姓名:"+a+"年龄:" +b+"ID号:"+c); 
} 
}
public class OverLoadExampleOL 
{publicstaticvoidmain(String args[]) 
{Personpl=newPerson();
p1.nanle="李明";
p1.age=22;
p1.print(); 
p1.print("王小早",19); 
p1.print("金波",18,100325); 
p1.print("婉宁",25,110903); 
} 
}
ログイン後にコピー

在上面的程序中,可以看到Person类中有多个名为 void print的方法,这就是方法的重载。执行程序,运行结果如下:

姓名:李明年龄:22
姓名:王小早年龄:l9
姓名:金波年龄:18ID号:10 00325
姓名:婉宁年龄:25ID号:110903

在方法重载时,方法之间需要存在一定的联系,因为这样可以提高程序的可读性,一般只重载功能相似的方法重载规则。重载是指我们可以定义一些名称相同的方法,通过定义不同的参数来区分这些方法,然后再调用时,Java虚拟机就会根
据不同的参数列表来选择合适的方法执行。也就是说,当一个重载方法被调用时,Java用参数的类型和.. (或)个数来决定实际调用的重载方法。因此,每个重载方法的参数的类型或个数必须是不同。虽然每个重载方法可以有不同的返回类型,
但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法是,参数与调用参数匹配的方法被执行。在使用重载要注意以下的几点:

1.在使用重载时只能通过不同的参数列表,必须具有不同的参数列表。例如,不同的参数类型,不同的参数个数,不同的参数顺序。当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),但是不能为 fun(int,int)。
2.不能通过访问权限、返回类型、抛出的异常进行重载。
3.方法的异常类型和数目不会对重载造成影响。.. 
4.可以有不同的返回类型,只要参数列表不同就可以了。
5.可以有不同的访问修饰符。

6.可以抛出不同的异常。

四、方法重写与方法重载的区别
通过上面例子的分析,我们可以将方法重写和重载的区别总
结成这样一个表格,如下:

メソッドの書き換えとメソッドのオーバーロード

五、结束语
在面向对象程序设计的思想中,类的继承和多态性主要就是体现在子类重写父类的方法。而构造方法的重载作为方法重载的一个典型特例,可以通过重载构造方法来表达对象的多种初始化行为。灵活的运用方法重写与方法重载,不仅能减少编码的工作量,也能大大提高程序的可维护性及可扩展性。用好重写和重载
可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般。

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