深入理解static关键字

提纲:static修饰符总的来说有四种作用:修饰字段或方法、修饰代码块、静态导入包、构造静态内部类。其实我的理解static就是为了方便我们在不创建类的实例的情况下,就可以直接通过类名调用某个方法或者变量等

一、修饰字段或方法
1.修饰字段
当使用static修饰字段时,那么该字段就为静态字段,在每个类中只有一个这样的字段,即被static修饰的变量被该类的所有实例所共享,而其他非静态的字段,在每个该类的实例中都有自己的一个副本。

举个例子:在学生类Student中有两个字段,分别是:学校id——schoolId(静态字段)、学生id——studentId(非静态字段)。每个Student对象都有自己的学生id,但是这些学生都有同一个学校id。
也就是说,如果有1000个学生对象,则有1000个学生id,分别对应每一个学生对象。但是,只有一个静态字段学校id,即使没有学生对象,静态字段学校id也是存在的。
静态变量使用的较少,一般静态常量使用的更多。例如,Java的Math类中定义的Π静态常量。

public static final double PI = 3.14159265358979323846;

2.修饰方法
被static修饰的方法,称为静态方法。静态方法是不用实例化对象就可以执行的方法。在调用普通方法时,需要实例化对象之后,通过该对象调用该方法;但调用静态方法时,不需要实例化对象,因为static修饰的方法归属于类,调用该方法直接通过类名调用即可。
注意事项:
被定义为静态方法后,方法中就不能再使用this关键字了;
静态方法中不可以使用非静态方法,但非静态方法中可以调用静态方法;
例如:
Math类中的max方法,传入两个整型数值,返回最大值,表达式为:

Math.max(int a, int b)//使用Math类直接调用max方法即可,无需实例化对象

使用静态方法的场景:方法只需要访问类的静态字段或者调用方法不需要实例化对象时使用。
二、修饰代码块
如果类的静态字段需要比较复杂的初始化代码时,可以使用静态代码块。
将代码放在一个块中,并将该块标记为static,那么就构造了静态代码块。

//随机生成一个小于100的整数
private static int id = 1;
static{
  Random random = new Random();
  id = random.nextInt(100);
}

三、静态导入包
在使用静态字段或方法时,需要在字段或方法前加类名,例如使用数学类中比较最大值的方法时,需要在max方法前加Math类名,当使用静态字段或方法较少时,这样没有问题,但是如果使用的静态字段或方法较多时,就可以在类文件头部静态导入包。

例如:
在没有静态导入包前和静态导入包后,使用最大值比较函数,如何写:

//头部没有静态引入Math类
Math.max(1,2);

//头部静态引入了Math类
import static java.lang.Math.*;
max(1,2);
//通过静态引入类,可以使得代码更清晰,代码量也减少了

四、构造静态内部类
当一个内部类只是为了隐藏在一个类内部,并不需要内部类有外部类的引用时,可以将内部类声明为static。
注意事项:
只要内部类不需要访问外部类对象,那么就应该使用静态内部类
与常规内部类不同,静态内部类可以有静态字段和方法
在接口中声明的内部类自动是static和public

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值