与静态绑定相关的java代码令人困惑



这段代码让我很困惑。第一条打印线是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的默认构造函数。这将把对象的父类Carvolume字段设置为1600。

在Java中,字段没有多态性。因此,尽管SportsCar类中的toString()方法总是覆盖其父类(Car)的方法,但如何访问同名实例变量的规则略有不同。

如果您从SportsCar类中访问volume,则将使用SportsCarvolume。从类本身外部(因此当您从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:)

相关内容

  • 没有找到相关文章

最新更新