final、static、abstract
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不能修饰局部变量的原因。
final
- final 类不能被继承(final 类内的 method 自动为 final,但不包括属性)
- final 方法可以被继承但不能被 override
- final 属性不能被重新赋值(可以被继承,但不可以修改)定义时可以初始化,也可以不初始化,而在语句块中初始化或者构造函数中初始化(最晚要在构造函数中初始化,只能初始化一次),final 定义的成员变量可以在代码块 (类变量则静态代码块,实例变量普通代码块) 里初始化
- final 属性只能人为赋值一次,继承与父类的 final 属性不能被修改
- final 可以修饰局部变量表示局部常量(方法级局部变量(形参及局部变量,方法体级局部变量)或块级局部变量)
abstract
- abstract 类不能实例化对象
- abstract 类可以不包含 abstract 方法,但是只要有一个 abstract 方法那么该类必须为 abstract 类
- abstract 方法没有方法体,需要被 override
- abstract 类的子类要么实现其父类全部的 abstract method,要么也是一个 abstract 类
- abstract 不能修饰属性
- abstract 不能修饰局部变量(方法级局部变量(形参级局部变量,方法体级局部变量)或块级局部变量)
final 、abstract和static之间的关联
- 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.线程安全性
2.1 String(线程安全)
不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。String 就是一种典型的不可变类。(使用字符串自带的函数改变string内容都是相当于创建一个新的string,即 new String)。不可变类的主要用途是在多线程环境下确保对象的线程安全。
2.2 StringBuffer(线程安全的)
StringBuffer 中大部分方法由 synchronized 关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。
2.3 StringBuilder(非线程安全)
StringBuilder 的方法不能保证线程安全性。StringBuilder 是 JDK1.5 新增的,该类提供一个与 StringBuffer 兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
3.总结
-
String:适用于少量的字符串操作。
-
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
-
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。
其他常见关键字
volatile 关键字
volatile 是 java 中的一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。volatile具有如下两个特性:
- 可见性,指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。
- 禁止指令重排序优化,大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile 关键字就可以从语义上解决这个问题。
native关键字
native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如 C 和 C++)实现的文件中。Java 语言本身不能对操作系统底层进行访问和操作,但是可以通过 JNI 接口——Java Native Interface (Java 本地接口)调用其他语言来实现对底层的访问。
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
基础知识概念
1.java 基本类型的默认值和取值范围
- 整数类型 byte(1 个字节)short(2 个字节)int(4 个字节)long(8 个字节)
- 字符类型 char(2 个字节)
- 浮点类型 float(4 个字节)double(8 个字节)
2.Java 标识符有如下命名规则
- 由 26 个英文字母大小写,数字:0-9 符号:_ $ ¥ 组成
- 标识符应以字母、_ 、$ 开头。
- 标识符不能是关键字。
3.java 中 IO 流
-
按照流的流向分,可以分为输入流和输出流;
-
按照操作单元划分,可以划分为字节流和字符流;
-
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
-
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
4.字符流和字节流的区别
字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:
-
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
-
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
-
字节流:一次读入或读出是8位二进制。通过字节的形式一个字节一个字节或者字节数组来操作文件中内容,可以操作一切文件。
-
字符流:一次读入或读出是16位二进制。通过单个字符或者是字符数组的形式来操作文件的,存在一定的局限性,是专门用于对文本文件操作的,默认的版本为GBK
5.JRE和JDK区别
-
JRE:Java Runtime Environment( java 运行时环境)。即 java 程序的运行时环境,包含了 java 虚拟机,java 基础类库。
-
JDK:Java Development Kit( java 开发工具包)。即 java 语言编写的程序所需的开发工具包。JDK 包含了 JRE,同时还包括 java 源码的编译器 javac、监控工具 jconsole、分析工具 jvisualvm 等。