A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨千里 中级黑马   /  2012-9-15 18:52  /  1710 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨千里 于 2012-9-16 11:33 编辑

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         

          System.out.println(t.a);// 值为2
          System.out.println(t.b);// 这个就不行?     why?
               
                 //对象t(被null) 访问Test类中的 成员变量和静态变量 发生了什么情况?
  }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
静态成员(a)是属于类的,随着类的加载而加载,从而就分配了空间。
Test t = new Test();
这句用到了Test类中的内容(构造方法),所以该Test类被加载进了内存中。
不管t变量指向的对象是否为null,因为该变量的类型是Test。
System.out.println(t.a);
就可以调用的。
但是实例变量(b)是创建对象之后才分配内存空间的。因为t指向null,表明该t没有指向对象
所以不能调用该对象的实例变量。
回复 使用道具 举报
static方法中,只可以访问类的成员变量中的静态成员变量

t是Test类型对象的引用,你赋值虽然为null

然而static的变量的加载,不依赖于构造函数,是在类被构造函数之前就会直接加载到静态方法区之中,所以t.a读的到,t.b读不到,而且是行不通的(因为是非静态成员变量)
回复 使用道具 举报
在上边的方法中定义的a是一个静态的变量,在java中调用时应该用类名来调用(也可以使用对象来调用,不过还是建议使用前者)。
当你访问非静态的变量时应该使用对象来调用。
上边的t当你创建完一个对象时,直接就让他指向了空。java中null就是里边没有内容,所以当你调用b时相当于是null.b所以就会出错。
但是a是静态的是属于类的,所以你可以正常的使用

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 新人回答 多多鼓励

查看全部评分

回复 使用道具 举报
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);
   }
  }
  }
*/
               
    //对象t(被null) 访问Test类中的 成员变量和静态变量 发生了什么情况?
   //因为t=null,将对对象引用设置为空(null)因为,b=3属于实例对象的成员变量,所以不能指向为3。System.out.println(t.a);是因为a是类的静态成员变量,有没有实例对象依然存在
  }
}


评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 希望大家能像这位同学一样尽可能详细的解答.

查看全部评分

回复 使用道具 举报
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 好吧这个对象没有被实例化     

          System.out.println(t.a);// 值为2     而为什么这边可以呢 因为static 在类加载的时候就实例化一个对象了 所以t可以指向这个实例     

          System.out.println(t.b);// 这个就不行?     why? 他在栈内存中根本没存在 所以t不能指向他
               
                 //对象t(被null) 访问Test类中的 成员变量和静态变量 发生了什么情况?
  }
}

回复 使用道具 举报
a是静态成员变量它的存在是不依赖对像的,b是非静态成员变量,我们必须要通过对像来访问它,所以当t为null时就能访问a而不能访问b
回复 使用道具 举报
吴通 中级黑马 2012-9-16 07:31:05
8#
楼主:首先
static :被static修饰符修饰的变量是全局的变量,也就是
这个变量会随着类的加载而加载,不需要通过创建对象来
调用这个变量,通常我们会把共同的属性作为静态的,
例如:我们定义person类,有姓名和国家属性
加入都是中国的,我们可以把国家的属性"CN"
用static修饰
class Person
{
String name;
static String country="CN";
public static void show_1()
{
  System.out.println("country="+country);
}
public static void show_2()
{
  System.out.println("name="+name);
}
}
class Demo
{
public static void main(String[] args)
{
  Person.show_1();  //编译运行通过
  Person.show_2(); //编译不通过
}
}

上面的show_1和show_2方法都有static静态修饰,
所以可以直接用类名调用,不用创建对象
但是我们发现show_2方法打印的是name,而name
不是静态的变量,所以必须要通过创建对象才能调用
所以第二个编译失败
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马