1

クラスがあるとしましょう

public class Base {}

そして子クラス

public class Derived extends Base {

    public void Foo(Object i){
        System.out.println("derived - object");
    }
}

そしてメインクラス

public class Main {
    public static void main(String[] args) {
        Derived d = new Derived();
        int i = 5;
        d.Foo(i);
    }
}

コンソールには、 派生オブジェクトが表示されます

しばらくして、スーパークラスを次のように変更したいと思います。

public class Base {

    public void Foo(int i) {
        System.out.println("base - int");
    }
}

プログラムを実行すると、次のように表示されます。

base - int

では、子クラスで使用できないスーパークラスのメソッドを作成できますか? 結果として、派生オブジェクトを見たいと思っています。

私が何を望んでいるのか理解していない人もいるので、説明しようと思います:

スーパークラスのみを変更したいのですが、子クラスは変更したくありません。たとえば、スーパークラスで jar を作成し、子クラスで jar を作成する場合です。すべてのjarを変更したくない..メソッドをスーパークラスに追加して、スーパークラスで使用できるようにしたい..そしてそのようなコード

    public class Main {
    public static void main(String[] args) {
        Derived d = new Derived();
        int i = 5;
        d.Foo(i);
        Base b = new Base();
        b.Foo(i);
    }
}

ください

派生 - オブジェクト ベース - int

4

4 に答える 4

2

Foo基本クラスのメソッドには次のシグネチャを使用する必要があります。

public void Foo(Object i) {
    System.out.println("base - int");
}

Fooこのようにして、基本クラスからメソッドをオーバーライドできます。このメソッドをオーバーライドするのではなく、代わりにオーバーロードします。

基本クラスで署名を使用する場合は、基本クラスでメソッドを としてpublic void Foo(int i)定義できます。Fooprivate

PS:ご理解いただけたかと思います。

于 2012-08-15T07:09:17.083 に答える
2
  • プライベートメンバーはクラス スコープに限定されます。
  • デフォルト(これにはキーワードなし) は、同じパッケージの他のメンバーに限定されます。
  • protectedは階層に限定されます。
  • 公開は限定されません。

したがって、子クラスがスーパークラスのメンバーにアクセスしたくない場合 (メンバーはメソッド、列挙型、変数などを意味します)、次のように foo を宣言する必要があります。

public class Base {

    private void Foo(int i) {
        System.out.println("base - int");
    }
}

私のコメントから編集:コンパイル時に子クラスが親のメンバーにアクセスしたくない場合、外部クラスがそれにアクセスできるようにする方法はまだありません。より広い範囲を許可しながら、近い範囲からのアクセスをブロックしたい。これは、メソッドをオーバーライドし、アクセス違反またはコンパイル時ではなく実行時に例外をスローすることによってのみ実行できます。カスタム注釈を使用して機能させることはできますが、これを行う方法がわかりません。

于 2012-08-15T07:14:39.420 に答える
1

メソッドを final にすることができます。つまり、子クラスはメソッドをオーバーライドできません。

そうしないと、子クラスがメソッドをオーバーライドすると、メインからスーパー クラスのメソッドを呼び出すことができなくなります。

規約上の注意: Java では小文字のメソッド名を使用してください。

于 2012-08-15T07:09:51.550 に答える
1
package com.abc;


public class TestParentChild {

    public static void main(String[] asd) {
        Base b = new ChildB();
        b.foo(5);
    }
}

class Base {
    public void foo(int i) {
        System.out.println("derived - int");
    }

}

class ChildB extends Base {
    public void foo(int i) {
        System.out.println("derived - object");
    }
}

これはあなたを助けるかもしれません

于 2012-08-15T07:22:57.823 に答える