回 帖 发 新 帖 刷新版面

主题:关于static静态变量的问题,请大虾们帮帮忙看看!!!

请看下面的程序代码:
public class gz
{
     static int a = 100;//3行
     static boolean b = true;//4行
    
    public static void main(String args[])
    {
        gz test = new gz();
        System.out.println("test.a = "+test.a);//10行
        System.out.println("test.b = "+test.b);//11行
        
        System.out.println("gz.a = "+a);//12行
        System.out.println("gz.b = "+b);//13行
    }
}

当我把第3、4行的标示符static删去的话,编译的时候第12、13行会报错,出现“无法从静态上下文中引用非静态变量a、b”,而第10、11行能够正常编译。同样是调用变量a、b,请问在调用时test.a、test.b与a、b(gz.a、gz.b)有什么差别么,小弟刚学习编程语言,望大虾们多多指点!!

回复列表 (共4个回复)

沙发

test.a、test.b:是实例成员,必须实例化类才能调用
gz.a、gz.b:是静态成员(类成员),可以直接由类调用
生命周期也不一样

板凳

非静态成员(包括属性或方法) 是每个对象独有1个。引用的方法为: 对象名.属性名  对象名.方法名


静态可以理解为本类共享,引用静态属性或方法的方法是  类名.属性名  类名.属性名

另外,静态方法中无法引用本类中的非静态成员。所以因为main方法是静态的,所以引用的本类属性也必须是静态的,如果去掉 static 当然会出错。

//执行完这段代码也许你会明白 static 的含义。
public class Demo 
{
    
    private static int a;
    private int b;
   
    public static void main(String[] args) 
    {
        Demo [] d = new Demo[100];
        for(int i=0;i<d.length;i++)
        {
            d[i] = new Demo();
            d[i].a++;
            d[i].b++;
            System.out.println("第"+(i+1)+"个Demo对象的静态属性值为:"+d[i].a+",非静态对象b的值为:"+d[i].b);
        }
    }
}

3 楼


我今天看到你回的贴,让我对静态成员和非静态成员的认识变得不再陌生。运行完你给的程序以后,我一直搞不懂为什么d[i].b怎么老是1,这个1是从哪得来的?对你的那个程序我有点懵。Demo [] d = new Demo[100];d[i] = new Demo();看到这个我就懵了,我尝试着修改,结果一改就错,能麻烦你再给我讲讲你的程序把!谢谢!!

4 楼

属性a是静态的,可以理解为所有对象共有(与具体的对象无关)。
属性b是非静态的,每一个对象都有自己的属性b。

所以尽管实例化了100个对象,每一个对象都有自己的属性b。
而a不同,它是静态的,它的值与具体的对象无关,所以每当实例化1个对象后进行a++,那么后面所有的对象的a的值也随着改变。

我来回复

您尚未登录,请登录后再回复。点此登录或注册