0

サブクラスのコンストラクターを使用してオブジェクトを作成しようとしていますが、サブクラスコンストラクターでそのオブジェクトに値を割り当てることができません。

これがスーパークラスです。

public class Bike
{
    String color = "";
    String type = "";
    int age = 0;

    public static void main (String [] args)
    {
    }

    public Bike (String s, int i)           // Constructor
    {
        color = s;
        age = i;
    }

    public void PrintBike ()
    {
        if (type == "")
        {
            System.out.print(" You didn't give the proper kind of bike."); 
        }
        else
        {
            System.out.print(" Your bike is a " + type + " bike. \n");
        }
    }
}

これはサブクラスです。

public class BikeAdv extends Bike
{
    private String type;

    public BikeAdv (String color, int age, String BikeType)
    {
        super (color, age);
        type = BikeType;
    }
 }

コンストラクターを呼び出すクラスは次のとおりです。

public class Green
{
    public static void main (String [] args)
    {
        Bike greenBike = new BikeAdv ("Green", 20, "Mountain");
        greenBike.PrintBike();
    }
}

クラス「Green」を実行すると、「適切な種類の自転車を提供しなかった」という出力が表示されます。一方、「あなたのバイクはマウンテンバイクです」と表示されると思います。

ありがとう!

4

3 に答える 3

3

サブクラスのフィールドは、スーパークラスtypeのフィールドをシャドウしtypeます。スーパークラスのフィールドに値が入力されることはなく、それがチェックされます。

サブクラスのフィールドを削除するだけで、そこに割り当てられたスーパークラスフィールドにデータが入力され、コードは期待どおりに機能する可能性があります。

ただし、他の回答で述べたように、デフォルトの可視性ではなく、必要に応じてフィールドをプライベートまたは保護する方が適切です。

于 2012-07-15T22:42:54.290 に答える
0

クラスBikeは抽象的でもインターフェースでもありません。つまり、そのすべてのメソッドは、Bikeクラスで述べたとおりです。greenBikeをBikeAdvではなくBikeに割り当てる場合、BikeAdvクラスではなくBikeクラスのメソッドを使用するように指示します。最善の策は、Bikeを抽象化し、PrintBikeを本体なしで無効のままにすることです。

また、BikeType文字列をスーパークラスに渡すことはないため、受け取る方法はありません。

于 2012-07-15T22:40:54.980 に答える
0

明示的な可視性なしでこれらの属性を宣言しました:

    String color = "";
    String type = "";
    int age = 0;

また、でtype再宣言しましたがBikeAdv、これはおそらくエラーです(必要はありません)。

これらの属性にそのクラスからのみアクセスできるようにする場合は、それらを宣言する必要がありますprivate。ただし、その場合、コンストラクターをパラメーター化して、それらすべてを変更できるようにする必要があります。または、それらのセッターを作成することもできます(この方法では、クラスの外部からのアクセシビリティを許可することに注意してください)。

    private String color = "";
    private String type = "";
    private int age = 0;

クラスの外部からは変更できないが、サブクラスからはアクセスできるようにする場合は、保護されていると宣言します。

    protected String color = "";
    protected String type = "";
    protected int age = 0;

ご覧のとおり、多くの可能性があります。ここでそれらをチェックしてください:

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2012-07-15T22:44:12.833 に答える