我对多态性和类

时间:2017-10-06 09:49:12

标签: java oop object polymorphism instanceof

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.How来对象X是A的实例?

2 个答案:

答案 0 :(得分:1)

检查此示例:

Object aStringObject=new String();

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

如果您知道它是一个String(您指向的实例是String类型),您可以将它转换为String,它会没问题。在上面的示例中,您可以执行以下操作:

String aStringString = (String) aStringObject; 

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

在你的情况下:

 A objectX = new B();

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

答案 1 :(得分:0)

A objectX = new B();

这里objectX是Class A(父类)的引用,它可以包含A类或B类(子类)的对象。

和=即new B()的右侧是B类(子类)的对象。

始终记得在java对象中使用new关键字创建。所以左侧部分是参考,右侧部分是对象。

当你调用这样的方法时

objectX.someMethod()

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

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