本文是根据沉默王二前辈所发的一篇博客中所学到的
教妹学Java(二十六):static 关键字解析_java中static_沉默王二的博客-CSDN博客
1:static关键字比较难以理解,借用沉默王二前辈的一句话就是:方便在没有创建对象的情况下进行调用,包括变量和方法
比如:
public class Straight { public static final String MAX = "300"; }
创建一个Straight的类,这个类中有一个字段MAX,被public static final修饰
使用另外一个类可以在不创建Straight对象的前提下直接调用MAX这个字段,前提是import时要带有static关键字
当然,不仅仅字段,方法也可以
public class Straight { public static final String MAX = "300"; public static void getMax(){ System.out.println(MAX); } }
import static com.example.demo.pojo.Straight.MAX; import static com.example.demo.pojo.Straight.getMax; @Test public void test5(){ System.out.println(MAX); getMax(); }
得到的结果是:
static将所修饰的字段放入静态区:
比如:这里我将age使用static修饰,并创建了一个构造方法带有这三个参数。
@Data
public class Student {
private String name;
private String school ;
static private int age = 1;
public Student( String name, String school, int age ) {
this.name = name;
this.school = school;
this.age = age;
}
public void count(){
age++;
System.out.println(age);
}
public Student( ) {
}
}
在另外一个类中如果使用该构造方法,正常情况下会出现的是你输入的值就是所显示的值,但是这里我们可以看到,虽然你输入了age的值,但是age的值并不会显示,
那么,age的值是多少呢?
我们可以调用count方法来进行判断age到底是1还是11.
可以看到,age的初始值是11,这说明静态变量可以通过构造方法来进行修改,并且会根据最后一次变化来保存其数值,并不会伴随每一次对象的构建进行新的创建,静态变量会被保存在静态区,这个类的对象都共同使用这个静态变量。
在这里再引用一下王二前辈的一张图:
在这里,student1 student2 student3 是创建的对象,要s1\s2一样放在栈内存中, 而堆内存中存储的值对象的一般属性,对象的静态属性放在静态区内。
当static修饰方法时:
这里使用static修饰了getage,来调用上面的普通方法getAge()。
结果报错,那是因为静态方法里面只能调用静态的方法,变量 (下图所示)
而静态代码块,巧妙地运用了静态的特点(只占用一次内存,不会使用多个内存)
在Student这个类中加入静态代码块,然后再创建三个student对象,会发现,静态代码块只执行了一次
静态代码块中只能对静态数据进行赋值,对非静态的都不可以进行操作: