1

次のクラス階層を作成しています。

abstract class Shape{
    protected abstract float getArea();
    protected abstract float getVolume();
}

abstract class TwoDimentionalShape extends Shape{
    public abstract float getArea();
    protected float getVolume(){
        return 0;
    }
}

class Square extends TwoDimentionalShape {
    float width, height;
    Square(float w, float h){
        width = w;
        height = h;
    }
    public float getArea(){
        return width*height;
    }
}

public class ShapeTest {
    public static void main(String args[]){
        Shape s = new Square(3, 4);
        System.out.println(s.getVolume());
    }
}

私がやりたいのは、クラスで使用されるので、クラスの関数getVolume()を非表示にすることです。TwoDimentionalShapeThreeDimentionalShape

問題は、関数を保護されていると宣言したのに、から呼び出すとmain()、プログラムが機能していることです。なぜこうなった?

4

5 に答える 5

4

保護は、パッケージ内またはパッケージ外のサブクラスと同じパッケージ内のクラスに表示されます。クラスはすべて同じパッケージに含まれているようです。それがあなたがそれを見ることができる理由です。

一般に、階層は次のとおりです。

パブリック-すべてのパッケージとサブクラスで利用可能

保護-サブクラスと同じパッケージで利用可能

(デフォルト、つまり何もありません)同じパッケージで利用可能

プライベート-同じクラスで利用可能

保証されておらず、使用されているセキュリティマネージャによって異なりますが、通常は「表示」できない一部のフィールド/メソッドに(リフレクションを使用して)アクセスすることができます。

この質問の最初の答えはそれを非常によく説明していると思います Javaでは、デフォルト、パブリック、プロテクト、プライベートの違い

于 2012-08-28T18:58:59.327 に答える
2

保護されたメンバーとメソッドは、パッケージと継承の階層内でアクセスできます。2次元にはボリュームがないため、そのメソッドを削除する必要があります。

getVolume()3次元以上のメソッドを追加します。

getVolume()にメソッドを追加することは、クラスにメソッドShapeを追加することと同じです。ここで、を拡張するクラスにある必要があります。getDesignation()PersongetDesignation()EmployeePerson

于 2012-08-28T19:00:24.293 に答える
1

Protected membersパッケージの外部に保護されたメンバーを持つクラスaccessedサブクラスlaw of inheritanceによって....、 ....によって作成できます。

SquareクラスはそのスーパークラスgetVolume()からメソッドを継承しています TwoDimentionalShape

サブクラスと同じパッケージに、クラスを拡張していない別のクラスがある場合、そのクラスのメソッドは表示されません...つまり、メソッドはそのプライベートメンバーのようになります。見えない。 SquareTwoDimentionalShapegetVolume()getVolume()

于 2012-08-28T18:59:42.920 に答える
0

私がやりたいのは、TwoDimentionalShapeクラスの関数getVolume()を非表示にすることです。これは、ThreeDimentionalShapeクラスで使用されるためです。

正しい道ではありません。通常、スーパークラスは、すべてのサブクラスに共通のメソッドを宣言/定義します。また、メソッドのいずれかがサブクラスに表示されない場合は、スーパークラス専用にする必要があります。また、メソッドが一部のサブクラスに共通しているが、他のサブクラスでは意味がある場合は、おそらくそこに属していないため、継承の継承のどこかで宣言/定義する必要があります。

すべてShapeのがボリュームを持っているわけではありません。

protected abstract float getVolume();

に収まりませんShape。それを削除し、ボリュームを持つことができるを表すShapeもの(のような)で宣言することをお勧めします。ThreeDimentionalShapeShape

于 2012-08-28T19:00:06.710 に答える
0

すべてのシェイプにボリュームがあるとは限らないため(場合によっては)、クラスツリーを変更し、Shapeクラスにメソッド定義を含めないでください。

public interface class Shape{ //optional but helpful: interface instead of abstract class. not an abstract class but an interface
    public float getArea();  //not abstract, not protected
    //protected abstract float getVolume(); this should not go in here
}

abstract class TwoDimentionalShape implements Shape{ //implement instead of extend. also this can qualify as an interface instead of an abstract class
    public abstract float getArea();
}

class Square extends TwoDimentionalShape {
    float width, height;
    Square(float w, float h){
        width = w;
        height = h;
    }
    /*public float getArea(){  not needed in a twodimensionalshape
        return width*height;
    }*/
}

public class ShapeTest {
    public static void main(String args[]){
        Shape s = new Square(3, 4);
        System.out.println(s.getVolume()); //will not compile
    }
}

これで、3Dクラスを作成できます。

abstract class ThreeDimentionalShape implements Shape{
    public abstract float getArea();
    public abstract float getVolume();  //All 3D shapes will have a volume!!
}

class Sphere extends ThreeDimentionalShape {
    float radius;
    Sphere (float radius){

    }
    public float getArea(){  not needed in a twodimensionalshape
        return {place some forgotten formula here};
    }
    public float getVolume(){  not needed in a twodimensionalshape
        return {place some forgotten formula here};
    }
}
于 2012-08-28T19:10:48.933 に答える