静态(static)和非静态(non-static)是计算机编程中的两个重要概念,它们主要涉及变量的存储方式和生命周期,以及方法的调用方式。
静态成员(包括变量和方法)属于类级别,而非静态成员属于实例级别。在调用方式、生命周期和存储方式上,两者存在显著差异。
-
静态变量:
- 静态变量是在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间。也就是说,只要程序在运行,那么这块内存就会一直存在。
- 静态变量可以通过类名直接访问,不需要创建对象。
- 静态变量在内存空间中只有一份,也永远只有一份。而非静态变量只要new出一个对象引用就会在内存中分配一份空间给它。
- 静态变量可以被所有实例共享,其修改值对其它实例可见。
-
非静态变量:
- 非静态变量(也称为实例变量)是在对象的实例中独立存储的。非静态变量只在对象被实例化时分配内存,并且每个实例都有自己的非静态变量副本。
- 非静态变量必须通过创建对象后才能访问。
- 非静态变量的生命周期与对象的生命周期相同,当对象被销毁时,非静态变量也会被释放。
-
静态方法:
- 静态方法是以static关键字修饰的方法。
- 静态方法属于类级别,而不是实例级别,因此可以直接通过类名调用,无需创建对象。
- 静态方法不能直接访问非静态变量,因为非静态变量需要对象实例才能存在。
-
非静态方法:
- 非静态方法(也称为实例化方法)属于实例对象,实例化之后才会分配内存,必须通过类的实例来引用。当实例对象被JVM回收之后,也跟着消失。
- 非静态方法在类定义时没有占用内存,只有在类被实例化成对象时,对象调用该方法才被分配内存。