static
是 Java 中的一个关键字,它可以用来修饰成员变量、成员方法和内部类。当一个变量或方法被声明为 static
时,它就是一个静态成员
static关键字
在Java中,static修饰的代码属于类,属于静态方法、静态变量,存储在方法区当中的静态常量池当中。
static修饰的代码属于类,存在方法区的静态常量池中,被所有对象共享。
如果不使用static关键字修饰,这些方法和变量在扫描代码时不会分配内存,只会以二进制的形式保存在.class文件中存放在方法区,当创建对象时才会被分配内存地址,进而被调用。
当我们使用static关键字修饰时,这些代码会在程序执行之前,就在方法区静态常量池当中创建了内存地址,这些方法和变量属于类,方便了类直接调用使用变量和方法,也就是说,我们无需创建对象即可通过类来调用这些方法和变量。
设置static
如果方法和变量属于非静态的,只有在对象中才会被分配内存空间,通过对象才能调用
方便类使用自己的方法和变量,能直接被类调用
运行实例
遇到代码题:画堆栈内存图
如该题所示,加static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象共享
因此无论a1还是a2都能改变内容
static特点
1.static修饰变量
被static修饰的成员变量,称为静态成员变量.静态成员变量不属于某个具体的对象,而是所有对象共有的(即属于类).只有在类第一次使用时加载时进行初始化,以后创建类时不会重新赋值
静态成员变量有如下特点:
①不属于某一个具体的对象,不存储在某一个对象分配的内存地址当中.是类的属性.
②是类的属性,所以静态成员变量一般通过类名访问.(也可以通过创建的对象来进行访问,因为对象来源于类,可以访问类的信息,但不推荐)
③生命周期伴随类的一生,只有在类被删除时才会消失.
④静态变量存储在方法区静态常量池中
非静态方法可以调用静态方法
静态方法调用非静态方法的方式
1.在非静态方法上加入static关键字
2.在main方法当中创建对象,让对象调用非静态方法
为什么在非静态方法中可以调用静态方法?
因为被static修饰属于类变量,存储在方法区的静态常量池当中,被所有对象共享。从形成角度来说, fff()方法想要表达的时候就已经创建好了对象,那么静态方法一定是存在的,因为有对象一定是有类的。
public class A {
private static int a;
public static void main(String[] args){
modify(a);
System.out.println(a);
}
public static int modify(int a){
return a++;
}
}
代码运行结果为0
modify只进行值传递,int a为局部变量,因此对A中a无影响
在main方法执行之前运行目的是优化程序。
画堆栈运行图,首先在静态常量池中放一个变量a,a的默认值为0,main执行,调用modify(a)方法入栈,注意该方法上的变量是局部变量,只在该方法中起作用。java只进行值传递,此时执行a++,然后出栈,最后输出a的值,注意此时的a是静态常量池中的变量a,值为0。
代码流程
扫描-加载(编译)-运行
1.先扫描main方法所在的类:Test类,发现无父类,也无static修饰的代码,编译Test类,将main方法入栈
2.执行new Demo("----")执行前扫描Demo类,发现没有父类,编译Demo类,static代码块优先执行
3.先输出11
4.执行public static Demo demo 涉及到调用Demo构造方法,输出===+++
5.输出22
6.编译完毕,回到main方法继续执行newDemo("----");创建对象,进入运行阶段
7.调用构造器创建对象,输出===----