



public class Person {
final int age = 18;
final String name = alice;
String bag = "computer";
public static void main(String[] args) {
final Person person = new Person();
person.bag = "book"; // 可以修改类的内容
// person = new Person(); // 不能重新引用
}
}






/**
* 描述: 演示final变量
*/
public class FinalVariableDemo {
// 1.可以直接赋值
private static final int a;
// 2.或是在静态代码块中赋值
// static {
// a = 7;
// }
}

/**
* 描述: 演示final变量
*/
public class FinalVariableDemo {
// void testFinal() {
// final int b = 7;
// int c = b;// 确保b使用时,是有赋值的
// }
}









package immutable;
/**
* 描述: 演示栈封闭的两种情况,基本变量和对象 先演示线程争抢带来错误结果,然后把变量放到方法内,情况就变了
*/
public class StackConfinement implements Runnable {
int index = 0;
public void inThread() {
// 方法内的变量,不共享,是安全的
int neverGoOut = 0;
// synchronized (this) {
for (int i = 0; i < 10000; i++) {
neverGoOut++;
}
// }
System.out.println("栈内保护的数字是线程安全的:" + neverGoOut);
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
index++;
}
inThread();
}
public static void main(String[] args) throws InterruptedException {
StackConfinement r1 = new StackConfinement();
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r1);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println(r1.index);
}
}


示例1:

wukong2,发现常量池中有,就直接指向a指向的常量,因此,地址一样wokong2的引用,因此,地址不同