JAVA基础----static关键字全面理解
程序员文章站
2022-07-11 10:40:17
...
static修饰的,在类加载的过程中就被初始化,并且在内存中只维护一份,可以当成全局变量全局方法
1、static修饰变量:
####static修饰成员变量(也就是类的属性),代表类级拥有的,在内存中只有一份,相当于C中的全局变量,由这个类产生的所有实例都公用这份变量,这个变量由类和所有实例共同维护,由于要共同维护,一般static修饰的成员变量都是public的访问控制符来修饰:
使用:类名.静态成员变量名或者实例名.静态成员变量名
优点:
*可以不用创建实例就可以调用,方便
*内存中只有一份,在某些情况下,需要这种情况
*在类加载的时候就被初始化,常驻内存中,调用快捷方便。类名.静态变量名
用处:
*静态变量适合全局变量的定义
####static修饰局部变量,也就是函数中定义的静态变量,答曰:不可以
2、static修饰方法
####静态方法跟静态变量一样是类级共有的,在类第一次加载的时候被加载到内存中,直接用类名.静态方法名来调用,实例也可以调用
静态方法调用问题:
静态方法只能调用本类中的静态方法和静态变量,静态方法也可以调用其他类中的静态方法和new出来的方法
非静态方法,既可以调用本来中的任何方法,也可以调用其他类中的任何方法
*用处
静态方法常用做工具方法的定义
静态方法构造单例模式
*缺点
静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。
3、静态代码块
静态代码段,在类第一次被加载的时候自动执行,且只执行一次,常用来初始化类的某些属性,或者做某些初始化的事情,静态方法也是在类第一次加载的时候被加载,不过它只有在北调用时,才被执行
4、静态内部类
1、static修饰变量:
####static修饰成员变量(也就是类的属性),代表类级拥有的,在内存中只有一份,相当于C中的全局变量,由这个类产生的所有实例都公用这份变量,这个变量由类和所有实例共同维护,由于要共同维护,一般static修饰的成员变量都是public的访问控制符来修饰:
使用:类名.静态成员变量名或者实例名.静态成员变量名
package com.out.test; class Student { public static int a; public int b; } public class Test { public static void main(String[] args) { //静态成员变量使用 Student.a = 3; System.out.println(Student.a); //输出3 Student s = new Student(); System.out.println(s.a); //输出3 s.a = 4; System.out.println(Student.a); //输出4 System.out.println(s.a); //输出4 //普通成员变量使用 Student s1 = new Student(); Student s2 = new Student(); //Student.b = 5; //错误不可以,这么使用 s1.b = 5; s2.b = 6; //s1和s2各自维护自己的成员变量,在内存中各有自己的一份,而静态成员变量在内存中只有一份, //类和它的实例们共同来使用和维护 System.out.println(s1.b); //输出5 System.out.println(s2.b); //输出6 } }
优点:
*可以不用创建实例就可以调用,方便
*内存中只有一份,在某些情况下,需要这种情况
*在类加载的时候就被初始化,常驻内存中,调用快捷方便。类名.静态变量名
用处:
*静态变量适合全局变量的定义
####static修饰局部变量,也就是函数中定义的静态变量,答曰:不可以
package com.out.test; public class Test { public void print() { static String str = "abc";//编译报错,static不可以修饰局部变量,final可以 } }
2、static修饰方法
####静态方法跟静态变量一样是类级共有的,在类第一次加载的时候被加载到内存中,直接用类名.静态方法名来调用,实例也可以调用
静态方法调用问题:
静态方法只能调用本类中的静态方法和静态变量,静态方法也可以调用其他类中的静态方法和new出来的方法
非静态方法,既可以调用本来中的任何方法,也可以调用其他类中的任何方法
package com.out.test; class Student { public void st1() { } public static void st2() { } } public class Test { public static void print() { } public void copy() { } public void test() { //非静态方法调用 //同一个类中,非静态方法可以调用同一个类中的静态方法也可以调用非静态方法 print(); copy(); //非同一个类中,非静态方法既可以调用,静态的也可以new出来调用非静态的 Student.st2(); Student s = new Student(); s.st1(); } public static void fun() { //静态方法调用 //同一个类中,静态方法只能调用静态方法 print(); //可以调用 copy(); //不可以调用 //非同一类中,可以直接调用其他类中的静态方法,也可以new出来调用其他类中的非静态方法 Student.st2(); Student s = new Student(); s.st1(); } }
*用处
静态方法常用做工具方法的定义
静态方法构造单例模式
*缺点
静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。
3、静态代码块
静态代码段,在类第一次被加载的时候自动执行,且只执行一次,常用来初始化类的某些属性,或者做某些初始化的事情,静态方法也是在类第一次加载的时候被加载,不过它只有在北调用时,才被执行
static { //要初始化的操作 }
4、静态内部类