0

次のように 2 クラスの Zoo & Moo があるとします。

public class zoo {
    String superString="super";
    private String coolMethod(){
        return "Zoo method";
    }
}

public class Moo extends zoo{
    public void useMyCoolMethod(){
        zoo z=new zoo();
        System.out.println(superString);//1
        System.out.println(z.superString);//2
    }
    public  static void main(String[]args){
        new Moo().useMyCoolMethod();
    }
}

1 と 2 では、継承とアクセスによってスーパー クラスの文字列の値を出力します。問題は、継承によって同じことができますが、Access の利点は何ですか? 2 つのクラスが diff パッケージにある場合、Access アプローチは許可されないことを知っている

4

7 に答える 7

2

あなたの例に関しては、「スーパー」を2回印刷したい場合、メソッドに「アクセス」するメリットはまったくありません。

しかし通常、オブジェクト指向プログラムには 3 つ以上のクラスが含まれており、作成者は定義済みのインターフェイス (パブリック メソッドまたは API) を使用してコードをモジュール化しようとします。継承のみでモジュールを作成するのは非常に難しく、ぎこちないコードを作成します。したがって、オブジェクトは他のインスタンスを必要とし、「アクセス」によってそこにメソッドを呼び出します。

于 2012-06-13T18:11:32.370 に答える
2

オブジェクト ref を介してアクセスすると、参照されているオブジェクトの状態が変更され、継承によって、現在のオブジェクト ( this 参照 ) が変更されます。したがって、クラス レベルおよびパッケージ レベルでのアクセス修飾子などのカプセル化を除けば、実際には利点はありません。コードに必要な動作に応じて、またはこの場合は、どの程度制限するかに応じて使用するだけです。コンテキストに応じてオブジェクトの状態を変更します。

しかし、それ以外に何かあるかどうかはわかりません。

于 2012-06-13T18:12:12.073 に答える
1

まず第一に、プライベートな可視性を持つクラス属性を維持し、ゲッターとセッターを介してそれらにアクセスすることをお勧めします。

第 2 に、継承によって属性にアクセスするのではなく、Zoo のインスタンスを作成し、パッケージの可視性のために superString 属性にアクセスしています。また、Zoo を拡張していないパッケージの別のクラスからそれらにアクセスすることもできます。クラス (そして、それは一般的には良いことではありません)

3 番目に、スーパー クラスのインスタンスを作成して、彼の public または default 属性にアクセスする必要はありません。次のように簡単に実行できます。

System.out.println(this.superString)

絶対に同じです(ローカル変数またはパラメーターが同じ名前で宣言されていない場合):

System.out.println(superString)

結論として、デフォルトまたはパブリック属性を持つ場合、クライアント クラスがそれらにアクセス (読み取りおよび書き込み) できるようにすると、クラスは何もできなくなります。これにより、それらの属性を使用するクラスのメソッドに副作用が生じる可能性があります。

于 2012-06-13T18:43:16.773 に答える
1

アクセス (デフォルトまたはパッケージ プライベート) はMoo、同じパッケージ内にあり、拡張されていない場合に役立ちZooます。

于 2012-06-13T18:10:05.790 に答える
1

1 行目では、継承を使用しています。つまり、animal クラスがあり、4 本足で動物を動かすメソッド move() があります。しかし、カンガルーの場合、アニマルクラスの特徴を最大限に活かしたいのですが、ジャンプや後ろ足での移動などをベースに動き方を変えたいと考えています。

ライン 2 では、コンポジションを使用しています。つまり、車を作成したい場合、別のコンポーネントが必要になり、その車が機能するためにそれらが相互に作用します。ここでは、GearBox または Engine から継承することはできませんが、それらを Car (またはアクセスと呼んでいるもの) の一部として使用する必要があります。

最終的には、Zoo と Moo の関係によって、どの方法を使用するかが決まります。

于 2012-06-13T18:13:30.373 に答える
1

このアクセスと継承の使用は、次の場合と同じですdo Not want to modify the content of the inherited memeber..

例えば:

public class A {

    String s = "Hello";

   }

public class B extends A{

    String s = "Hi;

   System.out.println(s);  // Will print the s in class B

   System.out.println(new A().s);  // Will print the s in class A

   }

String s には修飾子がないため、 を持つと見なされDefault modifierます。つまり、次の方法でアクセスできます。classes only with in its own package.

protected アクセス修飾子を使用する場合は、クラスを拡張してから継承されたメンバーを使用する必要があります。but you can Not use the protected member by creating an instance of the class that holds it and then use dot operator to access it, this will Not work..

例:

package com.go;

public class A {

  protected String s= "Hi";

 }

 package com.fo;

 public class B extends A {

  System.out.println(s);  // This will work

  A a = new A();
  System.out.println(a.s); // This will NOT work

 }
于 2012-06-13T18:17:13.757 に答える
0

例 2 では、zoo オブジェクトの別のインスタンスがありますが、これは少し奇妙ですが、メソッドは常に同じものを返すため、大きな違いはありません。メソッドをコンストラクター入力または何かに基づくように変更した場合、2.

public class zoo {
    public String superString;
    public zoo (String _superstring) {
        superString = _superstring;
    }
}

public class Moo extends zoo{
    public void useMyCoolMethod(){
        zoo z=new zoo("string1");
        System.out.println(superString);//1
        System.out.println(z.superString);//2
    }
    public Moo (String _superstring) {
        superString = _superstring;
    }
    public  static void main(String[]args){
        new Moo("string2").useMyCoolMethod();
    }
}

戻ります

文字列2 文字列
1

于 2012-06-13T18:14:07.003 に答える