1、Java中的两种异常类型是什么?他们有什么区别?
- 两种类型分别是:受检查异常(checked)和不受检查异常(unchecked)
- 两者的区别:
- 不受检查的异常:不需要在方法和构造函数上进行声明异常。如果在方法或者构造函数的执行上抛出异常,不受检查的异常也可以传播到方法和构造函数的外边
- 受检查的异常:必须要用到throws语句,在方法或者构造函数上声明异常。
2、abstract class和interface有什么区别?
- 抽象类和接口都不能被实例化。要想实例化,需要指向实现所有抽象方法或者接口方法的子类对象或者类对象。
- 抽象类和接口的方法,必须被子类或者类全部实现,如果没有该类只能是抽象类
- 抽象类是被子类继承,接口是被类实现。
- 接口只能做方法申明;抽象类中可以做方法申明,也可以做方法实现。
- 接口内的变量只能为公共的静态常量。抽象类的变量没有具体要求。
- 接口方法只能申明,不能实现,接口是设计的结果,抽象类是重构的结果。
- 抽象类可以没有抽象方法。
- 如果一个类有抽象方法,这个类只能为抽象类
- 抽象方法要被实现,不能是静态和私有的。
- 接口可以继承接口,并且可以多继承接口,但类只能单根继承。
3、int 和 Integer 有什么区别
java 提供了两种不同的类型:引用类型和原始类型(内置类类型)
- Int是java的原始数据类型(基本数据类型),Integer是java为int提供的封装类。(包装类)
- Interger变量必须实例化才能够使用,而变量不需要。
- Interger实际上是对象的引用,使用的时候会创建一个对象,通过指针指向该对象;而int直接存储数据。
- Interger的默认值为null,int的默认值为0.
4、阐述静态变量和实例变量的区别?
- 语法上: 静态变量需要static修饰,实例变量不需要。
- 静态变量从属于类,实例对象从属于对象
- 实例变量必须创建实例对象后,才会被分配空间,才能够使用。
- 静态变量也为类变量,只要程序运行,生成类的字节码,就会被分配空间,就可以使用。
- 实例变量必须创建对象后,通过这个对象来使用;静态变量直接类名来引用。
5、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别
- Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。(这个观点,个人认为是有所缺失的。应该是采用equals方法进行区别的)
- equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
- equals()方法时判断的仅仅是两个值是否相同,不牵涉内存地址。
- ==操作符专门用来比较两个变量的值是否相等,也就是比较值的相同和内存地址是否一致。
6、异常处理的时候,finally代码块的重要性是什么?
- 首先: 无论是否抛出异常,finally代码块总是会被执行。
- 就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。
- finally代码块主要用来释放资源,比如:I/O缓冲区,数据库连接。
7、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
- Java虚拟机是一个可以执行Java字节码的虚拟机进程。(Java源文件被编译成能被Java虚拟机执行的字节码文件。)
- 因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。
- 正是因为有JVM的存在,java被称为平台无关的编程语言。
8、Overload和Override的区别?
- Override(重写):
- 重写方法的名字要和被重写的方法名字一样,才能覆盖。
- 返回值类型需要一致。
- 子类方法不能抛出比父类方法更多的异常(子类可以不抛出异常)。
- 被final修饰的方法,不能被重写。
- 针对于继承来说,父类的方法的修饰符为private,则子类无法进行重写。
- Overload(重载)
- 重载的使用需要通过不同的参数个数和参数数据类型,进行区分。具体的有:不同的参数类型,不同的参数个数,不同的参数顺序(参数类型不同)。
- 不能通过访问权限、返回值类型、抛出异常的不同进行重载。
- 重载是发生在同一个类中,不同方法之间的现象。
9、什么是值传递和引用传递?
- 值传递:指的是在方法调用时,传递的参数是按值的拷贝传递。传递的是值的拷贝,不会影响到值的本身。
- 引用传递:指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是变量所对应的内存空间的地址。进行修改的时候,会影响到值本身。
10、JDK和JRE的区别是什么?
- JDK:(Java Development Kit)Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。
- JRE:(Java Runtime Environment)Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
扩增一个JVM
- JVM :(Java Virtual Machine)Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class
文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。
三者的关系:JDK>JRE>JVM。
11、HashMap和Hashtable有什么区别?
- 相同点:
- HashMap和Hashtable都实现了Map接口
- 不同点
- HashMap允许一个键为null和值是null;而Hashtable不允许键或者值是null。
- Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
- Hashtable效率低,安全性高,而HashMap效率高,安全性低。
- HashMap包含可供应用迭代的键的集合,因此,HashMap是快速失败的。
- 另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
12、throw和throws有什么区别?
- throws是声明异常(在方法后边声明),throw是抛出异常(方法体内使用)。
- throws出现在方法函数头,throw出现在函数体
- throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
- 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。(仅仅是抛出异常,并不会去处理)