static关键字使用
static作为java关键字有其独特的使用风格,对于一个初学者来讲,明确 static 关键字的用法和特性并不是一件简单的事,在这里,本人就自身的学习进度和大家分享一下关于static使用。
我们知道static修饰的方法,变量可以在没有类对象的情况下直接通过类名调用;但为什么可以这样使用呢?
-
从内存角度出发分析
静态成员变量是保存在内存的数据区
类对象占用的实际内存空间是在内存的堆区
这两个区域是完全不同的,所有可以说静态成员变量和对象没有关系 【没有对象】 -
从静态成员变量以及类对象生命周期来分析
静态成员变量是随着类文件(.class) 字节码文件的加载过程中,直接定义在内存的数据区。静态成员变量从程序运行开始就已经存在。
类对象是在代码的运行过程中,有可能被创建的。程序的运行过中,有可能会被JVM的CG(垃圾回收机制)销毁,程序在退出之前一定会销毁掉当前Java程序使用到的所有内存。
静态成员变量在程序退出之后,才会销毁
静态成员变量的生命周期是从程序开始,到程序结束
类对象只是从创建开始,而且随时有可能被JVM的GC销毁
生命周期不在同一个时间线上,所以静态成员变量和类对象无关,【没有对象】
static常见的使用方式
- static修饰变量
static修饰的变量叫作类变量或者静态变量,只要当前类被加载,类变量就会被分配空间,且不会中途被回收 ,这块空间被整个程序所共同使用,一处修改,处处受影响,它的引用方式有两种:类名.类变量名,或类对象.类变量名,但推荐前一种方式使用。
下面是一个例子:
class StaticDemo{
static String str= "将夜";
}
public class test1 {
public static void main(String[] args) {
StaticDemo.str = "余晖";
StaticDemo staticDemo1 = new StaticDemo();
staticDemo1.str = "朔鼠";
StaticDemo staticDemo2 = new StaticDemo();
staticDemo2.str = "邶风";
System.out.println(StaticDemo.str);
System.out.println(staticDemo1.str);
System.out.println(staticDemo2.str);
}
}
猜猜结果
没错,就是:邶风
- static修饰方法
同样static修饰的方法叫类方法或静态方法,也能通过类名直接调用,但用一点要注意静态方法里不允许有非静态成员,不允许出现super,this关键字;着很好理解,应为静态方法是随着类文件加载直接在内存中开辟空间的,非静态的成员是依托于对象存在的,而static修饰的方法首先被执行,这样如果类方法里存在非静态的成员,就会出现一个问题,那就是没有对象可寄托这些非静态成员,所以上面的规定就很好理解啦,(static 用了就是单身狗,因为没有对象,但单身狗可以找对象即类方法里你可以new 一个对象,补充一句废话,构造方法也不能用static)
来个代码吧
class SingleDog{
String str = "余晖";
}
class StaticDemo{
SingleDog singleDog1 = new SingleDog();
static void staticMethod() {
//这里会出错的
singleDog1.str;
//可以找对象
SingleDog singleDog1 = new SingleDog();
}
}
public class test1 {
public static void main(String[] args) {
}
}
- 静态代码块
static这种用法也是比较常见的,静态代码块同样随类的加载而执行,且仅执行一次,并先于main方法执行,在一些数据库加载驱动使,我们经常看到静态代码块的使用
话不多说,来一个例子:
public class test1 {
public test1() {
System.out.println("我是构造方法");
}
static {
System.out.println("我是静态代码块");
}
public static void main(String[] args) {
new test1();
}
}
执行结果如下: