与static的第一次相遇

刚开始接触JAVA语言,在属于我的第一个类中写下的第一个方法——main方法:

1
2
public static void main(String[] args){
}

B站的老师告诉我“至于这几个词到底是什么意思,暂时不需要了解哈”,确实是暂时的,不久后,在“面向对象高级一”的课程中,我首先就要认识static的含义(悲)

了解static

static,我们可以在轻易地搜索到它的含义:

作形容词:静止的,停滞的

作名词:静电

在JAVA语言里,我们理解为:静态

static的作用范围

java中的static关键字主要用于内存管理,属于类,而不是类的实例

static(静态)可以用来修饰:

  1. 变量:称为类变量或静态变量
  2. 方法:称为类方法或静态方法
  3. 代码块:称为静态代码块
  4. 嵌套类:称为静态内部类

静态变量

成员变量按有无static修饰,分为两种:

  1. 类变量(静态成员变量):有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享
  2. 实例变量(对象的变量):无static修饰,属于每个对象的。
静态变量
  1. 运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
  2. 在类的内部,可以在任何方法内直接访问静态变量。
  3. 在其他类中,可以通过类名访问该类中的静态变量。
实例变量
  1. 每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。
  2. 在类的内部,可以在非静态方法中直接访问实例变量。
  3. 在本类的静态方法或其他类中则需要通过类的实例对象进行访问。

静态方法

同成员变量,成员方法也可以分为以下两种:

  1. 静态方法(或称为类方法),指被 static 修饰的成员方法。
  2. 实例方法,指没有被 static 修饰的成员方法

类方法(静态方法):有static修饰的成员方法,属于类

1
2
3
public static void aaa(){
...
}

可以用直接用类名访问,也可以用对象访问

1
2
类名.类方法(推荐)
对象名.类方法
  1. 它通过类直接被调用,无需创建类的对象。
  2. 静态方法中,不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法;
  3. 静态方法中,可以直接访问所属类的静态变量和静态方法。
  4. 同this 关键字,super 关键字也与类的实例相关,静态方法中不能使用 super 关键字。

实例方法(对象的方法):无static修饰的成员方法,属于对象

只能用对象访问

1
对象名.实例方法

实例方法,可直接访问所属类的静态变量、静态方法、实例变量和实例方法。

静态方法与静态变量适用场景:

  1. 静态方法,最适合工具类中方法的定义;比如文件操作,日期处理方法等。
  2. 静态方法,适合入口方法定义;比如单例模式,因从外部拿不到构造函数,所以定义一个静态的方法获取对象非常有必要。
  3. 静态变量适合全局变量的定义;举例:用一个布尔型静态成员变量做控制标志。

静态代码块

静态代码块

格式:static{}

有static修饰的成员方法,属于类

  1. 静态代码块,有点类似于一个方法,但不可以存在于任何方法体内。
  2. 静态代码块,可以置于类中的任何地方,类中可以有多个静态初始化块。
  3. Java 虚拟机在加载类时执行,将只需要进行一次初始化的操作放在 static 代码块。
  4. 类中含多个静态代码块,Java虚拟机将按它们在类中出现的顺序依次执行,且都执行一次。
  5. 同静态代码块与静态,不能直接访问类的实例变量和实例方法,需通过类的对象访问。

实例代码块

无static修饰的成员方法,属于对象

格式:{}

特点:每次创建对象时,执行示例代码块,并在构造器前完成。

作用:和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。

静态类

java中一个类要被声明为static的,只有一种情况,就是静态内部类(内嵌类)。如在外部类声明为static的,程序会编译都不会通过。

1、静态内部类,跟静态方法一样,只能访问静态成员变量和方法,不能访问非静态方法和属性。

2、普通内部类,可以访问任意外部类的成员变量和方法。

3、静态内部类,可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。

4、静态内部类,可以单独初始化。

1
Inner i = new Outer.Inner();

普通内部类初始化:

1
2
Outer o = new Outer();
Inner i = o.new Inner();

适用场景:当外部类需要使用内部类,而内部类无需外部类资源,并且内部类可以单独创建时,考虑采用静态内部类的设计,在知道如何初始化静态内部类。