有些关键字在之前的内容已经提到过,这里做一个总结

一、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 相关知识】,并且【短时间在面试方面有跨越式提升】

面试路上,你不孤单!
Java常见关键字

相关文章: