2

これは最初のクラスです

package test;

public class Project {

public void doSomething (String stuff) {

    writeStuff();
    whichProject(stuff);

}

public void writeStuff(){

    System.out.println("This is stuff");

}


public void whichProject(String stuff){

    System.out.println("This is a random project " + stuff);

}

}

これが派生クラスです

package test;

public class Project1 extends Project{

public void whichProject(String stuff){

    System.out.println("Coding project number one: " + stuff);

}

public static void main(String[] args) {

    Project project = new Project1();

    project.doSomething("stuff");

}

}

Project1 を実行すると、出力は次のようになります。

This is stuff
Coding project number one: stuff

whichProject()Project ではなく Project1で呼び出すのはなぜですか? 結局のところ、doSomething()Project のメソッドではないでしょうか。または、基本クラスの別のメソッドの内部に基本クラスのメソッドがある場合、変数が参照するオブジェクトは、別のメソッドの内部にいても、どのメソッド呼び出しが呼び出されるかを決定しますか?

ここで、の修飾子をwhichProject()toに変更しprivateて、クラスが現在

package test;

public class Project {

public void doSomething (String stuff) {

    writeStuff();
    whichProject(stuff);

}

public void writeStuff(){

    System.out.println("This is stuff");

}


private void whichProject(String stuff){

    System.out.println("This is a random project " + stuff);

}

}

出力は次のようになります。

This is stuff
This is a random project stuff

そのためwhichProject()、変数が Project1 のオブジェクトを参照していても、Project のメソッドが呼び出され、Project1 のメソッドは呼び出されません。この場合、何が起こっているのかまったくわかりません。両方の状況(修飾子を使用するwhichProject()場合と修飾子を使用する場合)の説明をいただければ幸いです。publicwhichProject()private

4

3 に答える 3

1

メソッドの継承には、次のモデルを使用します。

  1. 現在のクラスのすべてのメソッドを収集します。
  2. 表示されている (つまり、表示されていないprivate) スーパー クラスからメソッドを追加します。
  3. このリストを継承リストの最上位クラスに追加します

メソッドが呼び出されると、Java はインスタンスの型を認識します。thisが不可視のメソッド パラメータとして各メソッドに渡されると想像してください。メソッドが定義されているクラスを調べても、メソッドは解決されません。

代わりに、Java は を受け取りthis、呼び出しgetClass()てから、上記のようにメソッドのリストを取得します。そのため、 のコードProjectが実行された場合でも、 のリストのメソッドが引き続き使用されProject1ます。

これは、メソッドを作成すると変わりますprivate。プライベート メソッドは上書きできません。上記のリストには表示されません。代わりに、Java はコードを挿入して、リストを調べずに直接呼び出します。

于 2013-11-07T15:52:44.573 に答える
1

継承はボト​​ムアップのアプローチに従います。

したがって、writeProject()使用されるのはスーパークラスのクラスでwhichProject(stuff)あり、基本クラスのクラスです。

この例の継承とポリモーフィズムを参照できます

それが役に立てば幸い。

于 2013-11-07T15:47:54.977 に答える