一、static关键字是什么?
static修饰的代码属于类,定义的变量存储在方法区的静态常量池当中
二、static可以修饰什么
1.static修饰变量
static修饰的变量叫做类变量,被所有该类产生的对象所共享,存储在方法区的静态常量池中
2.static修饰方法
static修饰是的方法属于静态方法,static修饰的方法才能调用static修饰的方法
3.static修饰代码块
static修饰的代码块在main方法运行之前运行,其目的是优化程序
三、java为什么设计static关键字
因为要方法类去使用自己的方法和变量
1.假设不使用static关键字
则如果方法和变量属于非静态,只有在对象当中才会被分配内存空间,也就是说只能由对象调用。如下:
2.使用static关键字
对于static修饰的变量或者方法,我们建议使用类去调用,虽然对象也可以做到,但是不推荐。
而从上一张图可以看出如果没有static关键字,那么类是不可以调用自己的属性和方法的,只能用对象去调用
四、static关键字修饰方法具体用法
1.static修饰的方法无法调用到非静态方法
2.在非静态方法当中可以调用到静态方法
为什么在非静态方法中可以调用静态方法?
因为hhh被static修饰属于类变量,存储在方法区的静态常量池当中,被所有对象所共享。然而 fff()方法想要表达的时候就已经创建好了对象,那么静态方法一定是存在的。
五、 非运行状态输出代码结果
一套基本的流程:
示例代码1:
代码流程介绍:
程序执行先去找main()方法启动程序
1.首先先去扫描Test类,返现Test类有父类Base类,先去扫描父类,发现Base类没有父类
2.将Base.class加载进方法区,此时Base类当中的static代码块执行
3.将Test.class加载进方法区,此时Test类当在的static代码块执行
4.main方法入栈---->执行new Test();去创建Test类的对象
5.创建子类对象之前先创建父类对象,所以先执行Base()构造器,在执行Test()构造器! |
示例代码2:
输出:
代码流程介绍:
1.main方法在哪里我们就先去扫描那个类--->首先去扫描Test类,发现没有父类,也没有static修饰的代码,那么编译Test类,并且将main方法入栈
2.执行new Demo("----");在执行之前扫描Demo类,发现没有父类,所以编译Demo类,在编译的过程中static代码块按顺序优先执行
3.首先输出的是11
4.执行 public static Demo demo = new Demo("+++" );此时会涉及到调用Demo构造方法,所以输出===+++
5.输出22
6.编译完毕,回到main方法当中继续执行new Demo(" ---");现在可以创建对象了,也就是进行到了运行阶段
7.通过调佣构造器创建对象:===---
六、Java的值传递
首先静态常量池中有一个变量a,a的默认值为0,main执行,调用modify(a)方法入栈,注意方法的变量是局部变量,只在该方法中起作用。java进行值传递,此时执行a++,然后出栈,局部变量也就没用了,最后输出a的值,此时的a是静态常量池中的变量a,值为0。