JavaSE对象引用问题

yuweizhi 2009-11-20 09:48:50
问题如下:
public class Test
{
static int a = 5;
public static void main(String[] args)
{
Test t = new Test();
t = null;
System.out.println(t.a);
}
}
以上这段程序运行结果是:5。问题是t引用已经赋了null,t.a应该报告异常才对,为什么输出结果是5?
jdk版本:1.5_15,1.6_16运行结果一样都是:5
...全文
87 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyongyang 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiangnaisong 的回复:]
变量a是类变量,与有没有生成Test的对象是无关的。
你的t.a其实编译时用的是:Test.a

楼主看一下如下写法:((Test)null).a 也是正确的。没有用,直接使用Test.a就行了。
[/Quote]

UP
xiesisi3 2009-11-20
  • 打赏
  • 举报
回复
static a 是类变量,无论你有没有Test类的实例,或者无论你有多少个Test类的实例 a只有一个而且必有一个
云上飞翔 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yuweizhi 的回复:]
虽然将t=null,但是t指向date segment还不是null,可以找到静态数据.是不是这样理解?
[/Quote]
不要这样来理解(这种理解不好),变量a是属于类Test的变量,就是说,当类Test一装入内存,变量a的空间就在类Test的空间之中,因而随时都可以使用[通过类名Test.a],与有没有对象是无关的。
而:t.a其实编译时用的是:Test.a
yuweizhi 2009-11-20
  • 打赏
  • 举报
回复
只是为什么搞得不清楚
唐可盐 2009-11-20
  • 打赏
  • 举报
回复
那是因为你输出的是t.a
其结果一定是5;
若输出t;结果是null;
不会出异常。


yuweizhi 2009-11-20
  • 打赏
  • 举报
回复
虽然将t=null,但是t指向date segment还不是null,可以找到静态数据.是不是这样理解?
handsomezhj 2009-11-20
  • 打赏
  • 举报
回复
那直接打印a不一样么
handsomezhj 2009-11-20
  • 打赏
  • 举报
回复
a是在Date segment存储着 t在栈类存存储 new 出来的t在 堆里面 然后 使t为Null,自然指向的new出来的t也为null 但是最后你打印的是静态成员变量a,t.a指向Date segment里面的a,你只是对a的一个引用 并没有改变a的值
云上飞翔 2009-11-20
  • 打赏
  • 举报
回复
变量a是类变量,与有没有生成Test的对象是无关的
你的t.a其实编译时用的是:Test.a

楼主看一下如下写法:((Test)null).a 也是正确的。没有用,直接使用Test.a就行了。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧