-4

このコードについての何かが私を混乱させます。最初の出力行は 1600 です。静的クラスが Car であり、Sportscar ではないことに関係があると理解しています。しかし、オブジェクトを Sportscar として作成したのに、ボリューム フィールドが 3500 でないのはなぜでしょうか? ありがとう。

 public class Car {
 public int volume;

 public Car() { this(1600); }
 public Car(int volume) { this.volume = volume; }
 public String toString() { return "Car:" + volume; }
 }



 public class SportsCar extends Car {
 public int volume;

 SportsCar() { this(3000); }
 SportsCar(int volume) { this.volume = volume; }
 public String toString() {return "SportsCar:"+volume;}
 }



 public class CarApplication {
 public static void main(String [] args) {
 Car car = new SportsCar(3500);

 System.out.println(car.volume);
 System.out.println(car.toString());
 System.out.println(car);
 }
 } 
4

4 に答える 4

2

SportsCarまず、 Java のコンストラクターを呼び出すと、その親クラスのデフォルト コンストラクターが自動的に呼び出されることに注意してくださいCar。これvolumeにより、オブジェクトの親Carクラスのフィールドが 1600 に設定されます。

Java では、フィールドのポリモーフィズムはありません。したがって、クラスtoString()内のメソッドSportsCarは常にその親 ( Car) クラスのメソッドをオーバーライドしますが、同じ名前のインスタンス変数にアクセスする方法の規則は少し異なります。

クラスvolume内からアクセスしている場合は、 ofが使用されます。クラス自体の外側から (つまり、から呼び出している場合)、どのインスタンス変数にアクセスするかは、問題のオブジェクトのコンパイル時の型によって異なります。の型をa と宣言しているため、親クラスの値が使用されます。したがって、1600 が出力されます。代わりに であると宣言した場合、 3500 が出力されます。SportsCarvolumeSportsCarCarApplicationcarCarvolumeCarcarSportsCar

別のオプションは次のとおりです。

System.out.println(((SportsCar)car).toString());

carの型がにキャストされているため、これは 3500 を出力します。SportsCar.

于 2016-06-29T18:49:36.820 に答える
1

この方法で何かを宣言すると、次のようになります。

ParentClass variable = new ChildClass(Args);

のメソッドとフィールドParentClassのみが使用できます。型を として宣言したため、制限されていますParentClassCarのボリュームは 1600 で、オブジェクトはParentClassのメソッドとフィールドに制限されているため、1600 と出力されます。

例は次のとおりです。

Apple クラスと Fruit クラスがあるとします。

public class Fruit {
    private String type;

    public Fruit(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }
}

そしてAppleクラス:

public class Apple extends Fruit {
     private String variant;

     public Apple(String variant) {
          System.out.println("I like " + variant + apples too!");
          super("Apple");
     }

     public String getVariant() {
          return variant;
     }
}

そして今、私はこのようにインスタンス化します:

Fruit ap = new Apple("Fiji");

getVariant()タイプがAppleではなく親クラスであるため、Appleクラスにアクセスしたり、メソッドにアクセスしたりできません。私はできるだろうがgetType()、それだけです。

あなたの場合:

public class SportsCar extends Car {
    public int volume;

    SportsCar() {
        this(3000); 
    }

    SportsCar(int volume) { 
        this.volume = volume; 
    }

    public String toString() {
        return "SportsCar:"+volume;
    }
}

SportsCar独自のコンストラクターを持ち、独自のボリュームを取りますが、親クラスがCar実際の型であるため、Carコンストラクターが呼び出されるためvolume、1600 に設定されます。SportsCarオブジェクトを指定するには、次のようにします。

SportsCar sc = new SportsCar(3500);
System.out.print(sc.toString());

これは出力されます:

SportsCar:3500

次のように型キャストすることもできます。

Car c = new SportsCar(1600);
System.out.print(((SportsCar) c).toString());
于 2016-06-29T18:24:42.630 に答える
1

ここでのポイントは、car.volume を使用している場合、car 変数は Car 型であり、オブジェクト参照は SportsCar 型であるということです。

両方のクラスにボリュームという名前の同じ要素があり、親オブジェクト変数を介してそれを参照しようとしているため、1600 が返されます。

タイプキャストしてから音量を確認すると、以下のコードのように 3500 が返されます。

System.out.println(((SportsCar)car).volume);
于 2016-06-29T18:34:16.240 に答える