1.4 java关键字
1.final
final: 变量,对象引用不可变,方法不可覆盖,类不可以被继承。
对象引用不可变
@Test
public void method1(){
final StringBuilder s = new StringBuilder("a");
s.append('b');
System.out.println(s.toString());
}
输出ab
@Test
public void method1(){
final StringBuilder s = new StringBuilder("a");
s.append('b');
s = new StringBuilder("cd");
System.out.println(s.toString());
}
报错
Error:(15, 9) java: 无法为最终变量s分配值
也就是说,s指向的地址不会变,而地址内的内容可以改变。这就是引用不可变。
变量不可变
final int a = 1;
a = 2;
这个就会报错
Cannot assign a value to final variable 'a'
关于final变量的初始化:可以直接初始化,也可以在构造器中进行初始化。
方法不可覆盖
public class Demo2 {
final static String s2 ;
static {
s2 = "a";
}
@Test
public final void method1(){
final StringBuilder s = new StringBuilder("a");
s.append('b');
final int a = 1;
System.out.println(s2);
}
public void canConstruct(StringBuilder ransomNote) {
ransomNote.append('a');
}
}
class Demo3 extends Demo2{
@Override
public void method1(){}
}
报错
method1()' cannot override 'method1()' in 'demo.Demo2'; overridden method is final
final修饰的类不可以被继承
Cannot inherit from final 'demo.Demo2'
2.static
static什么作用?
1.为某特定数据类型或对象分配单一的存储空间,而与创建对象的数目无关。
就是在方法区中指定一块地址存储变量或者对象。
2.实现某个方法或属性与类而不是与对象关联起来,
就是不创建对象的情况下可以直接使用该变量。
3.transient
在对象序列化时候,在属性上加上transient,代表这个属性不被序列化。
如何序列化?
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Demo2 implements Serializable {
public int a;
transient public int b;
public static String s = "abc";
public static void main(String[] args) throws IOException {
Demo2 demo2 = new Demo2();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\图片\\test.text"));
objectOutputStream.writeObject(demo2);
}
}
啥是反序列化?
就是序列化的逆过程,从存储对象的文件中读取出来对象。
4.volatile
被volatile修饰的属性会保持对所有线程可见。
保证线程三要素中的可见性和有序性。并不保证原子性。所以并不是严格地保证线程安全。
关于volatile关键字 Java并发编程:volatile关键字解析 - Matrix海子 - 博客园 (cnblogs.com)
这个博文总结的很全面。