关于多肽的问题
程序及输出如下,问题注释在后面,一共七个,有编号,最后我写出了我认为的输出结果,回答时能说一下问题编号么?谢谢啦:
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA] "; //1被赋值么?
b.s = "[BB] ";
a = b; //2此处是将b的值赋给a么?
System.out.println(a.s); //3为什么不输出刚赋的值[AA]
System.out.println(b.s); //4若上一行输出[A],该行为什么不输出空
System.out.println(a.getS());//5得到的是从哪里来的
System.out.println(b.getS());
System.out.println( "==================== ");
((A)b).s = "[AA] "; //6为什么强制类型转换不改变b.s?
System.out.println(a.s); //7为什么是[AA]?不是[A]?不是[BB]?
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]
我认为的输出结果:
[AA]
[BB]
不知道
不知道
====================
[AA]
[AA]
不知道
不知道
------解决方案--------------------[A] //a=b这句,使得a放弃了赋值为 "[AA] "的这个对象,a和b指向同一个对象,该对象类型为B,继承A而来。对象的继承有个特点,变量不会被覆盖(即父类的引用只会调用父类的同名属性,绝不会调用子类的同名属性),函数会被覆盖(父类的引用会调用子类的同名方法)。因此,虽然a指向对象B(),但B继承于A,A的构造函数中s= "[A] ",因此用a来调用s,只可能输出 "[A] "
[BB] //道理同上,子类的引用只会调用子类的属性,刚刚赋值为[BB],因此输出之
[BB] //道理同上,父类的引用调用子类的函数,输出子类的属性
[BB] //道理同上,子类的引用调用子类的方法,输出子类的属性