【问题标题】:Create object in java [duplicate]在java中创建对象[重复]
【发布时间】:2016-06-15 21:29:16
【问题描述】:

这句话是什么意思:

B b = new C();

这是否意味着 b 同时是 B 类和 C 类的对象?谁能详细解释一下。

我知道

B b = new B();

当我从 B 类创建对象时,但我不知道这句话是什么意思

B b = new C();

【问题讨论】:

  • 那么,b 是超类 B 的对象吗?
  • C 是 B 类的子类。例如法拉利将是汽车的子类,因为它是汽车的一种。同样,这里的 C 是 B 的一种类型。变量 b 允许您创建 C,但只能通过 B 类的接口访问其方法等。想象一辆汽车有 start()、stop()、accelerate() 和 decelerate()。法拉利也会有这些方法,但它也可能添加一个 igniteTurbo() 方法。通过这样做,Car car = new Ferrari();,它允许我们创建一个 Ferrari 对象,但只允许访问前四个方法,而不是 igniteTurbo() 方法。
  • 我们还可以创建一个List<Car> list = new ArrayList<>();,它允许我们通过多态性原理处理同一个列表中的多种类型的汽车。每辆 Car 可能以不同的方式实现其基本方法,但我们可以通过相同的接口签名调用它们。
  • 好的,非常感谢您的帮助。
  • 一个附加说明 - B 也可以是一个接口,ManoDestra 在示例中显示的 List => B 不需要真的是一个类 ;-)

标签: java class object constructor


【解决方案1】:

在此语句中,C 显然与 B 具有“isA”关系 - 即,B 要么是 C 的祖先,要么是 C 实现的接口。

换句话说,你有一个

class B { ... }
class C extends B [ ... }

interface B { ... }
class C implements B { ... }

其中也可能存在这些组合,例如,BC 可能相隔不止一个继承步骤

class B { ... }
class X extends B { ... }
class C extends X { ... }

您正在创建一个C 实例并将其分配给B 类型的变量,这意味着您将只能使用通过B 可见的方法(至少无需显式转换)。

【讨论】:

  • 好的,非常感谢您的帮助。 .
  • @Mureinik 我不太清楚 B 是 C 的祖先——它也可能是一个接口......
  • @Betlista 很公平,这对我来说不是最好的措辞。我编辑了答案以改进措辞,谢谢!
【解决方案2】:
B b = new C();

表示B类型的引用引用了C类型的实例。 C 类是 B 的子类。在这种情况下,您可以使用B 类中定义的方法,方法是使用A 类中这些方法的重写版本(如果存在此类方法)。这种机制称为多态性

想象一下,您有两个B 类的子类,例如AC。您将在父类的方法中编写通用实现。然后,您将覆盖子类中某些方法的行为,以使它们更具体。

B b1 = new A();
B b2 = new C();
// the same type of references

b1.performAction();
b2.performAction();
// the same methods, but the different code will be executed 
// if the methods are overridden in the childs

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2015-07-12
    • 2017-04-19
    • 1970-01-01
    • 2011-02-26
    • 2012-12-20
    相关资源
    最近更新 更多