参考
https://www.cnblogs.com/a8457013/p/8078826.html
https://www.cnblogs.com/lh-cml/archive/2019/07/12/11176930.html
1、被static修饰
- 静态变量
static修饰
的变量是静态变量
,也叫类变量
类变量
随着类的加载
而加载
,即使此类还未new过对象,这个类变量也存在,而且仅一份
- 由类创建的
所有对象
都可以共用这个变量
- 实例变量
实例变量
是类new了一个对象
之后才有的每个对象
有自己的那一份
- 静态方法
- 用static修饰的方法叫
静态方法
,也叫类方法
- 当一个
方法
或者变量
需要初始化加载
,或者是经常被调用
的时候可以加上static
用static修饰的方法
可以用类名直接调用
,不用一定要先实例化一个对象然后才可以调用随着类的加载
而加载
,就算没有new一个对象,类方法还是存在
,且仅存在一份
- 用static修饰的方法叫
- 方法调用静态/非静态的变量和方法
静态的方法
不可以调用非静态的变量
和非静态的方法
非静态方法
可以调用静态的变量和方法
- 原因:调用static方法的时候,不需要创建对象,而使用非static字段的时候,需要创建对象
- 静态类
- 普通类是不允许声明为静态的,
只有内部类
才可以 - 被static修饰的内部类可以
直接作为一个普通类来使用
,而不需实例一个外部类
- 当一个
内部类 没有使用static修饰
的时候,是不能直接使用内部类创建对象
,须要先使用外部类对象
点new内部类对象,即(外部类对象.new 内部类())
- 普通类是不允许声明为静态的,
public class OuterClass {
public static class InnerClass{
InnerClass(){
System.out.println("============= 我是一个内部类'InnerClass' =============");
}
}
}
public class TestStaticClass {
public static void main(String[] args) {
// 不需要new一个InnerClass
new OuterClass.InnerClass();
}
}
如果没有用static修饰InterClass
,则只能
按如下方式调用:需要先new 一个外部类实例
package inner_class;
public class OuterClass {
public class InnerClass{
InnerClass(){
System.out.println("============= 我是一个内部类'InnerClass' =============");
}
}
}
public class TestStaticClass {
public static void main(String[] args) {
// OutClass需要先生成一个实例,然后再new一个InnerClass();
OuterClass oc = new OuterClass();
oc.new InnerClass();
}
}
2、static关键字加载顺序问题
静态变量
和静态块
的加载都是在类加载器加载完成以后
加载到一块固定内存区
,按代码编写的顺序
依次加载。
public class Father {
static int i = 10;//先加载
static {
System.out.println("初始化父类的静态块...");
}//后加载
public Father() {
System.out.println("初始化父类的构造方法...");
}
public static void speak(){
System.out.println("静态方法...");
}
public void speak1(){
System.out.println("普通方法...");
}
}
public class A extends Father {
static {
System.out.println("初始化子类静态块...");
}
public A(){
System.out.println("初始化子类构造方法...");
}
public static void main(String[] args) {
System.out.println(Father.i);
Father a = new A();
a.speak1();
}
}
输出结果:
初始化父类的静态块...
初始化子类静态块...
10
初始化父类的构造方法...
初始化子类构造方法...
普通方法...