这是我结合一些自己的思想写的对static关键字的理解。
【重点】他是单身狗!!!
“这里不希望大量的数据浪费”,打错字了,在这里纠正一下。
数据区也可以叫做共享区,是一个公共资源的放置地方。
static可以节省大量的冗余空间,堆区的String country指向数据区的首地址,类似于栈区指向于堆区。
好了,经过上面的脑补后,相信static的形象已经深入人心,下边我们来认真了解一下为什么静态成员变量和对象无关…
代码展示
/*
* 演示static关键字修饰成员变量
*/
class SingleDog {
// static修饰的静态成员变量
public static String info = "单身狗";
// 非静态成员变量
public String name;
public SingleDog() {}
public SingleDog(String name) {
this.name = name;
}
// 非静态成员方法
public void test() {
System.out.println("test方法");
}
}
public class Demo2 {
public static void main(String[] args) {
// 在没有类对象的情况下,可以直接通过类名调用静态成员变量
System.out.println(SingleDog.info);
// 曾经有过一个对象,31行代码运行完成,对象销毁
new SingleDog();
// 在类对象被销毁之后,依然可以通过类名调用静态成员变量
System.out.println(SingleDog.info);
}
}
异常熟悉的格式
public static 返回值类型 方法名(形式参数列表) {
}
静态成员方法就是我大FFF社!!!
类变量 ==> 静态成员变量 类方法 ==> 静态成员方法 类成员 ==> 静态成员变量和静态成员方法
面试题 类方法中是否可以使用成员变量? 类方法可以使用当前类内的静态成员变量,但是不允许使用非静态成员变量
补充知识点 代码块
构造代码块(动态代码块) 初始化当前类的所有类对象,只要调用构造方法,【一定】会执行对应的构造代码块
执行顺序【成员变量之后 构造方法之前】
格式
{
}
静态代码块 初始化程序,只要类文件加载,静态代码块中所有内容全部执行
格式:
static {
// 静态代码块
}
只要【类文件】加载,当前静态代码块中的内容就一定会执行,并且有且只【执行一次】。 注意: 是.class文件加载,不是文件加载,如果主类中没有用到这个类,那么就不会加载这个类中的静态代码块。
作用:整个类的初始化过程
局部代码块 提高效率,解决内存,让JVM回收内存的效率提升。
for () {
{
int num
}
}
public class Demo3 {
static Demo3 demo1 = new Demo3();
static Demo3 demo2 = new Demo3();
{
System.out.println("构造代码块"); // 1
}
static {
System.out.println("静态代码块"); // 2
}
public Demo3() {
System.out.println("构造方法"); // 3
}
public static void main(String[] args) {
Demo3 demo1 = new Demo3();
}
}
请问输出结果应该是什么呢?做题,不是写代码实践,思考…
答案:
//答案
/*
构造代码块
构造方法
构造代码块
构造方法
静态代码块
构造代码块
构造方法
*/
//解释
//首先代码执行static Demo3 demo1 = new Demo3(); 是new一个对象,是new构造方法,所以执行
//构造代码块和构造方法
//然后执行static Demo3 demo2 = new Demo3();是new一个对象,是new构造方法,所以执行
//构造代码块和构造方法
//然后执行
static {
System.out.println("静态代码块"); // 2
}
//然后执行
public static void main(String[] args) {
Demo3 demo1 = new Demo3();
}
//又是创建新的类对象,所以执行构造代码块和构造方法
那么接下来我们将上边两个代码去掉static,结果会怎样? 如下:
public class Demo3 {
Demo3 demo1 = new Demo3();
Demo3 demo2 = new Demo3();
{
System.out.println("构造代码块"); // 1
}
static {
System.out.println("静态代码块"); // 2
}
public Demo3() {
System.out.println("构造方法"); // 3
}
public static void main(String[] args) {
Demo3 demo1 = new Demo3();
}
}
结果:
执行“静态代码块” 无限递归,栈堆内存满,报错