static
1.基本介绍
- static关键字在Java中主要用于内存管理。
- static 可以修饰变量,方法,代码块,嵌套类。
2. static用法
2.1 修饰成员变量
第一种用法:修饰成员变量此时被修饰变量称为静态成员变量、类变量、类成员。未被修饰的成员变量称为实例变量,非静态成员变量。
注意:
1.static修饰的成员变量是所有对象共享的,类实例化后不单属于每个对象,所 以应该使用类名去访问,当我们用对象访问时有警告。
2.类变量存储在方法区。
3.生命周期伴随类的一生,随类加载而创建,随类卸载而销毁。
4.在类内部,可以在任何方法中直接访问静态变量。
2.2静态成员变量初始化
- 直接赋值
public static String classRoom = “123”;
- 默认初始化
成员变量不赋值,默认int型为0,Boolean型为false等等
- 通过get和set方法进行初始化
public static int getSize(){
return size;
}
public static void setSize(int size){
Student.size = size;
}
- 构造对象时,在构造方法中进行赋值
public Student(String name,int age,int si){
this.name = name;
this.age = age;
size = si;
}
不建议此种方法,由于静态成员变量是属于类的,此时在构造对象时赋值,会将静态变量的值改变,不利于其他对象调用
2.2 修饰成员方法
第二种用法:修饰成员方法此时被修饰的方法称为静态成员方法、类方法。
由于我们对类里面的属性一般用private修饰,而成员方法通常用public修饰,当某个属性被static修饰时,此时我们在类外通过类名访问时,由于权限无法进行。就需要我们通过静态方法进行访问。
如图即为静态方法访问静态成员变量的过程:
public class Student{
// ...
private static String classRoom = "123";
// ...
public static String getClassRoom(){
return classRoom;
}
}
public class TestStudent {
public static void main(String[] args) {
System.out.println(Student.getClassRoom());
}
}
注意:
1.静态方法也不属于某个对象,属于类是类方法。
2.通常建议使用类名进行访问,通过对象也可以进行访问。
3.不能在静态方法中访问任何非静态成员变量。调用非静态数据成员都需要对象的引用去访问,静态方法中不能使用this和super关键字。
如图:
2.3 修饰代码块
- 代码块分为:
普通代码块,定义在方法中的代码块,只是用来区分代码块中的变量作用域,代码块中的变量只属于代码块,且此时代码按顺序执行,较少使用。
构造代码块,定义在类中的代码块,也称为实例化代码块、非静态代码块,一般用于初始化非静态的数据成员。构造代码块比构造方法先调用执行。
静态代码块,使用static定义的代码块,一般用于初始化静态成员变量。
注意:
1.只要静态代码块所在的类被加载,静态代码块就会被执行。但是多次加载时,也只会被执行一次。
2.执行顺序(编译器编译完会改变顺序)静态代码块优于非静态代码块优于构造方法,对于所有的静态代码块按顺序执行。
3.实例化代码块(非静态代码块)只有在创建对象时才执行。
2.4 修饰类
java中一个类要被声明为static的,只有一种情况,就是静态内部类(内嵌类)。如在外部类声明为static的,程序会编译都不会通过。
1、静态内部类,跟静态方法一样,只能访问静态成员变量和方法,不能访问非静态方法和属性。
2、普通内部类,可以访问任意外部类的成员变量和方法。
3、静态内部类,可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。
4、静态内部类,可以单独初始化。
Inner i = new Outer.Inner();
普通内部类初始化:
Outer o = new Outer();
Inner i = o.new Inner();
注意:
1.如果类的构造器或静态工厂中有多个参数,设计这样类时,最好使用Builder模式,特别是当大多数参数都是可选的时候。
2.如果现在不能确定参数的个数,最好一开始就使用构建器即Builder模式。
适用场景:当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建时,考虑采用静态内部类的设计,在知道如何初始化静态内部类。