public class ploytest {public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
}class A {
String s = "[A]";
String getS() {
return s;
}
}class B extends A{
String s = "";
String getS() {
return s;
}
}输出结果 我就是看不明白阿 怎么回事呢
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
}class A {
String s = "[A]";
String getS() {
return s;
}
}class B extends A{
String s = "";
String getS() {
return s;
}
}输出结果 我就是看不明白阿 怎么回事呢
[A]
[BB]
[BB]
[BB]
====================
[AA]
[BB]
[BB]
[BB] 为什么一开始是[A]呢 我觉得全是[BB] 如果按照healer_rx说的 a不通过方法就是不能调用b里面的属性了么
看这章。
你可以在 这儿加b.s = "[BB]"; System.out.println(a.s); //这个显示的结果是[AA]a = b; System.out.println(a.s);
//说明,a=b,因为b 是继承a 的所以
a = b;
System.out.println(a.s); //这个结果就因该是A 类中的结果了[A]
System.out.println(b.s); //显然这个结果是 [BB]
System.out.println(a.getS()); //这个b 的指向已经转给了a 所以
System.out.println(b.getS()); //这个应该是 同上了 [BB]((A)b).s = "[AA]";
System.out.println(a.s); //已经被转型了,所以都是[AA]
System.out.println(b.s);
System.out.println(a.getS()); //这个地址和上面的a.getS() 地址都没有改变,所以都是[BB]
System.out.println(b.getS()); //这个地址和上面的b.getS() 地址都没有改变,所以都是[BB]
其实就是A a=new B();在这个语句执行时,其实是生成了一个A类的对象.(先生成父类对象,在生成子类对象)
这个a 指向了在生成b之前生成的A对象,A的s初始化是[A],所以a.s=[A];多态是针对方法说的,不是针对成员变量.
((A)b).s=[A];
具体的是
A a = new A();
a = b; 看看他们内存和堆栈中是怎么分配的,
这才是这个问题的根源,,弄明白了就解决了
是生成了A 的对象还是生成了B 的对象?
具体什么意思啊
1.静态方法与所声明的类型的方法绑定;
2.实例方法与所引用的对象的方法绑定;
3.成员变量与所声明的类型的成员属性进行绑定;(这道题属于第3种情况)