Java static关键字
static 关键字
static:
1、static翻译为“静态”
2、所有static关键字修饰的都是类相关的,类级别的。
3、所有static修饰的,都是采用“类名.”的方式访问。也可以通过 实例. 访问,不推荐
4、static修饰的变量:静态变量
5、static修饰的方法:静态方法
变量的分类:
变量根据声明的位置进行划分:
在方法体当中声明的变量叫做:局部变量。
在方法体外声明的变量叫做:成员变量。
成员变量又可以分为:
实例变量
静态变量
class VarTest{ // 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问。需要先new对象。 // 实例相关的,必须先有对象,才能访问,可能会出现空指针异常。 // 成员变量中的实例变量 int i; // 实例方法 public void m2(){ // 局部变量 int x = 200; } // 以下静态的,都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。 // 不需要对象的参与即可访问。没有空指针异常的发生。 // 成员变量中的静态变量 static int k; // 静态方法 public static void m1(){ // 局部变量 int m = 100; } }
变量声明:
什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。
建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
一个对象一份的是实例变量。
所有对象一份的是静态变量。
比如 定义一个 Chinese 类, 国籍 就是一样的, 身份证号,姓名 就是不同的
静态变量在类加载的时候初始化,不需要new对象,存储在方法区
空指针异常
空指针异常只有在什么情况下才会发生呢?
只有在“空引用”访问“实例”相关的,都会出现空指针异常。 如果空引用访问 静态变量,不会出现空指针异常
方法声明
关于方法来说,什么时候定义为实例方法?什么时候定义为静态方法
参考标准:
当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。
我们以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法一般都是静态的。
(静态方法有一个优点,是不需要new对象,直接采用类名调用,极其方便。工具类就是为了方便,
所以工具类中的方法一般都是static的。)
静态代码块
静态代码块,在类加载的时候执行,并且只执行一次
一个类中有多个静态代码块
static {
java 语句
}
注意:静态代码块在类加载时执行,并且在main方法执行之前执行。
静态代码块一般是按照自上而下的顺序执行。
静态代码块有啥作用,有什么用?
第一:静态代码块不是那么常用。(不是每一个类当中都要写的东西。)
第二:静态代码块这种语法机制实际上是SUN公司给我们java程序员的一个特殊的时刻/。这个时机叫做:类加载时机。
具体的业务:
项目经理说了:大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下
类加载的日志信息(在哪年哪月哪日几时几分几秒,哪个类加载到JVM当中了)。
代码块执行顺序
静态代码块和静态变量都在类加载的时候执行,时间相同,只能靠代码的顺序来决定谁先谁后。
static静态代码块在类加载时执行,不能访问实例变量;实例变量在声明对象的时候开辟
到目前为止,你遇到的所有java程序,有顺序要求的是哪些?
第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。
第二:静态代码块1和静态代码块2是有先后顺序的。
第三:静态代码块和静态变量是有先后顺序的。
ps.在类体内方法是没有顺序
/* 栈:方法只要执行,会压栈。(局部变量) 堆:new出来的对象都在堆中。垃圾回收器主要针对。(实例变量) 方法区:类的信息,字节码信息,代码片段。(静态变量) 方法的代码片段放在方法区,但是方法执行过程当中需要的内存在栈中。 */ public class StaticTest07{ // 静态变量在什么时候初始化?类加载时初始化。 // 静态变量存储在哪里?方法区 static int i = 100; // 静态代码块什么时候执行?类加载时执行。 static { // 这里可以访问i吗? System.out.println("i = " + i); } // 实例变量 int k = 111; // k变量是实例变量,在构造方法执行时内存空间才会开辟。 static { //k变量可以访问吗? // static静态代码块在类加载时执行,并且只执行一次。 // 类加载时,k变量空间还没有开辟出来呢。 //错误: 无法从静态上下文中引用非静态 变量 k //System.out.println("k = " + k); // 这里可以访问name吗? //错误: 非法前向引用 // 静态代码块和静态变量都在类加载的时候执行,时间相同,只能靠代码的顺序来决定谁先谁后。 //System.out.println("name = " + name); } // 静态变量在静态代码块下面。 static String name = "zhangsan"; //入口(main方法执行之前实际上执行了很多代码) public static void main(String[] args){ System.out.println("main begin"); System.out.println("main over"); } } /* 总结: 到目前为止,你遇到的所有java程序,有顺序要求的是哪些? 第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。 第二:静态代码块1和静态代码块2是有先后顺序的。 第三:静态代码块和静态变量是有先后顺序的。 */
实例语句块
实例语句语法
{
java语句;
java语句;
java语句;
}
实例语句块在什么时候执行?
只要是构造方法执行,必然在构造方法执行之前,自动执行“实例语句块”中的代码。
实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。
(可以做提取构造方法的共同点)