通过static关键字可以满足两方面的需要:

  1. 只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象
  2. 希望某个方法不与它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能调用这个方法。

java中关键字static主要用于修饰变量、修饰成员方法、静态代码块

1.static静态变量

使用static修饰的类的变量是静态变量。非静态变量是实例变量。

静态变量和实例变量的区别:

  1. 静态变量属于类,在内存中只有一个副本,只要静态变量所在的类被加载,这个静态类就会被分配空间,因此就可以被使用。调用方式:类.静态变量;对象.静态变量
  2. 实例变量属于对象,只有对象被创建后,实例变量才会被分配空间。调用方式:对象.实例变量
public class StaticTest { //1.static静态变量 private static int num = 10;  private int age;  public static void main(String[] args){ System.out.println(StaticTest.num);// System.out.println(StaticTest.age); //实例变量无法通过类来调用 StaticTest staticTest = new StaticTest(); System.out.println(staticTest.num); System.out.println(staticTest.age); }}//输出结果:10 10 0

静态变量和静态常量的区别:

  1. 静态变量:jvm类加载进行到准备阶段的时候,会初始化静态变量;jvm类加载进行到初始化阶段,此时会将静态变量的值赋值为代码中指定的值。
  2. 静态常量:jvm类加载到准备阶段的时候,会直接将静态常量的值直接赋值为代码指定的值,静态常量的初始化完成的比静态变量的早。
//静态变量private static int num = 10;//静态常量private static final int num2 = 10;

静态的变量和常量会一直存在于程序中,直到整个程序结束才会释放所占用的资源,如果定义的变量和常量在程序中很少被使用,这样就会造成大量资源的浪费。

2.static静态方法

使用static修饰类的方法是静态方法。常用的main方法就是静态方法。

静态方法的特点:

1.静态方法可以直接调用类中的静态变量,但是不能直接调用非静态变量,而是通过对象调用非静态变量

public class StaticTest { private static int num = 10;  private int age;   public static void printTest(){ //1.静态方法中可以直接调用静态变量 System.out.println(num); //2.静态方法中不可以直接调用实例变量// System.out.println(age); //3.静态方法中可以通过对象调用实例变量 StaticTest staticTest = new StaticTest(); System.out.println(staticTest.age); }}

2.普通方法可以调用类的非静态变量和静态变量

public class StaticTest { private static int num = 10;  private int age;  public void printTest2(){ //1.普通方法可以调用静态变量 System.out.println(num); //1.普通方法可以调用实例变量 System.out.println(age); }}

3. 静态方法中不能直接调用非静态方法

public static void printTest3(){  //1.静态方法中可以直接调用静态方法 printTest(); //2.静态方法中不可以调用非静态方法// printTest2();  //3.静态方法可以通过对象调用非静态方法 StaticTest staticTest = new StaticTest(); staticTest.printTest2();  }

3.static静态代码块

static静态代码块是使用static{}包起来的代码。

Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需要使用静态代码块。

常用例子:

public class JDBCConnection { private static final String DRIVER="com.mysql.jdbc.Driver"; private static final String URL="jdbc:mysql://127.0.0.1:3306/wise_base_test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false"; private static final String USER_NAME="root"; private static final String PASSWORD="123456"; private static Connection conn; private static final ThreadLocal threadLocal = new ThreadLocal(); //通过静态代码块加载JDBC驱动 static { try{ Class.forName(DRIVER).newInstance(); }catch(ClassNotFoundException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } }}