目录
一、static关键字是什么?
static修饰的代码属于类,定义的变量存储在方法区的静态常量池中
二、java为什么设计static关键字?
因为要方便去使用自己的方法和变量
三、static关键字的使用
(1) static使用示例:
public class A {
public static String name = "admin";
public static void run(){
System.out.println("跑得很快");
}
public static void flay(){
System.out.println("飞得很高");
}
}
public class Test{
public static void main(String[] args) {
//假设我们的方法和变量上面没有static关键字
A a = new A();
a.run();
a.flay();
a.name = "sss";//那么该类当中的方法只能由对象调用
//如果有static关键字,我们能直接被类调用
A.name = "xxx";
A.run();
A.flay();
}
}
画图进行分析代码的运行逻辑:
可以看出,static变量修饰的方法变量是单独存储在方法区的静态常量池中,而不需要创建对象将其加载在堆内存中存储,因此借用static关键字可以不创建对象就直接使用类去调用其本身的方法变量。
(2) static修饰方法、变量、代码块
static修饰变量:static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象共享
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
a1.address = "上海";
a1.name = "张三";
a2.address = "天津";
a2.name = "李四";
System.out.println(a1);
System.out.println(a2);
}
}
class A {
//static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象共享
public static String name = "admin";
public String address = "北京";
@Override
public String toString() {
return "A{" +
"address='" + address + '\'' +
"name='" + name + '\'' +
'}';
}
}
static修饰方法:非静态方法可以调用静态方法,静态方法则不能调用非静态方法
从图中可以看出,静态方法a()如果想要调用非静态方法b()会报错,而非静态方法b()调用静态方法a()则不会报错
注:如果一个方法想在main方法中被调用,有以下两种方法:
1、在非静态方法上加入static关键字,直接通过其所在类进行调用
2、在main方法当中创建对象,让对象调用该非静态方法
static修饰代码块:在main方法之前运行,目的是优化程序
public class Demo{
public Demo(String aa){
System.out.println("==="+aa);
}
static {
System.out.println("11");
}
public static Demo demo = new Demo("+++");
static {
System.out.println("22");
}
}
class Test{
public static void main(String[] args) {
Demo demo = new Demo("---");
}
}
分析其加载过程如下:
扫描————————>加载(编译)————————>运行
1、main方法在哪里就先去扫描哪个类---->首先去扫描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、通过调用构造器创建对象: ===---
最终得到运行结果为: