2017-10-06 107 views
-1
class A {} 
class B extends A{} 

A objectX = new B(); 

最后一行是什么意思?它是A类的对象还是B类的对象?我对多态性和对象的类型感到困惑

实例和对象是否有相同的含义?是A的objectX实例还是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来_对象是A的一个实例?

+2

它是类型A的引用,引用了类型B的对象。这意味着您只能调用方法并引用A类中定义的字段。 –

+3

如果你在代码中显示你的问题,而不是试图用文字描述它会容易得多。 –

+0

访问: https://stackoverflow.com/questions/13077009/java-difference-between-ax-new-a-and-ax-new-b-when-b-extends-a –

回答

1

检查这个例子:

Object aStringObject=new String(); 

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

如果你知道它是一个字符串虽然(你指向的实例是String类型的),你可以把它转换为一个字符串,它会没事的。在上面的例子中,你可以这样做:

String aStringString = (String) aStringObject; 

但如果对象是不是你刚才宣布你不能确定你能做到这一点,并通过其声明也可以是一个字符串,但它也不能一。

你的情况:

A objectX = new B(); 

_对象是B型,但引用(指针)的实例声明了A型,所以你可以作为一种安全地使用它(无铸造)的目的和它将起作用,因为B类型的所有对象也都是A :)而且你可以这样做((B)objectX).bMethod(),因为你知道它实际上是B但它不安全,因为它可以是一个像这样声明的A。

+0

反正你永远不需要将objectX投射到“A” - 这不是说你可以安全地使用它作为A,它是一个A – pecks

+0

是的,这就是我的意思。你将它声明为A,因为B是A,所以它是A.但是如果你想将它用作B,则需要将其转换为A.你不能安全地做到这一点,因为定义并不能保证这个objectX是一个B(你可能知道它是因为你创建了实例)。我写了(没有铸造)只是为了澄清,但我想它并没有让它更清楚:)我弄糊涂了解释 –

+0

你当然可以用instanceof检查它是否是B – pecks

0
A objectX = new B(); 

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

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

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

当调用这样

objectX.someMethod() 
在这种情况下

方法中,首先检查编译方法是在参考类(A类)存在或不not.if本然后显示错误。

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