学习笔记 · Java中的static关键字
- static 关键字
- 静态方法
- 静态属性
- 静态代码块
- 静态常量
作者:氯磷Rolin
最近在复习Java的时候发现以前忽略了一个很重要的知识点 static 关键字,复习的时候理清了 static 的用法之后,对Java又有了新的理解,故此记录
static 关键字
- static的意义:
static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法!
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。
static 关键字,可以修饰变量、方法和代码块。在使用的过程中,其主要目的还是想在不创建对象的情况 下,去调用方法
静态方法
- 静态方法是不在对象上执行的方法
使用 static 修饰方法,可以使得该类在不需要被构造的前提下使用该方法,如Math.pow(x,a)
用以计算幂运算,它并不使用任何Math对象 - 静态方法只能访问静态属性
使用 static 修饰的方法,在其内部只能访问使用 static 修饰的属性(字段),不能够访问非静态的实例字段 - 使用static修饰方法的情况:
- 方法不需要访问对象状态,因为他需要的所有参数都通过显式参数提供
- 方法只需要访问类的静态字段
- 示例:
- 构造一个含有静态方法的类:
public class function {
public static int total;
public static void initNum(){
total = 0;
}
public static void addNum(int num){
total += num;
}
public static int getTotal(){
return total;
}
}
2.在另外一个类中可以不需要构建函数即可调用static方法
public class CodeTest {
public static void main(String[] args) {
function.initNum();
function.addNum(30);
function.addNum(10);
System.out.println(function.getTotal());
}
}
3. 控制台输出结果:`40`
静态属性
- 静态属性由static关键字进行修饰
- 静态属性能够优先加载
- 静态属性在类层面进行声明,而不存在于任何方法体中
- 静态属性是该类所共有的,不属于某一个具体的对象
- 静态属性只占有一份内存,不随对象的增加而增加
- 含有static关键字的属性称之为静态属性,反之称之为实例属性
一. 作用
由于静态属性在类创建时就已经存在,有且只有一份内存地址,所以使用该类所构造的所有对象都可以共同访问这个静态属性
- 对象之间可以共享数据变量
- 方便之间通过类名访问变量
二. 示例
- 在静态方法的代码中,实际上我们无需声明一个getTotal方法也可以直接读取total里的值
- 新建一个含有静态属性和构造方法的类:
public class function {
public static int total;
public String name;
public static void initNum(){
total = 0;
}
public function(String name){
this.name = name;
total += 1;
}
}
- 在另外一个类中进行调用
public class CodeTest {
public static void main(String[] args) {
function.initNum();
new function("zhangsan");
new function("lisi");
new function("wangwu");
System.out.println(function.total);
}
}
- 控制台输出的值为:
3
静态代码块
静态代码块是用static修饰的一段代码块,其格式约为 static{ // 执行语句 }
在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
- 静态代码块的特点:
- 当第一次用到本类时,静态代码块执行唯一的一次
- 静态内容总是优先于非静态,优先于main方法和构造方法的执行
- 不存在于任何方法体内
- 只能访问 static 变量
- 示例:
- 创建一个含有static代码块的类
public class function {
public static int total;
public String name;
static {
total = 0; //在静态代码块中执行初始化操作
System.out.println("这里是静态代码块的内容");
}
public function(String name){
this.name = name;
total += 1;
System.out.println("这里是构造方法里的内容");
}
}
- 在其他的类中进行调用,并观察控制台的输出
public class CodeTest {
public static void main(String[] args) {
new function("zhangsan");
new function("lisi");
System.out.println(function.total);
}
}
- 控制台输出最后结果:
这里是静态代码块的内容
这里是构造方法里的内容
这里是构造方法里的内容
2
静态常量
常量是一种特殊的静态属性,它的值不可修改,且无论调用多少次都只占有一个内存地址
- 常量的声明:
public static final 数据类型 常量名称 = 常量值
- 静态常量可以在任何导入该包的地方进行调用,且不会占用多份内存
- 常用于存放重复使用的数据,提高代码的重用性
- 示例:
- 创建一个用于存放常量的类:
public class constant {
public static final int num = 10086;
public static final String name = "zhangsan";
}
- 可以在任意类中进行调用:
public class CodeTest {
public static void main(String[] args) {
System.out.println(constant.name);
System.out.println(constant.num);
}
}
3.控制台输出:
zhangsan
10086