首页 > 技术文章 > Java中static和final的解析

hackerstd 2020-03-21 22:41 原文

static关键字和final关键字是Java中一个难点&重点。本文通过static的用途、常见问题、final的用途、final常见问题,以及static和final的对比来解释这两个关键字。

static(唯一性)

static能修饰哪些

  • 成员方法
  • 成员变量
  • 代码段
  • 内部类

注:static不能修饰局部变量

static的常见问题

  • static修饰的属性在类加载的时候进行初始化,static修饰的属性所有对象都只有一个值。
  • static修饰的属性强调它们只有一个。  
  • static和“this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。
  • static修饰的属性初始化之后是能够修改的
  • 声明时必须初始化。
  • static方法不能访问非static属性,因为类加载完毕时尚未实例化对象,所以不存在非static属性。如果非要访问,就必须进行实例化。但是要知道非static方法是可以访问static属性的。只需熟记一点,static内存区优先于非static内存区加载。

static的用途

“为了不创建对象也能够调用该类的方法或者属性”。——出自《java编程思想》P87页

final(不变性)

final能修饰哪些

  • 成员变量
  • 局部变量
  • 成员方法

final常见的问题

  • final修饰的属性初始化可以在类加载时,也可以在对象创立时。但是初始化之后就不能改变。
  • final修饰的属性强调他是一个不可修改的常数。
  • final修饰的方法在子类中不能被重写。
  • final修饰的类不能被继承。
  • 初始化可以在声明时进行,也可以在构造函数中进行。
  • 对于基本类型数据,final会将值变为一个常数(创建后不能被修改);但是对于对象句柄(亦可称作引用或者指针),final会将句柄变为一个常数(进行声明时,必须将句柄初始化到一个具体的对象)。
  • private修饰的方法已经被隐式指定为final了,因此无需再将一个定义为private类型的方法再定义为final了。

static final(final static)

static final和final static语法和用法上没有任何区别,一般习惯static写在前面。两者的结合就是唯一性和不变性的结合,即一个初始化过后即无法改变的常量,并且可以通过类访问。

推荐阅读