public class HasStatic {// 1
private static int x = 100;// 2
public static void main(String args[]) {// 3
HasStatic hsl = new HasStatic();// 4
hsl.x++;// 5
HasStatic hs2 = new HasStatic();// 6
hs2.x++;// 7
hsl = new HasStatic();// 8
hsl.x++;// 9
HasStatic.x--;// 10
System.out.println(" x=" + x);// 11
}
}
今天遇到一道这样的题 private static共同修饰变量x,仔细想想还是蛮有趣的
首先是思想上的误区,认为static是存在于方法区中的是共享的
这是不对的,你要去了解一下JVM运行时各个数据区的作用,private、public、protect、default这一类访问权限修饰符才是控制是不是共享的方法的。
实际上需要把pribate于static分开来解读
static:静态修饰符,被static修饰的变量和方法类似于全局变量和全局方法,可以在不创建对象时调用,当然也可以在创建对象之后调用。常见的可以用于工具类的工具方法中等,譬如:Math类中的绝大多数方法都是静态方法,他们扮演了工具方法的作用。
private:声明当前被修饰的变量、方法为私有的。这里的私有指的是仅仅可以被私有访问,举个例子:一个类就像是一台电脑,私用的部分就是除去电脑本身之外用户不可见的部分,譬如:你知道点击哪里可以登录QQ,但是内部到底是怎么登录的QQ你是不知道的,你知道摁哪里可以开关机,但是内部是怎么开关机的你是不知道的,等等,你在使用这个类时那些这个类的确有但是你访问是非法的方法或者变量是被声明为private的,私有不可见且不可访问的。
static的作用是JVM初始化的时候的时候把变量加载进来的一个作用,让对象在运行的时候不需要在实例化就可以使用,因为在JVM初始化的时候就已经实例化过了,这才是static的作用。
而private、puiblic、protect、default这一类的修饰符才是限制使用范围。
意思就是private static只有自己能使用这个JVM启动的时候就加载进来的方法或者变量。
大家理解了莫?