关于java中的static关键字

昨天面了宇宙条一面,面试官就一个static关键字追问了好久,比如说用在哪里,有哪些注意点等等。我答了一些常用的,但事后还是决定赶紧补一下这个知识点,主要从一下几个方面来总结:

  • static修饰方法
  • static修饰变量
  • static修饰类
  • static修饰初始化代码块
  • static修饰导包语句

一条重要的规则:在Java中,静态成员不能直接访问非静态成员

static修饰方法

使用static修饰的方法属于这个类本身,使用static修饰的方法既可以使用类作为调用者来调用,也可以使用对象作为调用者来调用;没有static修饰的方法则属于该类的对象,不属于这个类本身

static修饰变量

  • 用static修饰的变量叫做类变量或者静态变量,类变量从该类的准备阶段起开始存在,直到系统完全摧毁这个类;而实例变量(不用static修饰的变量)则从该类的实例被创建开始存在,直到系统完全销毁这个实例
  •  类变量的作用域与这个类的生存范围相同;而实例变量的作用域与对应实例的生存范围相同
  • 如果通过一个实例修改了类变量的值,由于这个类变量并不属于它,而是属于它对应的类。因此修改的依然是类的类变量,这与通过该类来修改类变量的结果完全相同,此时该类的其他实例来访问这个类变量时也将获得修改后的值

static修饰类

  • 通常就是静态内部类,因为static不可修饰外部类,但可以修饰内部类
  • 静态内部类可以包含静态成员,也可以包含非静态成员;而非静态内部类不可以包含静态成员
  • 因为静态成员不能直接访问非静态成员,所以静态内部类不能访问外部类的实例成员,只能访问外部类的静态成员
  • 静态内部类的实例方法也不能访问外部类的实例成员,只能访问外部类的静态成员。因为静态内部类是外部类的类相关的,而不是外部类的对象相关的,所以静态内部类对象只持有外部类的类引用,并不持有外部类对象的引用
  • 静态内部类是外部类的一个静态成员,因此外部类的所有方法、所有初始化块中可以使用静态内部类

static修饰初始化代码块

如果定义初始化块时使用了static修饰,则这个初始化块就变成了静态初始化块,也叫类初始化块

  • 静态初始化块负责对类进行初始化;而普通初始化块负责对对象进行初始化
  • 执行顺序:静态初始化块 > 普通初始化块 > 构造方法
  • 系统在类初始化阶段执行静态初始化块,而不是在创建对象时才执行
  • 静态初始化块不能对实例变量进行处理,因为他也属于类的静态成员,遵循静态成员不能直接访问非静态成员的规则
  • 在类初始化阶段执行静态代码块时,会先上溯到Object类执行它的静态初始化块(如果有的话),然后往下,执行该类的父类的静态初始化块,最后才执行它自己的静态初始化块

static修饰导包语句

此为静态导入:import static ......,它有两种语法,分别用于导入指定类的单个或全部的静态成员变量、方法

  • 导入指定类的单个的静态成员变量、方法:import static package.subpackage...ClassName.fieldName|methodName;
import static java.lang.Math.abs;
  • 导入指定类的全部的静态成员变量、方法:import static package.subpackage...ClassName.*;
import static java.lang.Math.*;
  • import static语句也是放在Java源文件的package语句之后,类定义之前,但import语句和import static语句之间没有任何顺序要求

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值