【问题标题】:Java - Superclass (Inheritance) vs Parent class (no Inheritance)Java - 超类(继承)与父类(无继承)
【发布时间】:2015-03-14 11:23:41
【问题描述】:

这里是新手,准备面试。

我正在阅读和练习面向对象的编程概念,但是我一直不明白为什么在(在 Java 中)我们可以创建成员类时继承很重要...

例如,Oracle's official Java tutorial 给出了自行车的示例,尽管不同类型的自行车(山地、公路或双人自行车)有许多共同的特征,但它们也都有自己独特的不同特征。因此,为了实现这一点,我们创建了一个 Bikes 类,它具有所有的共同特征,然后将山地、公路和双人自行车的类分开,所有这些都继承了自行车类。像这样的......

class Bike {
     int speed;
     int gear;
}

class MountainBike extends Bike {
     int chain rings;
}

//classes for road bike and tandem bike etc...

跟下面不一样吗?

class Bike {
     int speed;
     int gear;

     class MountainBike {
         int chain rings;
     }

     //classes for Road bike or tandem bike etc...
}

我的意思是创建的 MountainBike 类的实例也将具有速度和齿轮特征,对吗?这就是继承的全部意义,即通过消除创建许多对象共有的单独数据成员的需要来减少冗余数据。那么为什么我们需要继承呢?

感谢您的耐心等待...

【问题讨论】:

  • 在您的示例中,MountainBikeBike 的内部类,而不是static,因此只有当您有Bike 的封闭实例时才能拥有它的实例。不管怎样,如果你想让BikeMountainBike 都有一个ride 方法,你会怎么做?如果您还想拥有RoadBikeDirtBikeTricycle,您将如何更改您的设计?
  • @MikeKobit 小术语问题 - inner 类不能是静态的。根据定义,静态嵌套类不是内部类,因为它没有包含实例。

标签: java class oop inheritance nested-class


【解决方案1】:

第一个例子说每个MountainBike 一个Bike。应该是这样的。

第二个例子说每个MountainBike属于一个Bike。这根本没有意义。例如,在您的第二个示例中,您可以编写

Bike bike = new Bike();
Bike.MountainBike mountainBike1 = bike.new MountainBike();
Bike.MountainBike mountainBike2 = bike.new MountainBike();

这将创建一个名为bike 的新Bike 和两个属于bikeMountainBike

作为Bike 的内部类有意义的东西是Wheel。然后你可以写

Bike bike = new Bike();
Bike.Wheel frontWheel = bike.new Wheel();
Bike.Wheel backWheel = bike.new Wheel();

那么您将拥有一个Bike 和两个属于BikeWheels

【讨论】:

  • 解释得很好!谢谢!
【解决方案2】:

在第二个示例中,MountainBike 不是 Bike 的扩展,而是 Bike 的内部类(或嵌套类)。内部类有非常具体的用途,但你没有得到的一个好处是继承。相反,内部类通常用作只有父类才需要的辅助类。就个人而言,我发现我很少使用它们,因为我的回答通常是否定的,对于这个问题:“父类是唯一需要使用这个类的类吗?”所以,我通常最终会创建一个单独的课程。

这是一个参考页面,来自当前的 Java 公司:Nested classes

编辑

根据该参考资料,使用内部类有 3 个“令人信服”的理由。就个人而言,我想不出任何添加到列表中的理由,但我不同意它使代码更易于阅读——这是非常主观的,并且取决于开发人员的习惯:

  1. 这是一种对仅在一个地方使用的类进行逻辑分组的方法
  2. 它增加了封装性
  3. 它可以带来更易读和维护的代码

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    您的问题是第二个示例中的 MountainBike 类只能在 Bike 类中访问。在创建 MountainBike 时,您需要扩展 Bike 作为它自己的类,以便 MountainBike 可以被其他类访问,并从它的父类 Bike 继承字段和方法。

    【讨论】:

      【解决方案4】:

      为什么我们需要继承?管理全局的东西,比如目录。 可能我是一家自行车店的经理,我只需要知道我有多少辆自行车,以及它们的价格。但是作为卖家我需要知道是山地车还是城市车,它们有什么区别

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2012-02-25
        • 2015-11-16
        • 2012-10-30
        相关资源
        最近更新 更多