综述:
static关键字修饰的方法或者属性,再没有创建任何类对象的时候,可以通过类名调用它们。static修饰的类或者方法属于类的方法、属性。在某个类被加载的时候,首先会加载类中存在的static代码块/static变量/static方法。
1static+变量:
通过类名+变量名调用,static变量属于类变量,在内存中只有一个副本,方法内不能出现静态的变量。
普通的变量在内存中有多个副本,它属于对象,同一个类的同一个属性,不同对象的这个属性可能不相同,每个对象的这个属性相互不影响。全局变量和局部变量可以有相同的属性。
public class Demo01 {
static int age = 1;
String name = "lucas";
private String str;
public void fun() {
// static int age = 2;
String name = "fun+lucas";
System.out.println(name);
//调用类的那么属性
System.out.println(this.name);
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public static void main(String[] args) {
/**
* Demo01的str属性,不同对象拥有不同的值
*/
Demo01 d1 = new Demo01();
d1.setStr("d1");
Demo01 d2 = new Demo01();
d2.setStr("d2");
System.out.println("d1:str=" + d1.getStr());
System.out.println("d2:str=" + d2.getStr());
d2.fun();
}
}
2static+方法:
通过类名+方法调用,static方法内不能够调用非static方法,因为类加载的时候就会加载static修饰的方法。类普通方法在类被初始化的时候才会被加载,也就是创建类的对象的时候才回去加载类的其他的普通方法。static关键的一个重要思想就是想通过类名直接调用static方法,所以在静态方法内不能够调用非静态方法因为有可能还没有初始化类。在非静态方法的内部可以调用静态的方法。
public class Demo02 {
static String str1 = "static+str";
String str2 = "str";
public void fun() {
System.out.println(str1);
System.out.println(str2);
staticFun();
}
public static void staticFun() {
System.out.println(str1);
// System.out.println(str2);报错
// fun();报错
}
}
3static+代码块
static代码块的一个关键作用就是优化程序的性能。static代码块可以出现在类的任何地方,static代码块在类被加载的时候,只会被加载一次。一个类中可以有多个static修饰的代码块,加载顺序是从上到下。单例模式中的饿汉式可以用static代码块去实现。
public class Demo03 {
private Demo03() {
}
private static Demo03 d;
static {
d = new Demo03();
}
// 静态工厂方法
public static Demo03 getInstance() {
return d;
}
}