一月八号面试题整理
1. 内部类可以引用它的包含类的成员吗?有没有什么限制?
- 完全可以。如果不是静态内部类,那没有什么限制!
- 如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员
- 静态嵌套类
- 在一个类的内部定义另一个类, 这种类称为嵌套类(nested classes),它有两种类型:
- 静态嵌套类和非静态嵌套类.静态嵌套类使用很少,
- 最重要的是非静态嵌套类, 也即是被称作为内部类(inner).
- 在一个类的内部定义另一个类, 这种类称为嵌套类(nested classes),它有两种类型:
2.如何把一段逗号分割的字符串转换成一个数组?
- 用正则表达式,代码大概为:String[] result = orgStr.split(“,”, -1);
- 用StingTokenizer ,用于分隔字符串。
- 最笨的办法,用String.indexOf()
3. 数组有没有length()这个方法?String有没有length()这个方法?
- 数组没有length()这个方法,有length的属性。
- String中有length()这个方法。
4. 下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”;
- Javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
- 题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s = “a” + “b” + “c” + “d”;
System.out.println(s == “abcd”);
最终打印的结果应该为true。
5.final, finally, finalize的区别?
- final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
- finally是异常处理语句结构的一部分,表示总是执行。
- finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
6.运行时异常与一般异常有何异同?
- 相同
- 异常表示程序运行过程中可能出现的非正常状态,他们都属于Exception类及其子类。
- 不同
- 定义不同
- 运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。
- 一般异常是daoRuntimeException以外的异常
- 处理方法不同
- 运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
- 一般异常,JAVA编译器强制要求用户必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。
- 发生原因不同
- 运行时异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
- 一般异常可能是你的代码编写可能有潜在问题
- 定义不同
7.error和exception有什么区别?
- Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。
- Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。
8.Java中的异常处理机制的简单原理和应用?
- 异常是指java程序运行时(非编译)所发生的非正常情况或错误。当java程序违反了java语义规则时,java虚拟机就会将发生的错误表示为一个异常。
- 应用
- 针对可能出现异常的语句进行try-catch
9.请写出你最常见到的5个runtime exception?
- ArithmeticException——由于除数为0引起的异常;
- ArrayStoreException——由于数组存储空间不够引起的异常;
- NegativeArraySizeException—一数组长度是负数,则产生异常;
- IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;
- ClassNotFoundException——未找到指定名字的类或接口引起异常;
- FileNotFoundException——未找到指定文件引起异常;
- IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;
10.启动一个线程是用run()还是start()?
- 启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,
- run()方法是该线程所关联的执行代码。