1.静态变量(被static修饰的成员变量)
1-静态变量
- 运行时,Java虚拟机只为静态变量分配一次内存(加载类的过程中完成静态变量的内存分配)
- 类的内部可以在任何方法内直接访问静态变量
- 其他类中可通过类名访问该类中的静态变量 Class.staticVal
2-实例变量
- 每创建一个实例,Java虚拟机就会为实例变量分配一次内存
- 类的内部,可以在非静态方法中直接访问实例变量
- 类内部的静态方法或其他类中则需要通过类的实例对象进行访问。 class.val
3-静态变量在类中的作用
- 静态变量可被类的所有实例共享。(增加实例之间的交互性)
- 若所有类的实例均包含一个相同的常量属性,则可将其定义为静态变量而节省内存空间。(圆周率)
2.静态方法(被static修饰的方法)
静态方法与实例方法区别
- 静态方法不需要通过其所属的类的实例即可调用(Class.method()),因此静态方法中不能使用this与super关键字(其都与类的实例相关),也不可直接访问所属类的实例变量和实例方法。但可以访问所属类的静态变量和静态方法。
- 实例方法中可直接访问所属类的静态变量,静态方法,实例变量和实例方法。
3.静态代码块
用法:
静态代码块指Java类中的static{}代码块,主要用于初始化类,为类的静态变量赋予初始值(提升程序性能)
static {
a = 33;
message = "Hello World";
}
特点:
- 静态代码块类似于一个方法,但不可存在于任何方法体中。
- 静态代码块可置于类中任何地方,类中可以有多个静态代码块。
- JVM在加载类时执行静态代码块(将只执行一次的初始化操作置于静态代码块中)
- 若类中含多个静态代码块,则JVM按其出现次序依次执行且每个只被执行依次。
- 同静态方法一样不可直接访问类的实例变量和实例方法,需通过类的实例对象来访问。
注: 将static除去即为非静态代码块,其仅在创建对象时自动执行的代码。创建对象时先执行静态代码块再执行非静态代码块。
4.静态导入
导入方法
- 导入指定类的全部静态成员变量、方法
import static java.lang.Math.*;
- 导入指定类的单个静态成员变量、方法
import static java.lang.Math.fieldName|mathodName;
导入后使用静态成员变量或方法时不需使用Class.method(),可直接使用method()。
5.静态内部类(static修饰的内部类)
实例代码
public class Outer {
static class Inner {
// 静态内部类
}
}
特点:
- 创建静态内部类的实例时不需创建外部类的实例
Outter.Inner inner = new Outer.Inner();
-
静态内部类可以定义静态成员和实例成员。外部类以外其他类需通过完成类名访问静态内部类中静态成员
int b2 = Outer.Inner.b;
,访问实例成员需通过静态内部类的实例来访问。 - 静态内部类可以直接访问外部类的静态成员,需通过外部类的实例访问外部类的实例成员。