1、static?

  (1)静态成员变量

  被static修饰的成员变量其实是一个类成员变量,当这个类被虚拟机第一次加载的时候,就会为该变量分配内存空间,当该类创建实例时,不会生成对static变量的拷贝。而是多个该类的实例共享该变量。所有该类的对象都可以操作这块存储空间。

  static定义的变量的初始化必须在定义时或者通过静态代码块初始化,并会优先于任何其它非static变量,不论其出现的顺序如何,在涉及到继承的时候,会先初始化父类的static变量,然后是子类的。

  静态成员变量可以使用”类名.变量名“直接使用,当然也可以通过对象来访问(但是不推荐)。 被类中所有方法使用(static与非static),如果该类中某一个对象修改了变量的值,其他所有该类对象中的对应值都会随之改变。

  (2)静态方法

  被static修饰的方法称之为类方法。可以通过类直接调用该方法(类名.方法名),而没必要创建该类的实例后调用该方法。静态方法只能调用其他静态方法,只能使用静态成员变量, 因为是由类名直接调用,不能由对象调用,所以不能以任何形式引用this和super。

  用途:静态方法常常为应用程序中的其它类提供一些实用工具,在Java的类库中大量的静态方法正是出于此目的而定义的。如Arrays和Collections等工具类。也因为是工具类,所以这些类是不能够被继承的。

  (3)静态类

  普通类不允许声明为静态的,只有内部类才可以,请访问我的博客《内部类》。

  查漏补缺:

  static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

  只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

  static 变量前可以有private修饰,表示这个变量可以在类的静态代码块中、或类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,关于静态代码块会在之后的博客中做详细介绍。 

2、final?

  (1)用final修饰的变量表示常量。被final修饰的变量是一个常量,必须被赋值后才能使用。可以在定义时赋值,也可在构造方法中赋值(只要在构造方法结束前给赋值就可以)。final修饰的基本类型变量对象地址不能被修改,对象内部的成员可以被修改。

  (2)用final修饰的方法不能被重写。

  (3) 用final修饰的类不能被继承;final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。但是final类中的成员变量可以被定义为final或非final形式。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,那么就设计为final类,如工具类。

  (4)final不能用来修饰构造方法。

3、static和final的结合?

static final用来修饰成员变量和成员方法,可简单理解为“全局量”;对于变量,表示一旦给值就不可修改,并且通过类名可以访问;对于方法,表示不可覆盖,并且可以通过类名直接访问。

小结:static 和 final 关键字是Java常用的基础知识,static 随类的加载而加载,final 则相当于限制,其修饰的变量是常量,修饰的方法不能被重写,修饰的类不能被继承。


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐