修饰成员变量
类实例存放在堆中,成员变量属于类实例,也存放在堆中。使用static修饰后,成员变量便属于类,而不属于某个具体的对象,存放位置发生改变存放在方法区中。
修饰成员方法
成员方法属于类实例,但是相同类的不同实例共用同一个方法,方法都存在与方法区,使用static修饰后不会改变方法存放位置,但是会改变归属
修饰代码块
static块中的代码将在类加载的时候进行执行,多个static块按照顺序执行
静态内部类
在构造者模式中使用较多,其他的用法暂时没有思考,不过把静态内部类与构造者模式关联起来,方便记忆,而且不容易和其他的内部类搞混
静态内部类示例:
/**
* @author cade
* 需要注意作用域
*/
public class Pizza {
private String name;
private String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public static Builder newBuilder() {
return new Builder();
}
//私有空构造器
private Pizza() {
}
//带参构造器为Builder使用
private Pizza(Builder builder) {
this.name = builder.name;
this.price = builder.price;
}
public static final class Builder {
private String name;
private String price;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder price(String price) {
this.price = price;
return this;
}
public Pizza build() {
return new Pizza(this);
}
}
public static void main(String[] args) {
Pizza pizza = Pizza.newBuilder().name("chicken cheese").build();
System.out.println(pizza.getName());
}
}
静态导入
静态导入后,可以直接使用指定导入类中的静态方法,就不需要以 类名.方法名 的形式进行调用了
//与Pizza不在同一子package中
//静态导入
import static com.peide.keyword.statickey.Pizza.*;
//需要再次导入类
import com.peide.keyword.statickey.Pizza;
public class KeywordTest {
public static void main(String[] args) {
//newBuilder()方法不需要加Pizza.
Pizza pizza = newBuilder().name("chicken cheese").build();
System.out.println(pizza.getName());
}
}
Over.
参考:
成员方法所在的内存位置及static修饰的成员方法所在的内存位置
https://blog.csdn.net/shuyizhi/article/details/79700054.
构造器、类加载与static方法块的相关关系
https://www.cnblogs.com/dolphin0520/p/3799052.html
static与构造器的理解
https://blog.csdn.net/qq_17864929/article/details/48006835
static修饰局部变量的讨论