1. final、finally、finalize三个关键字的区别是()
A final是修饰符(关键字)可以修饰类、方法、变量
B finally在异常处理的时候使用,提供finally块来执行任何清除操作
C finalize是方法名,在垃圾收入集器将对象从内存中清除出去之前做必要的清理工作
D finally和finalize一样都是用于异常处理的方法
正确答案:ABC
解析:
final:可用来定义变量、方法传入的参数、类、方法。
finally:只能跟在try/catch语句中,并且附带一个语句块,表示最后执行。
finalize:是垃圾回收器操作的运行机制中的一部分,进行垃圾回收器操作时会调用finalize方法,因为finalize方法是object的方法,所以每个类都有这个方法并且可以重写这个方法,在这个方法里实现释放系统资源及其他清理工作,JVM不保证此方法总被调用。
2. 下面哪些写法能在 java8 中编译执行()
A dir.listFiles((File f)->f.getName().endsWith(“.Java”));
B dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
C dir.listFiles((_.getName().endsWith(“.Java”)));
D dir.listFiles( f->f.getName().endsWith(“.Java”));
正确答案:AD
解析:
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:
(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
(2) 箭头(→)。必须通过英文中画线和大于符号组成。
(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。
由此可见,应该是A和D正确。
3. 在Java中下面Class的声明哪些是错误的?
A public abstract final class Test { abstract void method(); }
B public abstract class Test { abstract final void method(); }
C public abstract class Test { abstract void method() { } }
D public class Test { final void method() { } }
正确答案:ABC
解析:
A.被final修饰的类为最终类,不能被继承,而类前面如果有abstract修饰,则为抽象类,抽象类是需要被继承才有意义,因此abstract和final矛盾,选项错误。
B.被final修饰的方法为最终方法,不能被继承,而方法前面如果有abstract修饰,则为抽象方法,抽象方法是需要被继承才有意义,因此abstract和final矛盾,选项错误。
C.抽象类中的抽象方法不能有具体的实现,而选项中的 abstract void method() {}中{}代表有具体的实现,因此此处应该为abstract void method();
注意: abstract 不能与private、static、final或native并列修饰同一个方法。
4. 以下有关构造方法的说法,正确的是:()
A 一个类的构造方法可以有多个
B 构造方法在类定义时被调用
C 构造方法只能由对象中的其他方法调用
D 构造方法可以和类同名,也可以和类名不同
正确答案:A
解析:
A选项是函数重载的体现,一个类可以有多个参数列表不同的构造方法。A选项正确。
B选项,构造方法在对象被初始化时调用。B选项错误。
C选项,构造方法只能在对象被初始化时调用,不能由其他方法调用。
D选项,构造方法必须与类名相同。
5. 能单独和finally语句一起使用的块是( )
A try
B catch
C throw
D throws
正确答案:A
6. instanceof运算符能够用来判断一个对象是否为:
A 一个类的实例
B 一个实现指定接口的类的实例
C 全部正确
D 一个子类的实例
正确答案:C
解析:
instance是java的二元运算符,用来判断他左边的对象是否为右面类(接口,抽象类,父类)的实例
7. jre 判断程序是否执行结束的标准是()
A 所有的前台线程执行完毕
B 所有的后台线程执行完毕
C 所有的线程执行完毕
D 和以上都无关
正确答案:A
解析:
main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。
前台线程和后台线程的区别和联系:
1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
说明:
应用程序的主线程以及使用Thread构造的线程都默认为前台线程
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序
8. 下面的switch语句中,x可以是哪些类型的数据:()
switch(x)
{
default:
System.out.println("Hello");
}
A long
B char
C float
D byte
E double
F String
正确答案:BDF
解析:
以java8为准,switch支持10种类型
基本类型:byte char short int
对于包装类 :Byte,Short,Character,Integer String enum
2、实际只支持int类型 Java实际只能支持int类型的switch语句,那其他的类型时如何支持的
a、基本类型byte char short 原因:这些基本数字类型可自动向上转为int, 实际还是用的int。
b、基本类型包装类Byte,Short,Character,Integer 原因:java的自动拆箱机制 可看这些对象自动转为基本类型
c、String 类型 原因:实际switch比较的string.hashCode值,它是一个int类型 如何实现的,网上例子很多。此处不表。
d、enum类型 原因 :实际比较的是enum的ordinal值(表示枚举值的顺序),它也是一个int类型 所以也可以说 switch语句只支持int类型