我对 class 的多态性和对象感到困惑

I am confused about Polymorphism and object of class

class A {}
class B extends A{}

A objectX = new B();

最后一行是什么意思?它是 class A 的对象还是 class 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.How 为真,那么 objectX 是 A 的一个实例。?

检查这个例子:

Object aStringObject=new String();

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

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

String aStringString = (String) aStringObject; 

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

你的情况:

 A objectX = new B();

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

A objectX = new B();

这里的objectX是Class A(parent class)的引用,它可以持有class A或class B(child class).

和 = 的右侧,即 new B(),是 B class(child class) 的对象。

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

当你这样调用方法时

objectX.someMethod()

在这种情况下,第一个编译器检查方法存在于参考 class(A class) 或 not.if 不存在然后显示错误。

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