目录
1. static 的基本介绍
2. static 修饰成员变量
3. static 修饰方法
4. static 的注意事项
static 是Java语言中一个非常重要的关键字,static 表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。
被 static 修饰的成员变量,被称为静态变量,一旦被 static 修饰,那么该变量会有以下特点
(1)被该类创建的所有对象共享;
(2)它不属于对象,而是属于该类,但可以被该类的对象调用;
(3)随着类的加载而加载,优于对象存在;
我来简单解释一下,我们都知道,JVM内存主要分 方法区,虚拟机栈,本地方法栈, 程序计数器,堆 五部分,这里简单介绍,想深入了解的可以搜索相关的资料;
对于我们Java程序员来说,着重需要知道 方法区,堆 和 虚拟机栈 这三部分,这也是面试JVM内存模型常常被问到的知识点;
堆:主要存放对象;
虚拟机栈:运行我们的程序,将所需要的方法和方法的局部变量依次进栈出栈;
方法区:存放静态方法信息(修饰符、方法名、返回值、参数等)以及类的所有信息;
在JDK8以前,静态变量和静态方法都存放在方法区中,而在JDK8以后,将静态变量移入堆中,并在堆中单独开辟了一处空间叫静态区,专门用来存放静态变量。
静态变量和静态方法,它会随着类的字节码文件加载而立刻加载到堆中的静态区;这也就是为什么静态变量是优先于对象存在,因为它在类加载之后马上就会跟着加载到堆中的静态区;
静态变量被该类所有对象共享,那么所有对象都可以调用使用该静态变量,调用方式主要分为两种
(1)类名.静态变量(推荐使用的调用方式)
(2)对象.静态变量(这种方法也可以,但不推荐)
因为静态变量是属于类的,不属于某一个对象所有,因此使用 类名.静态变量 的调用方式在逻辑上更说得通,反之 对象.静态变量 这种调用方式就不太好,逻辑上说不通,但也可以这样调用。
static 不仅可以修饰的成员变量,也可以修饰方法,一旦方法被 static 修饰,那么它就叫静态方法,静态方法有以下特点:
(1)多用在测试类和工具类中;
(2)JavaBean类中很少使用;
调用方法也很简单,如果实在静态方法所在的类调用,则直接写方法名即可调用;
如果是调用别的类中的静态方法,则可以使用 类名.方法名 的方式调用;
(1)静态方法中只能访问静态方法或者静态变量;
(2)非静态方法可以访问静态变量和静态方法,也可以访问非静态的成员变量和非静态的成员方法;
(3)静态方法中没有 this 关键字;
我们应该知道,在成员方法中,其实都是有一个隐含的 this 的,这个 this 指向调用者的地址值,在成员方法中,我们可以通过 this 获取到调用此方法的变量的地址值,从而获取相应的属性。
但是在静态方法中,由于静态方法是共享的,它不属于某一个对象,因此在静态方法中是没有 this 这一概念的。这也是为什么在静态方法中不能调用非静态变量的原因。
静态变量和静态方法是在字节码加载之后就马上直接加载到JVM内存中,只有静态变量和静态方法加载完成,此时对象还尚未创建,自然不可以调用对象和对象的相关属性,而静态变量与静态方法是一同加载的,可以互相调用;