【问题标题】:I am confused about Polymorphism and object of class [duplicate]我对多态性和类对象感到困惑[重复]
【发布时间】:2018-03-18 02:20:26
【问题描述】:
class A {}
class B extends A{}

A objectX = new B();

最后一行是什么意思?是A类的对象还是B类的对象。

实例和对象的含义相同吗? objectX 是 A 的实例还是 B 的实例?

当我们运行 objectX.SomeMethod.编译器会检查什么?还是会在运行时检查方法?

  class A{}
  class B extends A{}
  public class Main{
  public static void main(String[] args){  
  A objectX =  new B(); 
  System.out.println(objectX instanceof B);//line 1
  System.out.println(objectX instanceof A);//line 2
  }
  }

如果我运行上面的代码,为什么它对第 1 行和第 2 行给出正确的结果。objectX 指向 B。为什么 objectX 是 A 的实例?

【问题讨论】:

标签: java oop object polymorphism instanceof


【解决方案1】:

检查这个例子:

Object aStringObject=new String();

在您的场景中,A 是 Object(所有对象的超类),B 是 String。因此,对于您的问题,aStringObject 现在是对 String 类对象的引用(或指针)。它被定义为 Object 类型的引用,因此它可以指向不同类型的对象而不仅仅是字符串。因此,如果您想避免代码中的编译错误,您只能将其用作对象。

如果你知道它是一个字符串(你指向的实例是字符串类型),你可以将它转换为一个字符串,这样就可以了。在上面的例子中你可以这样做:

String aStringString = (String) aStringObject; 

但是如果那个对象不是你刚刚声明的东西,你不能确定你能做到这一点,并且通过它的声明它可以是一个字符串,但它也不能是一个。

在你的情况下:

 A objectX = new B();

objectX 是 B 类型的一个实例,但引用(指针)是用 A 类型声明的,因此您可以安全地(无需强制转换)将它用作 A 类型对象,并且它会起作用,因为 B 类型的所有对象也是 A :) 你可以这样做 ((B)objectX).bMethod() 因为你知道它实际上是 B 但它不安全,因为它可以是这样声明的 A。

【讨论】:

  • 无论如何,您永远都不需要将 objectX 转换为“A”——并不是说您可以安全地将它用作 A,而是 A
  • 是的,这就是我的意思。您将它声明为 A 并且它是 A,因为 B 是 A。但是如果您想将其用作 B,则需要强制转换它。而且你不能安全地做到这一点,因为定义不能保证这个 objectX 是一个 B(你可能知道它,因为你创建了实例)。我写(没有强制转换)只是为了澄清,但我想它并没有让它更清楚:) 我在解释中感到困惑
  • 当然可以使用instanceof判断是否为B
【解决方案2】:
A objectX = new B();

这里的objectX是A类(父类)的引用,可以持有A类或B类(子类)的对象。

=的右边即new B(),是B类(子类)的对象。

永远记住在java中对象是使用new关键字创建的。所以左侧部分是参考,右侧部分是对象。

当你调用这样的方法时

objectX.someMethod()

在这种情况下,第一个编译器检查方法是否存在于引用类(A类)中。如果不存在则显示错误。

如果找到方法,则将从子类(B 类)调用方法。因为方法绑定是在运行时完成的。

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2018-08-15
    • 2016-04-08
    相关资源
    最近更新 更多