public class _04static { //静态变量(类成员变量) static int number = 10; //非静态变量(实例成员变量) int sum = 100; public static void computerNumber() { System.out.println("通过类名访问的数量是: "+_04static.number); } public static void main(String[] args) { //类调用静态方法 _04static.computerNumber(); _04static s = new _04static(); //对象访问属性 System.out.println("通过对象访问的数量是————: "+s.number); System.out.println("========对象调用============="); //对象调用方法 s.computerNumber(); } }
一、程序执行流程
1、从硬盘读取文件到内存
2、编译生成.class字节码
3、字节码存放在jvm内存中的方法区、把类中所有static修饰的方法和变量都存放在方法区中。
4、找到main()方法,程序入口进行运行,
5、调用方法必须开辟栈,把main()方法,压入到栈底。
6、开始执行main方法中的代码块,次时:静态方法、变量之间可以互相调用。
7、此时 静态方法已经存在,但是对象没有创建出来,非静态方法和变量是和实例对象绑定在一起的,所以静态方法不能访问。
8、对象在new的一瞬间才调用构造方法进行对成员变量初始化,对象在调用完成后就成为垃圾等待回收
9、对象已死,事情干完了,main()方法出栈,程序结束。
10.但是jvm内存中方法区中存放的.clss文件、静态方法、变量都一直存活着!于孤魂野鬼一般游走于方法区中,直到JVM关闭,才得以转世投胎!
二、static关键字修饰的内容的特性!
1.1.1 Static 修饰的内容都在方法区
1.1.2 Static 修饰的属性、方法属于类。
1.1.2.1 Static 修饰的属性、方法属于类。那么对象是怎么访问的?本质:(查看反编译代码,系统自动转换为类名进行调用)
1.1.3 类名、对象名 . 点 Static 修饰的属性、方法进行访问。
1.1.4 Static 修饰的内容优先于对象存在(先有静态的方法、属性,后创建对象后才有 非静态的方法。属性)
1.1.5 Static 修饰的内容,被该类型的所有对象共享、
1.1.6 需要共享的才设置成static
1.1.7 只有非private的static成员才能通过类名的 方式访问。
1.1.8 非静态方法可以访问静态成员、非静态方法。
1.1.9 静态方法不可以访问 非静态成员
1.1.10静态变量,当java虚拟机停止的时候才消失
静态方法为什么不能方法非静态方法,静态方法main方法开始执行,压如栈底,整个程序都调用结束才出栈。
静态方法在没有创建对象时就已经存在,所有静态方法直接可以互相调用,
非静态方法和变量是属于对象的,不能访问。
(通俗一点:你想去取隔壁美女的女儿做老婆,但是美女还没怀孕呢!)