BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #27927同步于 2013/11/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java 初学者一枚··求前辈解决问题··

davidjohns
2013/11/28镜像同步17 回复
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 这是为什么啊
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zwan0518机器人#1 · 2013/11/28
可以在s1=s2上下分别打印s1与s2,可以发现他们的变化,它是一个指向实际对象的变动。 对于java直接访问变量是不会动态绑定的,直接按照定义时候的引用类型。s1定义时候的类型是S1,那么则访问S1中的变量s,打印“S1”;对于方法调用则是运行期动态绑定。
sy24baba机器人#2 · 2013/11/28
http://www.cnblogs.com/yyyyy5101/archive/2011/03/23/1992438.html 感觉是JAVA内存分配的问题。 因为对于String常量,它的值是在常量池中的。常量池是在编译期被确定; 所以在执行s1=s2后,s1.s仍是S1; 而JAVA中使用new关键字创建的对象在堆中.运行时才被创建. 菜鸟,求轻喷!!![ema1][ema1][ema1]
davidjohns机器人#3 · 2013/11/28
s1对象运行时的内存空间变成s2类型 是说方法的指向变成了s2类型的了么,。书上说,变量在编译时解析,方法在运行时解析,是因为这个导致s1的s还是s1 s1.getS变成了s2,可为什么编译的时候s1的s没变成s2 呢·· 【 在 zwan0518 的大作中提到: 】 : 可以在s1=s2上下分别打印s1与s2,可以发现他们的变化,它是一个指向实际对象的变动。 : 对于java直接访问变量是不会动态绑定的,直接按照定义时候的引用类型。s1定义时候的类型是S1,那么则访问S1中的变量s,打印“S1”;对于方法调用则是运行期动态绑定。
davidjohns机器人#4 · 2013/11/28
不懂··那这个顺序是什么呀,先编译class s1 里的s 然后再 shadow里面的new么 【 在 sy24baba 的大作中提到: 】 : http://www.cnblogs.com/yyyyy5101/archive/2011/03/23/1992438.html : 感觉是JAVA内存分配的问题。 : 因为对于String常量,它的值是在常量池中的。常量池是在编译期被确定; : ...................
zwan0518机器人#5 · 2013/11/28
你可以理解成编译的时候按照定义的类型去编译,因为s1你定义的时候就是S1类型,所以编译的时候就绑定了访问的变量类型 【 在 davidjohns 的大作中提到: 】 : s1对象运行时的内存空间变成s2类型 是说方法的指向变成了s2类型的了么,。书上说,变量在编译时解析,方法在运行时解析,是因为这个导致s1的s还是s1 s1.getS变成了s2,可为什么编译的时候s1的s没变成s2 呢··
yanxuan机器人#6 · 2013/11/28
方法可以多态, 变量没有多态
nuanyangyang机器人#7 · 2013/11/30
没什么意思。那个语句的语义是:把s2当前的引用赋给s1。做完以后,s1就指向原来s2指向的对象了。
davidjohns机器人#8 · 2013/11/30
谢谢~~ 【 在 nuanyangyang 的大作中提到: 】 : 没什么意思。那个语句的语义是:把s2当前的引用赋给s1。做完以后,s1就指向原来s2指向的对象了。
smartjing100机器人#9 · 2013/12/7