考虑以下代码:
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的实例?
答案 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)
当你做"延伸"你说" 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;
答案 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()
。