写在前面

写博客的目的主要是对Java知识进行一个整理,复习。本文内容并非纯原创,都是整合各类资源而来。

final关键字和static关键字

  • final关键字

final关键字一般用在三个地方:变量、方法、类

  1. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
  2. 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
  3. 使用final修饰方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。
  • static关键字

static 关键字主要有以下种使用场景:

  1. 修饰成员变量和成员方法: 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 类名.静态方法名()
  2. 静态代码块: 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次。
  3. 静态内部类(static修饰类的话只能修饰内部类): 静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
  4. 静态导包(用来导入类中的静态资源,1.5之后的新特性): 格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。

String、StringBuffer、StringBuilder

String: 字符串常量(线程安全)
StringBuffer: 字符串变量(线程安全)
StringBuilder: 字符串变量(非线程安全)
首先,String是引用数据类型。基本数据类型只有 8 个:byte、short、int、long、float、double、char、boolean。
Java中基础知识
通过String的源码得知,String是final修饰的,所以不可以被继承。
接下来看看String类实现的接口:
1. java.io.Serializable:这个序列化接口仅用于标识序列化的语意。
2. Comparable:这个compareTo(T 0)接口用于对两个实例化对象比较大小。
3. CharSequence:这个接口是一个只读的字符序列。包括length(), charAt(int index), subSequence(int start, int end)这几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了改接口。
StringBufferStringBuilder
Java中基础知识
Java中基础知识
StringBuffer和StringBuilder都继承了AbstractStringBuilder。不同点是对于线程安全来说的。StringBuffer很多方法都有synchronized关键字修饰,所以它线程安全,而StringBuilder没有。由此也可得出,StringBuilder的运算效率比StringBuffer高。Java中基础知识

int和Integer的区别

提到int和Integer的关系,大多数人都知道,Integer是int的包装类。从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
当我们给一个 Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf。
Java中基础知识
IntegerCache是Integer的内部类,源码太长就不贴出来了。大概意思就是,如果整型字面量的值在负128127之间,那么不会 new 新的 Integer对象,而是直接引用常量池中的 Integer 对象。

Exception和Error

  • Exception和Error的区别

  1. Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型。
  2. Exception和Error体现了Java平台设计者对不同异常情况的分类。
    1. Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
    2. Exception又分为可检查(checked)异常和不可检查(unchecked)异常。可检查异常在源代码里必须显式的进行捕获处理,这是编译期强制检查的一部分。不可检查时异常是指运行时异常,像NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
    3. Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常的、不可恢复的状态。既然是非正常情况,不便于也不需要捕获。常见的比如OutOfMemoryError之类都是Error的子类。

Java中基础知识

  • throw和throws的区别

位置不同
  1. throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的是异常对象。
功能不同
  1. throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
  2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
  3. 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

&和&&的区别

&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。

相关文章: