总:static修饰的都是静态的,都和对象没有关系
一、静态变量
1)使用static关键字可以修饰成员变量,称为静态变量
2)实例变量属于某个具体的对象,静态变量不属于某个变量,整个类所共享
3)通过一个对象修改了静态变量,再通过其他对象访问静态变量时就是修改之后的值
4)静态变量存储在方法区中,所有对象都可以访问到它
5)实例变量是在创建对象时在堆中分配存储空间,对象被垃圾回收器收走,实例变量就释放了
静态变量在类加载内存时就在方法区中分配存储空间,一直到程序的结束
6)建议直接使用类名来访问静态变量
7)静态变量的应用场景:
当某个数据需要对所有对象共享时,就可以把这个数据定义成静态的
二、静态方法
1)使用static修饰的方法为静态方法
2)在静态方法中,可以直接使用静态成员,不能直接使用非静态成员
非静态成员属于某个具体对象,在使用静态方法时,还没有创建对象
在实例方法中,可以直接使用静态成员
3)静态方法不属于某个具体对象,而是属于整个类
4)建议直接使用类名来调用静态方法
5)静态方法的应用场景:
一般情况下,在定义工具类时,可以使用静态方法
三、静态构造代码块
1)使用static可以修饰构造代码块,称为静态构造代码块
2)在使用某个类时,类加载器把字节码文件加载到内存中,在类使用之前需要对类进行初始化
类初始化之前先执行静态构造代码块
3)因为类的初始化只有一次,所以静态构造代码块也只执行一次
4)应用场景:
有的时候,在使用某个类时,这个类可能需要依赖一些外部资源,在使用类之前需要先把这些资源加载到类中
就可以把加载外部资源的操作放在静态代码构造块中
四、静态内部类
1)可以在一个类的内部定义另外一个类,这叫内部类
内部类编译之后生成的字节码文件:外部类名$内部类名.class
2)内部类可以使用static修饰,静态内部类可以有实例方法
3)在静态内部类中不能直接使用外部类的非静态成员,可以使用外部类的静态成员
4)应用场景:
通过有参构造会破会类的封装性
保证类的封装性,不通过构造方法构造对象,代码如下:
public class Student{
private String name;
private int age;
private String address;
private int tel;
//通过内部类来创建Student对象
//1)定义一个静态内部类,类的成员和外部类完全一样
static class Builder{
private String name;
private int age;
private String address;
private int tel;
//2)在内部类提供变种的getter/setter方法
//修改了内部类对象的字段值,再把内部类对象返回
public Builder setName(String name){
this.name = name;
return this;
}
public Builder setAge(int age){
this.age = age;
return this;
}
public Builder setAddress(String address){
this.address = address;
return this;
}
public Builder setTel(int tel){
this.tel = tel;
return this;
}
//3)提供一个公共的方法,可以返回Student对象
public Student builder(){
return new Student(this);
}
}
//4)在外部类中提供一个有参构造方法
private Student(Builder builder){
this.name = builder.name;
this.age = builder.age;
this.address = builder.address;
this.tel = builder.tel;
}
public void showInfo(){
String str = "Student[name="+name+",age="+age+",address="+address+",tel="+tel+"]";
System.out.println(str);
}
public static void main(String args[]){
//创建Student对象
Student stu = new Student.Builder().builder();
stu = new Student.Builder().setName("zhangsan").setAddress("bj").builder();
stu.showInfo();
}
}
//创建内部类对象
Outer.Inner innerObj = new Outer.Inner();