我是 Java 新手。我创建了一个父类(super class)和一个从它扩展的子类:
class Car {
private String name;
private int wheels;
public Car(String name, int wheels) {
this.name = name;
this.wheels = wheels;
}
}
class Ford extends Car {
public Ford(String name, int wheels) {
super(name, wheels);
}
}
然后在主方法中我可以创建父类(super class)和子类的实例:
Car car = new Car("car", 4);
Ford ford = new Ford("ford", 6);
Car ford2 = new Ford("ford", 6);
我只是想问一下,创建实例时以Ford开头,还是以Car开头,有什么区别吗?正如您所看到的 ford 和 ford2 的创建方式不同。请注意,我知道 ford 和 ford2 不一样,因为它们是具有不同指针的引用变量。我只是想知道它们创建的语法。 谢谢
编辑:
我发现了差异,但不理解其背后的逻辑。
- 如果 Car 类中有一个方法,您可以从 ford 和 ford2 调用它
- 如果 Car 和 Ford 类中有同名的方法,您可以从 ford 和 ford2 调用它,并且它会调用子类中的方法
- 如果您仅在 Ford 类中拥有一个方法,则无法从 ford2 调用它 - 您将收到错误。
我真的不明白为什么,ford2仍然是福特的一个实例
最佳答案
到目前为止,我真的不喜欢这些答案。他们正在让简单的事情变得复杂。
变量只是引用的持有者。
正如您从示例中看到的,变量的类型不必与其所保存的引用的确切类型相匹配。该变量只需等于或比其引用更通用(或者,如果您愿意,等于或不太具体)。 Car
比 Ford
更通用,因此分配没问题。
每个引用都可以由 Object
变量保存,因为这是 Java 中存在的最通用类型。
Object foo = new Car(1, 6);
Object bar = "hello world";
现在,使用这些变量的困难在于我们只能调用 Object
类中的方法。通过将变量声明为 Object
,当我尝试访问内容时,我只能使用 Object
中的方法,无论其中实际存储了什么。
Object
中有几个方法(例如 toString
),因此这可能没问题,但在大多数情况下分配给 Object
是不是很有用。
因此,我们对变量越具体,我们可能访问的功能就越多。
当你说
Car car = new Ford("ford", 6);
当从此变量引用它时,我们可能无法访问一些福特特定的功能。稍后我们总是可以通过强制转换实例来解决这个问题,但除非绝对必要,否则应该避免这样做。
但是,我们越通用,我们的代码就越灵活。如果一个方法只以福特汽车作为参数,那是相当有限制的。如果可以取任何一辆车作为参数,那就更加灵活了。
一般来说,在为变量选择正确的类型时,您可以在心里尽可能地从最通用的类型开始,然后不断使其变得更加具体,直到它适合您的用例。
例如,如果您可以选择 Iterable
而不是 Collection
,也可以选择 Collection
而不是 List
,并且更喜欢 List
而不是 ArrayList
。
关于java - 创建子类的两种方法实际上是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032138/