参考:https://blog.csdn.net/sweetlyl006/article/details/140401823
静态内部类的特点
- 不依赖外部类实例:静态内部类的创建不依赖于外部类的实例,可以直接通过外部类名创建静态内部类的实例。
- 访问限制:静态内部类可以访问外部类的静态成员,但不能直接访问外部类的非静态成员。如果需要访问非静态成员,可以通过创建外部类的实例来实现。
- 封装性:静态内部类可以实现更高的封装性,使相关的类更紧密地绑定在一起,从而提高代码的可读性和可维护性。
静态内部类的使用场景
- 辅助类:静态内部类常用于实现一些只为外部类服务的辅助类。
- Builder模式:静态内部类经常用于实现Builder模式,简化对象的创建过程。
- 与外部类紧密相关的类:如果一个类只在外部类的上下文中有意义,可以将其作为静态内部类。
静态内部类可以访问外部类的静态方法,不能访问非静态方法
package org.example.java.innerStaticClass;
public class OuterClass {
private static String staticOuterFiled = "静态外部变量";
public static class InnerClass{
public static void print() {
System.out.println(staticOuterFiled);
}
}
public void useInnerClass() {
InnerClass.print();
}
public static void main(String[] args) {
InnerClass innerClass = new OuterClass.InnerClass();
innerClass.print();
OuterClass outerClass = new OuterClass();
outerClass.useInnerClass();
OuterClass.InnerClass.print();
}
}
可以通过静态内部类初始化外部类
package org.example.java.innerStaticClass;
import org.springframework.security.core.parameters.P;
public class Person {
private String name;
private Integer sex;
private Integer age;
public Person(Builder builder) {
this.name = builder.name;
this.sex = builder.sex;
this.age = builder.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex=" + sex +
", age=" + age +
'}';
}
public static class Builder {
private String name;
private Integer sex;
private Integer age;
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setSex(Integer sex) {
this.sex = sex;
return this;
}
public Builder setAge(Integer age) {
this.age = age;
return this;
}
public Builder() {
}
public Builder(String name, Integer sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public Person build() {
return new Person(this);
}
}
public static void main(String[] args) {
// Person person = new Person.Builder()
// .setName("张生")
// .setAge(22)
// .setSex(0)
// .build();
Person person=new Person
.Builder("张森", 23, 0)
.build();
System.out.println(person);
}
}