java - 创建子类的两种方法实际上是相同的?

标签 java inheritance

我是 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仍然是福特的一个实例

最佳答案

到目前为止,我真的不喜欢这些答案。他们正在让简单的事情变得复杂。

变量只是引用的持有者。

正如您从示例中看到的,变量的类型不必与其所保存的引用的确切类型相匹配。该变量只需等于或比其引用更通用(或者,如果您愿意,等于或不太具体)。 CarFord 更通用,因此分配没问题。

每个引用都可以由 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/

相关文章:

java - Google LoadingCache 无法存储加载的对象

java - 通过UDP解码java中的C结构数据报包

java - 从子类访问父类的私有(private)实例变量?

c++自动推导派生类

java - SubmissionPublisher 提交时不调用订阅者的 onNext

java - 如何将输出写入控制台和文件?

c++ - '{' token 之前的预期类名 - 带有头文件和 cpp 文件

python - 从python中的Parent类继承pandas dataframe的属性

javascript - RequireJS 和类继承

Java循环字符串替换