继承:instanceof运算符令人困惑

时间:2014-04-13 08:42:40

标签: java inheritance polymorphism instanceof

考虑以下代码:

class B
{
  int j =100;
}

class A extends B
{
    int i=10;
}

public class Test
{
    public static void main(String[] args)
    {
       A obj =new A();
       System.out.println(obj);
       B obj1 =obj;

       System.out.println(obj1); // here i am confused

       if( obj1 instanceof A )
       {
                System.out.println("yes"); //here i am confused
       }
    }
}

这里的输出是:

A@35186a
A@35186a
yes

现在obj1是B类的一个超类的实例,为什么toString()将它显示为A的对象?另外,instanceof运算符如何将它显示为类A的实例?

4 个答案:

答案 0 :(得分:5)

您必须区分引用和实际的对象

B obj1 = obj;

在此处创建名为B的{​​{1}}类型的新参考。引用的对象仍然是obj1对象,但永远不能更改。

答案 1 :(得分:1)

obj1指向obj,它是A的一个实例(参见新的A())。在左侧,您只是引用超级类。你的obj1只能看到B中的方法.obj将能够看到B和A中的所有方法(可以正确访问)

来自java trail

Declaration: The code left of the = associates a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object.

答案 2 :(得分:1)

  • 您的代码中没有任何toString方法,您打印内存占位符(Java不允许您查看对象在内存中的确切位置)。

当你做"延伸"你说" A是B"的儿子,然后排成一行:

A obj =new A();
System.out.println(obj);

你创建一个A对象并且打印是内存占位符(记住,A是B的儿子,所以如果你想描述它,想象一个名为A的盒子和一个叫做B的盒子连接到她(在她的上面,因为它是她的父亲))。

现在在下一行:

B obj1 =obj;
System.out.println(obj1); // here i am confused

你创建另一个名为obj1的对象,并为他分配A的内存占位符,这就是你创建的第一个对象,叫做obj。如何将A对象分配给B?多态性!1并再次打印它的记忆占位符。

接下来你会这样做:

if( obj1 instanceof A ){
   System.out.println("yes"); //here i am confused
}

所以,obj1是A的一个实例(它是一个A的盒子,在她的上面是一盒B(它的父亲,多态)),你打印"是& #34;

  • 在多态性中,您打印最低的方法,因此如果有任何方法,则打印A方法,如果您没有"攀爬"给父亲并检查那里等等..

Polymorphism (computer science)

答案 3 :(得分:0)

  

现在obj1是B类的一个实例,它是超类

事实并非如此,obj1仍然是A的实例。您恰好将超类的指针分配给已存在的A类指针。


如果你想要B类的实例,那就这样做:

B b = new B();

如果你想要一个A类的实例,你可以这样做:

A a1 = new A();

B a2 = new A();

后来的a2是正确的,因为A是B类型。但是,a2仍然是A的实例,因为我们使用了new A()

相关问题