ホームページ >Java >&#&チュートリアル >Java におけるオーバーロードと書き換えの違い

Java におけるオーバーロードと書き換えの違い

巴扎黑
巴扎黑オリジナル
2017-06-23 16:37:341334ブラウズ

Javaを学習中の学生の皆様、ご注意ください! ! !
学習プロセス中に問題が発生した場合、または学習リソースを入手したい場合は、Java 学習交換グループ (159610322) に参加してください。一緒に Java を学びましょう!

まず、オーバーロードについて話しましょう:


(1) メソッドのオーバーロードは、クラスがさまざまな種類のデータを統一された方法で処理するための手段です。パラメータの数や種類が異なる、同じ名前の関数が複数同時に存在します。

オーバーロードは、クラス内のポリモーフィズムの現れで​​す。


(2) Java メソッドのオーバーロードとは、名前は同じですが、パラメーターと定義が異なる複数のメソッドを作成できることを意味します。

メソッドを呼び出すとき、メソッドに渡されるパラメーターの異なる数と型に基づいて、どのメソッドを使用するかを決定します。これがポリモーフィズムです。


(3) オーバーロードする場合、メソッド名は同じである必要がありますが、パラメータの型と数は異なり、戻り値の型は同じであっても異なっていても構いません。戻り値の型は、オーバーロードされた関数を区別するための基準として使用できません。


以下はオーバーロードの例です:
package c04.answer;// これはパッケージ名です
// これはこのプログラムの最初のプログラミング メソッドです。 main メソッドで、最初に Dog クラスのインスタンスを作成します。 this キーワードは、クラスのコンストラクターでさまざまな bark メソッドを呼び出すために使用されます。

さまざまなオーバーロードされたメソッド bark は、パラメーターの型に従って区別されます。

//注: コンストラクターを除き、コンパイラーは他の場所でコンストラクターを呼び出すことを禁止します。 E パッケージ C04.ANSWER;

Public Class Dog {

Dog () {
This.bark ();
void Bark () // Bark () Method {
System.out.println ("吠えない!" );
This.bark("雌", 3.4);
}
void bark(String m,double l)//注: オーバーロードされたメソッドの戻り値は同じです、
{ O System.out.println ("A Barking Dog!");
This.bark (5, "China"); 「パラメータの種類」と「クラス名」によってのみ区別できます
System.out. Dog Dog = new Dog();

それでは、Overridingについてお話します


(1) 親クラスと子クラス間のポリモーフィズム、親クラスの関数を再定義します。サブクラスで定義されたメソッドがその親クラスと同じ名前とパラメータを持つ場合、そのメソッドはオーバーライドされていると言います。 Java では、サブクラスは、同じメソッドを書き直すことなく、親クラスからメソッドを継承できます。

しかし、場合によっては、サブクラスが親クラスのメソッドを変更せずに継承したくないが、メソッドの書き換えが必要となる特定の変更を加えたい場合があります。

メソッドの書き換えは、メソッドの上書きとも呼ばれます。


(2) サブクラスのメソッドが親クラスのメソッドと同じメソッド名、戻り値の型、パラメータリストを持つ場合、新しいメソッドは元のメソッドを上書きします。

親クラスの元のメソッドが必要な場合は、現在のクラスの親クラスを参照する super キーワードを使用できます。


(3) サブクラス関数のアクセス変更権限は、親クラスのアクセス変更権限より低くすることはできません。
以下は書き換えの例です:


概念: オブジェクトのメソッドを呼び出すためのメカニズム。

動的バインディングの裏話:

1. コンパイラーは、オブジェクト宣言の型とメソッド名をチェックして、すべての候補メソッドを取得します。上記の例の Base クラスのテストをコメントアウトしようとすると、コンパイルは成功しません。

2. オーバーロードの決定: コンパイラーはメソッド呼び出しのパラメーターの型をチェックし、上記の候補メソッドから 1 つだけを選択します (このプロセス中に暗黙的な型変換が行われます)。

コンパイラーが複数を見つけた場合、または何も見つからなかった場合、コンパイラーはエラーを報告します。上記の例の Base クラスのテスト (バイト b) をコメントアウトしてみます。実行結果は 1 1 です。

3. メソッドのタイプが priavte static Final で、Java が静的コンパイルを使用する場合、コンパイラーはどの
メソッドを呼び出すかを正確に認識します。

4. プログラムが実行中で動的バインディングを使用してメソッドを呼び出す場合、仮想マシンはオブジェクトの実際の型と一致するメソッド バージョンを呼び出す必要があります。

この例では、b が指す実際の型は TestOverriding であるため、b.test(0) はサブクラスのテストを呼び出します。

ただし、サブクラスは test(byte b) をオーバーライドしないため、 b.test((byte)0) は親クラスの test(byte b) を呼び出します。

親クラスの(バイトb)をコメントアウトすると、2番目のステップで暗黙の型がintに変換され、最終的にサブクラスのtest(int i)が呼び出されます。

学習の要約:

ポリモーフィズムはオブジェクト指向プログラミングの機能であり、メソッドとは何の関係もありません
簡単に言うと、同じメソッドが異なる入力データに応じて異なる処理を実行できることを意味します。メソッド
オーバーロード - 異なるパラメータリストを使用する (静的ポリモーフィズム)

サブクラスが親クラスから同じメソッドを継承する場合、入力データは同じですが、親クラスとは異なる応答を作りたい場合は、親クラスのメソッドをオーバーライドします

つまり、サブクラスのメソッドを書き直します - 同じパラメーター、異なる実装 (動的ポリモーフィズム)

OOP の 3 つの主要な特徴: 継承、ポリモーフィズム、カプセル化。 System.out.print(b);

}

} L Public Class TestoverRiding Extends Base
{
void test (int i) {
++;
System.out.println (i);
{ ■ Base B = new TestOverriding();



オーバーライドの主な利点は、サブクラスに固有の特性を定義できることです:

public class Father{

public void speech(){

System.out.println(Father);

}

}

public class Son extends Father{

public void speech(){

System.out.println("son");


}

}

これはポリモーフィズムとも呼ばれ、オーバーライドメソッドは継承関係があるため、オーバーライド メソッドは親クラスの非プライベート メソッドのみをオーバーライドできます。

上記の例で、Fatherクラスのspeak()メソッドがprivateの場合、SonクラスはFatherクラスのspeak()メソッドをオーバーライドできません。このとき、Sonクラスのspeak()メソッドは定義されたspeak()メソッドと同等になります。 Son クラスで。

親クラスの speech() メソッドが最終的なものになると、メソッドが public、protected、またはデフォルトによって変更されたかどうかに関係なく、Son クラスはコードをコンパイルしようとすると、親クラスの speech() メソッドをオーバーライドできなくなります。コンパイラはエラーを報告します。例:

public class Father{

final public void speech(){

System.out.println("Father");

}

}

public class Son extends Father{

public void speech( ; これはサブクラスによってオーバーライドされ、同じパッケージ内にない場合はオーバーライドできません。

Father クラスの speech() メソッドがプロト化されると、同じパッケージ内のそのサブクラスによってオーバーライドされるだけでなく、異なるパッケージのサブクラスによってもオーバーライドされる可能性があります。

メソッドをオーバーライドするためのルール:

1. パラメータリストはオーバーライドされたメソッドと完全に同じである必要があります。そうでない場合は、上書きとは言えず、オーバーロードと呼ばれます。

2. 戻り値の型は、オーバーライドされたメソッドの戻り値の型と常に同じである必要があります。そうでない場合は、上書きと呼ばれることはできず、オーバーロードと呼ばれます。

3. アクセス修飾子の制限は、オーバーライドされたメソッドのアクセス修飾子より大きくなければなりません (public>protected>default>private)

4. オーバーライドするメソッドは、新しいチェック例外をスローしたり、オーバーライドされたメソッド Declare よりも大きくてはいけません。より広範なチェック例外。例:

親クラスのメソッドはチェック済み例外 IOException を宣言します。このメソッドをオーバーライドする場合、例外をスローすることはできません。スローできるのは IOException のサブクラスの例外のみであり、チェックされていない例外をスローできます。

オーバーロードのルール:

1. 異なるパラメーター リストが必要です。

2. パラメーター リストが異なる限り、非クリティカルな戻り値を使用できます。修飾子にアクセスします。

4. さまざまな例外をスローできます。

書き換えとオーバーロードの違いは次のとおりです。

多重定義されたメソッドを呼び出すときに、コード サイズを大幅に削減できます。異なるパラメータが渡される限り、異なる関数または戻り値を持ちます。

書き換えとオーバーロードをうまく活用すると、明確で簡潔な構造を持つクラスを設計できます。コードを書く過程において、書き換えとオーバーロードは非常に重要な役割を果たしていると言えます。 ! ! !

学習プロセス中に問題が発生した場合、または学習リソースを入手したい場合は、Java 学習交換グループ (159610322) に参加してください。一緒に Java を学びましょう!

以上がJava におけるオーバーロードと書き換えの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。