1.static关键字实现原理
方法区:方法区是SUN公司提出的一个规范,JDK8之前称之为永久代,JDK8开始称之为元数据。
静态区:是指static相关的信息存储的区域。
创建对象的过程:
1.当我们new对象,JVM会先在方法区中检查,是否此类的class文件已经被加载。
如果没有加载,则先将class文件加载到方法区,此时静态相关的信息将初始化
如果已经加载,则直接执行第二步
2.在堆中开辟空间,此时实例属性将有默认值
3.将栈中的引用指向堆中的空间
永久代/元数据:因为在方法区中初始化的数据是不会随着程序的执行动态的被垃圾回收的 ,所以存储的时间比较长。另外因为方法区中的数据初始化的时机比较早,所以后来称之为元数据。
1.1 代码块
JVM加载类时,加载静态代码块
如果有多个静态块,按顺序加载
每个静态代码块只会被执行一次
1.2 静态变量
类的成员变量包括
类变量(静态变量) 被static修饰的变量 在内存中只有一个拷贝 类内部,可在任何方法内直接访问静态变量 其他类中,可以直接通过类名访问
实例变量 没有被static修饰的变量 每创建一个实例,就会为实例变量分配一次内存,实例变量在内存中有多个拷贝,互不影响
1.3 静态方法
静态方法:可直接通过类名访问 静态方法中不能使用this和super 不能直接访问所属类的实例变量和实例方法 可直接访问类的静态变量和静态方法
实例方法:通过实例访问 可直接访问所属类的静态变量、静态方法、实例变量和实例方法 静态方法必须被实现
1.4 关于访问
平级与平级的互相直接访问
非静态可以直接访问静态
静态不能直接访问非静态必须先new对象
2. 练习题
模拟实现选民投票过程:一群选民进行投票,每个选民只允许投一次票,并且当投票总数达到100时,就停止投票
package com.qfedu.test2;
/**
* 选民类
* @author WHD
*
*/
public class Vote {
static int ticketCount;
String name;
public boolean voteFor() {
if(ticketCount < 100) {
ticketCount++;
System.out.println(name + "投出了一票,还剩余" + (100 - ticketCount) + "票");
return true;
}else {
System.out.println("投票截止");
return false;
}
}
public static void main(String[] args) {
Vote zhaosi = new Vote();
zhaosi.name = "赵四";
zhaosi.voteFor();
Vote guangkun = new Vote();
guangkun.name = "广坤";
guangkun.voteFor();
Vote liuneng = new Vote();
liuneng.name = "刘能";
liuneng.voteFor();
for (int i = 1; i < 200; i++) {
Vote