通过static关键字可以满足两方面的需要:
- 只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象
- 希望某个方法不与它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能调用这个方法。
java中关键字static主要用于修饰变量、修饰成员方法、静态代码块
1.static静态变量
使用static修饰的类的变量是静态变量。非静态变量是实例变量。
静态变量和实例变量的区别:
- 静态变量属于类,在内存中只有一个副本,只要静态变量所在的类被加载,这个静态类就会被分配空间,因此就可以被使用。调用方式:类.静态变量;对象.静态变量
- 实例变量属于对象,只有对象被创建后,实例变量才会被分配空间。调用方式:对象.实例变量
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
静态变量和静态常量的区别:
- 静态变量:jvm类加载进行到准备阶段的时候,会初始化静态变量;jvm类加载进行到初始化阶段,此时会将静态变量的值赋值为代码中指定的值。
- 静态常量: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(); } }}