一、初步认识static关键字
static是一个修饰符,用来修饰类的成员方法、类的成员变量。
1、static修饰成员方法
static修饰的成员方法成为静态方法(与之相对的称之为非静态方法,或者实例方法)。静态方法常应用于测试类,工具类中。
2、静态方法与非静态方法的调用
我们知道,普通方法的调用是使用对象进行调用。根据javabean类创建好成员对象后,我们根据对象调用非静态方法。在调用时,系统自动将对象的地址值传递给类中所调用的方法。也就是在形参中自动添加了:类名 this。
由此可见,在使用非静态方法以及非静态变量的时候,我们都需要根据对象的地址值(this)去寻找。
静态方法不依赖于任何对象就可以方法,这种访问方法称之为类名访问,对于静态方法来说是没有用this的。由于没有this这个特性,在静态方法中不可以访问非静态成员变量和非静态成员方法,因为非静态方法以及非静态变量都需要具体的对象去调用。
静态方法多应用于测试类和工具类中,javabean类中很少会使用。
静态方法可以通过对象名或类名(推荐)调用。
相反的,我们使用非静态方法可以访问静态方法与静态变量,这是因为静态方法可以通过对象的方式进行调用。
注意:通常我们不在非静态方法中调用静态方法,因为需要后面的知识我不会👿👿👿。
举个例子:非静态方法是3年2班的学生,静态方法是3年2班的老师。老师是所有同学的老师,你可以通过同学去找到老师,也可以来3年2班找到老师。同时3年2班可以有多个老师(比如说教语文的,教数学的,教英语的)和很多个学生。
3、static修饰成员变量
static修饰的变量也称之为静态变量。
在初次调用类时,虚拟机在编译时在方法区加载了class文件,并且在堆区中开辟了静态变量存储区,将静态变量创建并且赋予初始值,由此我们可以看到静态变量以及静态方法在对象仍未创建之前就存在了。
4、静态变量与非静态变量
静态变量被所有成员变量所共享,与对象无关,随着类的加载而加载,优先于对象的创建。(3年2班的某一个老师是所有同学共有的老师),它在内存中只有一个副本,按照定义的顺序进行初始化。
静态变量可以通过对象名或者类名调用(推荐)。
非静态变量通过空参构造方法或者实参构造方法,使用new关键字在堆区创建出一个空间,空间存放了非静态成员变量,并对其进行赋值(空参构造时系统根据数据类型自动进行赋值)。
非静态变量有用多个副本,是对象所拥有的属性,在对象创建的时候被初始化,互不影响。
5、重新认识main方法
我们已经写了很多次public static void main(String[] args){}了
这句话的意思是:
public访问范围,因为是jvm调用测试类,所需要的访问权限自然很大。
static被jvm调用时不用创建对象,可以使用类名直接访问。
因为main是静态方法,静态方法只能调用静态变量或方法,所以测试类中其他方法也是静态的。
void被jvm调用,不需要返回任何值
main:虽然不是关键字,但是被特殊定义,看到main JVM就会识别。
String[] args是一个字符串数组,在早起没有Scanner类的时候,方便使用键盘输入而设置的。如今我们已经不需要通过这种方式输入,但是向下兼容所以保留了这种方式。
😍😍😍学了这么久终于知道这句话嘛意思了。
6、总结
静态方法,只能访问静态变量或方法。
非静态方法,可以访问所有变量或方法。
静态变量或方法没有this关键字。
//this:表示当前方法调用者的地址值
//这个this是虚拟机赋值的
//静态方法可以用类名的方法调用 也可以用对象的方法调用
//因此非静态方法,可以使用对象的方法调用静态方法
//静态随着类的加载而加载
//非晶态随着对象创建而加载
//非静态的成员变量也称之为实例变量,实例是对象的意思