有些关键字在之前的内容已经提到过,这里做一个总结
一、final、static、abstract
1.static 修饰符
被 static 关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
- static 作用于代码块:称作静态代码块
- static 方法(类方法)只能访问 static 方法,不能访问非 static 方法
- static 方法只能访问 static field, 不能访问非 static field
- static方法不能访问本类中的非static变量
- 非 static 方法可以访问 static fields 和 static methods
- static method 的两种访问方式 oject.method 和 class.method, 非 static method 只有 object.method 一种访问方式
- static method 中不支持 this 和 super
- static 不可以作为局部变量(局部变量包括:函数级局部变量和块级局部变量)
- static属性放在静态空间,不会在程序运行时被释放,它永远占着内存直到程序终止,这也是static不能修饰局部变量的原因。
2.final 修饰符
- final 类不能被继承(final 类内的 method 自动为 final,但不包括属性)
- final 方法可以被继承但不能被 override
- final 属性不能被重新赋值(可以被继承,但不可以修改)定义时可以初始化,也可以不初始化,而在语句块中初始化或者构造函数中初始化(最晚要在构造函数中初始化,只能初始化一次),final 定义的成员变量可以在代码块 (类变量则静态代码块,实例变量普通代码块) 里初始化
- final 属性只能人为赋值一次,继承与父类的 final 属性不能被修改
- final 可以修饰局部变量表示局部常量(方法级局部变量(形参及局部变量,方法体级局部变量)或块级局部变量)
3.abstract 修饰符
- abstract 类不能实例化对象
- abstract 类可以不包含 abstract 方法,但是只要有一个 abstract 方法那么该类必须为 abstract 类
- abstract 方法没有方法体,需要被 override
- abstract 类的子类要么实现其父类全部的 abstract method,要么也是一个 abstract 类
- abstract 不能修饰属性
- abstract 不能修饰局部变量(方法级局部变量(形参级局部变量,方法体级局部变量)或块级局部变量)
4.final、static、abstract 之间的关系
- final、abstract 不能共存(无论在类、方法、属性、局部变量上都不能共存)
- static、abstract 不能共存(无论在类、方法、属性、局部变量上都不能共存)
- 可以出现 final static field(该类成员属性不能被修改)
- 可以出现 final static method(该类成员方法不能被 override)
- 只有final能修饰局部变量,static可以修饰成员变量不能修饰局部变量,abstract不能修饰属性。
二、String、StringBuffer、StringBuilder
1.运算速度比较(通常情况下):StringBuilder > StringBuffer > String
String 是 final 类不能被继承且为字符串常量,而 StringBuilder 和 StringBuffer 均为字符串变量。String 对象一旦创建便不可更改,而后两者是可更改的,它们只能通过构造函数来建立对象,且对象被建立以后将在内存中分配内存空间,并初始保存一个 null,通过 append 方法向 StringBuffer 和 StringBuilder 中赋值。
2.线程安全性
String(线程安全)
不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。
String 就是一种典型的不可变类。(使用字符串自带的函数改变string内容都是相当于创建一个新的string,即 new String)。不可变类的主要用途是在多线程环境下确保对象的线程安全。
StringBuffer(线程安全的)
StringBuffer 中大部分方法由 synchronized 关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。
StringBuilder(非线程安全)
StringBuilder 的方法不能保证线程安全性。StringBuilder 是 JDK1.5 新增的,该类提供一个与 StringBuffer 兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
3.总结
-
String:适用于少量的字符串操作。
-
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
-
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。
三、其他常见关键字
1.Java 中的 volatile 关键字的功能
volatile 是 java 中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入 volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器 失去大量优化的机会。
- 可见性,指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。
- 禁止指令重排序优化,大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile 关键字就可以从语义上解决这个问题。
注意,禁止指令重排优化这条语义直到 jdk1.5 以后才能正确工作。此前的 JDK 中即使将变量声明为 volatile 也无法完全避免重排序所导致的问题。
2.native关键字
native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如 C 和 C++)实现的文件中。Java 语言本身不能对操作系统底层进行访问和操作,但是可以通过 JNI 接口——Java Native Interface (Java 本地接口)调用其他语言来实现对底层的访问。
3.finalize方法
java 技术允许使用 finalize () 方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是在垃圾收集器在确定了,被清理对象没有被引用的情况下调用的。
finalize () 是 Object 中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它 finalize () 方法,让此对象处理它生前的最后事情(这个对象可以趁这个时机挣脱死亡的命运)。
4.transient
Java 在序列化时不会实例化 static 变量和 transient 修饰的变量,因为 static 代表类的成员,transient 代表对象的临时数据,被声明这两种类型的数据成员不能被序列化
5.Java的保留字和关键字
-
goto 和 const 是保留字也是关键字。
-
Java 关键字列表 (依字母排序 共 50 组):
abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while -
保留字列表 (依字母排序 共 14 组),Java 保留字是指现有 Java 版本尚未使用,但以后版本可能会作为关键字使用:
byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null
【Java 面试那点事】
这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!
这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】
面试路上,你不孤单!