这段代码让我很困惑。第一条打印线是1600。我知道这与静态类是Car而不是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);
}
}
首先,请注意,当您调用SportsCar
的构造函数时,Java将自动调用其父类Car
的默认构造函数。这将把对象的父类Car
的volume
字段设置为1600。
在Java中,字段没有多态性。因此,尽管SportsCar
类中的toString()
方法总是覆盖其父类(Car
)的方法,但如何访问同名实例变量的规则略有不同。
如果您从SportsCar
类中访问volume
,则将使用SportsCar
的volume
。从类本身外部(因此当您从CarApplication
调用时)访问哪个实例变量取决于所讨论对象的编译时类型。因为您将car
的类型声明为Car
,所以使用父Car
类的volume
值——因此打印1600。如果您将car
声明为SportsCar
,则将打印3500。
另一个选项是:
<>以前System.out.println(((跑车)汽车).toString ());之前这将输出3500,因为car
的类型已经转换为SportsCar.
所以这里的重点是,当你使用car。volume, car变量类型为car,对象引用类型为SportsCar。
由于两个类都有相同的元素名为volume,并且您试图通过父对象变量引用它,因此它返回1600。
如果您进行类型转换,然后检查音量,它将返回3500,如下面的代码所示:
System.out.println(((SportsCar)car).volume);
当你这样声明某事时:
ParentClass variable = new ChildClass(Args);
ParentClass
中的方法和字段是您唯一可用的。它是受限制的,因为您将该类型声明为ParentClass
。因为Car
的volume是1600,并且对象被限制在ParentClass
的方法和字段中,所以它打印1600。
示例如下:
假设我有一个Apple类和一个Fruit类:
public class Fruit {
private String type;
public Fruit(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
And the Apple Class:
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
有它自己的构造函数,并且取它自己的volume,但是父类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());
Aman Chhabra的答案是正确的。您创建了一个SportCar对象,它来自Car"家族"。你打印的是Car的体积,而不是SportCar的体积。
另一种方法是创建一个SportsCar对象而不是Car。
p。S:你应该总是把你的类属性设置为private:)