static简述
来源:互联网 发布:手机淘宝6.11.0版本 编辑:程序博客网 时间:2024/06/06 00:43
1.当类装载的时候,只为static变量分配一块存储空间,所有此类的对象都是对这块存储空间进行读写的。
2.static方法不能调用none-static方法,仅能调用其他static方法,因为非静态方法有可能会调用实例变量,编译器不允许这种可能的存在。
3.静态初始化在类加载的时候执行且执行一次,位于其他语句之前执行。
static{//your code}
4.static方法只能访问static 数据。
package p1;import java.util.ArrayList;public class Test {public static void main(String[] args) {String s = "sfs";System.out.println(s);}}
5.存在多个static块的时候,static变量的数值问题。
public class Test {static{a = 9;}static int a = 4;static String s;public static void main(String[] args) {System.out.println(s);}}答案是4,通过查看字节码,我们可以清楚的看到其中赋值过程(字节码即.java文件编译后的.class文件,虚拟机读取的正是字节码)
// class version 49.0 (49)// access flags 0x21public class p1/Test { // compiled from: Test.java // access flags 0x8 static I a // access flags 0x8 static <clinit>()V L0 LINENUMBER 5 L0 BIPUSH 9 PUTSTATIC p1/Test.a : I L1 LINENUMBER 7 L1 ICONST_4 PUTSTATIC p1/Test.a : I L2 LINENUMBER 3 L2 RETURN MAXSTACK = 1 MAXLOCALS = 0 // access flags 0x1 public <init>()V L0 LINENUMBER 3 L0 ALOAD 0 INVOKESPECIAL java/lang/Object.<init>()V RETURN L1 LOCALVARIABLE this Lp1/Test; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x9 public static main([Ljava/lang/String;)V L0 LINENUMBER 9 L0 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; GETSTATIC p1/Test.a : I INVOKEVIRTUAL java/io/PrintStream.println(I)V L1 LINENUMBER 10 L1 RETURN L2 LOCALVARIABLE args [Ljava/lang/String; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1}
由字节码可以看出,static变量和static块的相对位置不影响加载顺序,即先加载static变量,再执行static块中的内容,下面让我们看下static块的加载顺序。
static <clinit>()V L0 LINENUMBER 5 L0 BIPUSH 9 PUTSTATIC p1/Test.a : I L1 LINENUMBER 7 L1 ICONST_4 PUTSTATIC p1/Test.a : I L2 LINENUMBER 3 L2 RETURN MAXSTACK = 1 MAXLOCALS = 0
由字节码可知,代码中存在多个static块的时候(static int a = 4;和static int a;static{a = 4}的字节码完全相同,童鞋们自行实验),static块的加载顺序和代码的摆放顺序完全一致。下面给出本质完全相同的代码和字节码。
public class Test {static{a = 9;a = 4;}static int a;public static void main(String[] args) {System.out.println(a);}}
字节码如下
// class version 49.0 (49)// access flags 0x21public class p1/Test { // compiled from: Test.java // access flags 0x8 static I a // access flags 0x8 static <clinit>()V L0 LINENUMBER 5 L0 BIPUSH 9 PUTSTATIC p1/Test.a : I L1 LINENUMBER 6 L1 ICONST_4 PUTSTATIC p1/Test.a : I L2 LINENUMBER 3 L2 RETURN MAXSTACK = 1 MAXLOCALS = 0 // access flags 0x1 public <init>()V L0 LINENUMBER 3 L0 ALOAD 0 INVOKESPECIAL java/lang/Object.<init>()V RETURN L1 LOCALVARIABLE this Lp1/Test; L0 L1 0 MAXSTACK = 1 MAXLOCALS = 1 // access flags 0x9 public static main([Ljava/lang/String;)V L0 LINENUMBER 10 L0 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; GETSTATIC p1/Test.a : I INVOKEVIRTUAL java/io/PrintStream.println(I)V L1 LINENUMBER 11 L1 RETURN L2 LOCALVARIABLE args [Ljava/lang/String; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1}
6.构造函数不可能是静态的,因为构造函数是和对象相关的,而static是和类直接关联的,所以不能混淆。
7.to be end...
- static简述
- static 简述一
- 简述static关键字
- java static简述
- Java基础——static简述
- Java-static和接口(简述)
- 简述static关键字在c/c++中的作用
- 简述static关键字的作用?(备注:在什么条件下使用static修饰局部变量、全局变量、函数)
- 简述static,final,abstract三者的使用场景与注意事项
- 简述Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)
- static
- static
- static{}
- static
- static
- Static
- static
- static
- MyEclipse中安装svn插件
- 关于KVO和一种调错方式
- C# 串口程序在关闭串口时候会死锁
- C++标准库set类型
- 终极详解Windows XP Professional CMD命令
- static简述
- VS2010 疑难解决方案
- CRC校验、MD5、SHA1算法的概念和可靠性现状
- 关于sketchUp8导出ESRI(*.mdb)文件的问题
- MyEclipse编程智能感知设置(输入一个字母即可有提示)
- 二叉链表生成二叉树
- java 获取文件扩展名
- HTML 5在移动端有没有未来?
- 嵌入式必知的10个基本问题