1、==与Equals区别
- ==
- 如果比较的是基本数据类型,那么比较的是变量的值
- 如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)
Equals
高内聚:系统的架构的完整尽可能少的依赖外部资源
- 单个系统的维护、运行等尽可能低的影响、依赖于外部其它系统
低耦合:系统内部各个模块间的依赖关系尽可能的低
Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。
Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
4、自动拆箱、装箱
装箱:自动将基本数据类型转换为包装器类型
- 拆箱:自动将包装器类型转换为基本数据类型 | 基本数据类型 | 包装器类型 | | —- | —- | | int(4字节) | Integer | | byte(1字节) | Byte | | short(2字节) | Short | | long(8字节) | Long | | float(4字节) | Float | | double(8字节) | Double | | char(2字节) | Character | | boolean(未定) | Boolean |
- Integer是int的包装类,int则是java的一种基本数据类型。
- Integer变量必须实例化后才能使用,int则不需要。
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
- Integer的默认值为null,int的默认值是0。
- int等基本类型的变量存储在栈中。
5、Overload重载和Override重写
Overload重载
定义:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即参数个数、参数类型或参数顺序不同。重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
- 方法名称必须相同;
- 参数列表必须不同,即参数个数、参数类型或参数顺序中任有一个不同。
- 方法的返回类型可以相同也可以不同,对此无限制。
- 若仅满足方法的返回类型不同,不属于方法重载。
Override重写
- 发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)。
- 子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)。
- 子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)。
-
6、接口和抽象类的区别
接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
- 类可以实现很多个接口,但是只能继承一个抽象类
- 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
- 抽象类可以在不提供接口方法实现的情况下实现接口。
- Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
- Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
- 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
7、同步方法和同步代码块的区别是什么?
在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
同步方法比同步代码块更高效,但是它们的功能是一样的。
8、final, finally, finalize的区别。
- final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
- finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
9、运行时异常与一般异常有何异同?
运行时异常(runtime exception):也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
- ConcurrentModificationException(并发修改异常), NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组下标越界),ClassNotFoundException(指定的类不存在)
- 出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run() 抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
- 一般异常(checked exception):checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。
10、String 、StringBuilder、StringBuffer的区别
在执行速度上:Stringbuilder->Stringbuffer->String
String是字符串常量
Stringbuffer是字符串变量
Stringbuilder是字符串变量
StringBuilder:线程非安全的
StringBuffer:线程安全的
如果操作少量的数据用String
单线程下操作大量的数据用StringBuilder
多线程下操作大量的数据用StringBuffer
字符明显是变化的就别用String
11、java八大基础数据类型及其长度
12、封装、继承、多态
13、try、catch、finally加上return的执行顺序
- 不管有木有出现异常,finally块中代码都会执行;
- 当try和catch中有return时,finally仍然会执行;
- finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
- finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
- 情况1:try{} catch(){}finally{} return;
- 显然程序按顺序执行。
- 情况2:try{ return; }catch(){} finally{} return;
- 程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;finally块之后的语句return,因为程序在try中已经return所以不再执行。
- 情况3:try{ } catch(){return;} finally{} return;
- 程序先执行try,如果遇到异常执行catch块,有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。无异常:执行完try再finally再return.
- 情况4:try{ return; }catch(){} finally{return;}
- 程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
- 情况5:try{} catch(){return;}finally{return;}
- 程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
- 情况6:try{ return;}catch(){return;} finally{return;}
- 程序执行try块中return之前(包括return语句中的表达式运算)代码;
- 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。
- 无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。