Java基础知识
转载出自大佬写hello world 也有bug ,并加上自己的一些理解
对一些基础知识的一个汇总
final关键字和static关键字
final关键字
final关键字一般用在三个地方:变量、方法、类。
- 基本数据类型的变量,数值一旦在初始化之后便不能更改
- 引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
- final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
- final修饰方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。
static关键字
static 关键字主要有以下四种使用场景:
修饰成员变量和成员方法:
被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用。
被static 声明的成员变量属于静态成员变量,静态变量存放在 Java 内存区域的方法区。
调用格式:类名.静态变量名
类名.静态方法名()
。
静态代码块:
静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行
(静态代码块—>非静态代码块—>构造方法)。
该类不管创建多少对象,静态代码块只执行一次。
静态内部类(static修饰类的话只能修饰内部类)
静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。
没有这个引用就意味着:
- 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
*静态导包(用来导入类中的静态资源,1.5之后的新特性):
格式为:import static
这两个关键字连用可以指定导入某个类中的指定静态资源
不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法
String、StringBuffer、StringBuilder
String: 字符串常量(线程安全)
StringBuffer: 字符串变量(线程安全)
StringBuilder: 字符串变量(非线程安全)
首先,String是引用数据类型。基本数据类型只有 8 个:byte、short、int、long、float、double、char、boolean。
通过String的源码得知,String是final修饰的,所以不可以被继承。
接下来看看String类实现的接口:
- java.io.Serializable:这个序列化接口仅用于标识序列化的语意。
- Comparable:这个compareTo(T 0)接口用于对两个实例化对象比较大小。
- CharSequence:这个接口是一个只读的字符序列。包括length(), charAt(int index), subSequence(int start, int end)这几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了改接口。
StringBuffer和StringBuilder
StringBuffer和StringBuilder都继承了AbstractStringBuilder。不同点是对于线程安全来说的。StringBuffer很多方法都有synchronized关键字修饰,所以它线程安全,而StringBuilder没有。由此也可得出,StringBuilder的运算效率比StringBuffer高。
int和Integer的区别
提到int和Integer的关系,大多数人都知道,Integer是int的包装类。从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
当我们给一个 Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf。
IntegerCache是Integer的内部类,源码太长就不贴出来了。大概意思就是,如果整型字面量的值在负128到 127之间,那么不会 new 新的 Integer对象,而是直接引用常量池中的 Integer 对象。
Exception和Error
Exception和Error的区别
-
Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型。
-
Exception和Error体现了Java平台设计者对不同异常情况的分类。
-
Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
-
Exception又分为可检查(checked)异常和不可检查(unchecked)异常。可检查异常在源代码里必须显式的进行捕获处理,这是编译期强制检查的一部分。不可检查时异常是指运行时异常,像NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
-
Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常的、不可恢复的状态。既然是非正常情况,不便于也不需要捕获。常见的比如OutOfMemoryError之类都是Error的子类。
-
throw和throws的区别
位置不同
- throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的是异常对象。
功能不同
- throws 用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先的处理方式;throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。也就是说 throw 语句独立存在时,下面不要定义其他语句,因为执行不到。
- throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
- 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
声明异常(throws)
//不捕获,而是声明该异常,交给调用者处理
public static void method() { public static void method2() throws Exception {
/*try-catch块捕获异常*/ if(5 > 3) {
if(5 > 3) { throw new Exception(); //抛出异常
try { }
throw new Exception(); //抛出异常 }
} catch (Exception e) {
e.printStackTrace();//捕获异常后的处理
}
}
}
//若声明多个异常,则使用逗号分割
public static void method() throws IOException, FileNotFoundException{
//something statements
}
抛出异常(throw)
如果代码可能会引发某种错误,可以创建一个合适的异常类实例并抛出它,这就是抛出异常。如下所示:
public static double method(int value) {
if(value == 0) {
throw new ArithmeticException("参数不能为0"); //抛出一个运行时异常
}
return 5.0 / value;
}
大部分情况下都不需要手动抛出异常,因为Java的大部分方法要么已经处理异常,要么已声明异常。所以一般都是捕获异常或者再往上抛。
&和&&的区别
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算是因为,如果**&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。**