返回信息流RT
public class shadow{
public static void main(String s[])
{ S1 s1=new S1();
S2 s2=new S2();
s1=s2;//这个书上说 s1对象运行时的内存空间变成s2类型 ,这是什么意思?
System.out.println(s1.s);
System.out.println(s1.getS());
}
}
class S1{
public String s="S1";
public String getS(){
return s;
}
}
class S2 extends S1{
public String s="S2";
public String getS(){
return s;
}
}
//这两个输出分别是s1和s2 这是为什么啊
这是一条镜像帖。来源:北邮人论坛 / java / #27927同步于 2013/11/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java 初学者一枚··求前辈解决问题··
davidjohns
2013/11/28镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
可以在s1=s2上下分别打印s1与s2,可以发现他们的变化,它是一个指向实际对象的变动。
对于java直接访问变量是不会动态绑定的,直接按照定义时候的引用类型。s1定义时候的类型是S1,那么则访问S1中的变量s,打印“S1”;对于方法调用则是运行期动态绑定。
http://www.cnblogs.com/yyyyy5101/archive/2011/03/23/1992438.html
感觉是JAVA内存分配的问题。
因为对于String常量,它的值是在常量池中的。常量池是在编译期被确定;
所以在执行s1=s2后,s1.s仍是S1;
而JAVA中使用new关键字创建的对象在堆中.运行时才被创建.
菜鸟,求轻喷!!![ema1][ema1][ema1]
s1对象运行时的内存空间变成s2类型 是说方法的指向变成了s2类型的了么,。书上说,变量在编译时解析,方法在运行时解析,是因为这个导致s1的s还是s1 s1.getS变成了s2,可为什么编译的时候s1的s没变成s2 呢··
【 在 zwan0518 的大作中提到: 】
: 可以在s1=s2上下分别打印s1与s2,可以发现他们的变化,它是一个指向实际对象的变动。
: 对于java直接访问变量是不会动态绑定的,直接按照定义时候的引用类型。s1定义时候的类型是S1,那么则访问S1中的变量s,打印“S1”;对于方法调用则是运行期动态绑定。
不懂··那这个顺序是什么呀,先编译class s1 里的s 然后再 shadow里面的new么
【 在 sy24baba 的大作中提到: 】
: http://www.cnblogs.com/yyyyy5101/archive/2011/03/23/1992438.html
: 感觉是JAVA内存分配的问题。
: 因为对于String常量,它的值是在常量池中的。常量池是在编译期被确定;
: ...................
你可以理解成编译的时候按照定义的类型去编译,因为s1你定义的时候就是S1类型,所以编译的时候就绑定了访问的变量类型
【 在 davidjohns 的大作中提到: 】
: s1对象运行时的内存空间变成s2类型 是说方法的指向变成了s2类型的了么,。书上说,变量在编译时解析,方法在运行时解析,是因为这个导致s1的s还是s1 s1.getS变成了s2,可为什么编译的时候s1的s没变成s2 呢··
谢谢~~
【 在 nuanyangyang 的大作中提到: 】
: 没什么意思。那个语句的语义是:把s2当前的引用赋给s1。做完以后,s1就指向原来s2指向的对象了。