package com.aaa;
import java.util.ArrayList;
import java.util.List;
/**
* @filename Test0128.java
* @author l
* @version 创建时间:2019年1月28日 下午4:47:58
* @description
*/
class Apple {
private static long a;
private static long b = a++;
// private final long b = a++;输出结果不一样
public long geta(){ return b;}
}
class Orange {}
public class Test0128 {
public static void main(String[] args) {
List apples = new ArrayList();
for(int i=0;i<3;i++){
apples.add(new Apple());
}
for(int i=0;i<apples.size();i++){
Apple apple = (Apple) apples.get(i);
System.out.println(apple.geta());
}
}
}
- 输出结果为: 0,0,0
- 问题: 当把private static long b = a++;中static 改为final时,输出结果变为0,1,2
- 解答
①static在代码编译的时候初始化变量,final可以在代码运行中初始化变量。
②a++是先赋值给b,再自生加1
1.static作用域针对所有对象,类属性,加载类的时候,只初始化了一次,用一个空间,一个对象里面变了他的值,另外一个访问的也是他
2.final针对当前对象,每new一个,就会初始化这个对象b一个独立的空间
所以第一次都为static的时候,类加载的时候只初始化了一次,就是按顺序,a=0;b=a++=0; a=1;a没有给初始值,初始值为0
你b改成final后每new一次,就会初始化一个对象,每个对象里面独立的b
第一次new,a=0;b=a++=0;a=1;
第二次new, a=1;b=a++=1;a=2;
第二次new, a=2;b=a++=2;a=3;
本文探讨了Java中static与final修饰符对变量初始化的影响,通过一个具体的代码示例,展示了static变量在类加载时初始化一次,而final变量在每次实例化时都会初始化。解析了a++操作的执行顺序,并对比了不同修饰符下输出结果的差异。
897

被折叠的 条评论
为什么被折叠?



