//对象t(被null) 访问Test类中的 成员变量和静态变量 发生了什么情况?
}
} 作者: 韩军博 时间: 2012-9-15 19:03
静态成员(a)是属于类的,随着类的加载而加载,从而就分配了空间。
Test t = new Test();
这句用到了Test类中的内容(构造方法),所以该Test类被加载进了内存中。
不管t变量指向的对象是否为null,因为该变量的类型是Test。
System.out.println(t.a);
就可以调用的。
但是实例变量(b)是创建对象之后才分配内存空间的。因为t指向null,表明该t没有指向对象
所以不能调用该对象的实例变量。作者: 马睿 时间: 2012-9-15 19:04
static方法中,只可以访问类的成员变量中的静态成员变量
t是Test类型对象的引用,你赋值虽然为null
然而static的变量的加载,不依赖于构造函数,是在类被构造函数之前就会直接加载到静态方法区之中,所以t.a读的到,t.b读不到,而且是行不通的(因为是非静态成员变量)作者: 史小兵 时间: 2012-9-15 19:06
在上边的方法中定义的a是一个静态的变量,在java中调用时应该用类名来调用(也可以使用对象来调用,不过还是建议使用前者)。
当你访问非静态的变量时应该使用对象来调用。
上边的t当你创建完一个对象时,直接就让他指向了空。java中null就是里边没有内容,所以当你调用b时相当于是null.b所以就会出错。
但是a是静态的是属于类的,所以你可以正常的使用 作者: 武庆东 时间: 2012-9-15 19:26
public class Test{
public static int a = 2;
public int b = 3;
public static void main(String[] args)
{
Test t = new Test();
t = null; // t指向null 这里将变量t不指向任何对象
System.out.println(t.a);// 值为2 因为a是类的静态变量,而不是实例成员变量
System.out.println(t.b);// 这个就不行?
/*解释:根据静态成员不能访问非静态成员的规则,所以静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
即使静态内部类的实例方法不能外部类的实例成员,只能访问外部类的静态成员,因为t=null,将对对象引用设置为空(null)。因为,b=3属于实例对象的成员变量,所以不能指向为3。System.out.println(t.a);是因为a是类的静态成员变量,有没有实例对象依然存在
举例:
//静态内部类
public class A{
private String name="abc";
private Static String color="yellow"
staic class b{
//静态内部类可以包含静态成员
private static int age;
public void c{
//下面代码出错,静态内部类无法访问外部类的实例成员
System.out.println(name);
//下面正确
System.out.printn(color);
}
}
}
*/
作者: 尤圣回 时间: 2012-9-15 19:39
public class Test{
public static int a = 2;
public int b = 3;
public static void main(String[] args)
{
Test t = new Test();
t = null; // t指向null 这里t在堆内存中指向null 好吧这个对象没有被实例化