Java日常练习题,每天进步一点点(12)
作者:牛哄哄的柯南
承蒙各位厚爱,我们一起每天进步一点点!(鼠标选中空白处查看答案)
1、Which is the return type of the method main()?
正确答案: B
int
void
Boolean
static
题解:
main()方法的返回类型是什么?
public static void main(String[] args){
//代码段
}
2、java中用()字指明继承关系.用()关键字指明对接口的实现。
正确答案: B
implements extends
extends implements
extend implement
implement extend
题解:
考查关键字
extends表继承父类
implements表是实现接口
3、顺序执行下列程序语句后,则b的值是()
String a=“Hello”;
String b=a.substring(0,2);
正确答案: C
Hello
Hel
He
null
题解:
substring[0,2),左闭右开(包含左边的起始点,不包含结束点)
4、下面程序的输出是什么?
package algorithms.com.guan.javajicu; public class TestDemo { public static String output = ””; public static void foo(inti) { try { if (i == 1) { throw new Exception(); } } catch (Exception e) { output += “2”; return ; } finally { output += “3”; } output += “4”; } public static void main(String[] args) { foo(0); foo(1); System.out.println(output); } }
正确答案: B
342
3423
34234
323
题解:
首先是foo(0),在try代码块中未抛出异常,finally是无论是否抛出异常必定执行的语句,
所以 output += “3”;然后是 output += “4”;
执行foo(1)的时候,try代码块抛出异常,进入catch代码块,output += “2”;
前面说过finally是必执行的,即使return也会执行output += “3”
由于catch代码块中有return语句,最后一个output += “4”不会执行。
所以结果是3423
5、下面属于JSP内置对象的是?
正确答案: A B C D
out对象
response对象
application对象
page对象
题解:
JSP内置对象有:
1.request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
4.out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
6、关于抽象类与接口,下列说法正确的有?
正确答案: A C
优先选用接口,尽量少用抽象类
抽象类可以被声明使用,接口不可以被声明使用
抽象类和接口都不能被实例化。
以上说法都不对
题解:
java只是单继承,但是可以实现多个接口,继承的耦合性太强,java推荐高内聚低耦合的设计思路,不推荐使用继承。在用继承的情况下,如果还必须要继承另外的接口会很麻烦,尽量用接口,这样在你必须要用到继承的时候就可以用了。抽象类和接口都不能被实例化。接口没有构造方法,不能被实例化,但是抽象方法可以有构造方法,不过不是用来实例化对象的,是用来初始化的。
1.一个子类只能继承一个抽象类,但能实现多个接口
2.抽象类可以有构造方法,接口没有构造方法
3.抽象类可以有普通成员变量,接口没有普通成员变量
4.抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
5.抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法
6.抽象类可以有静态方法,接口不能有静态方法
7.抽象类中的方法可以是public、protected;接口方法只有public
7、下面哪些写法能在 java8 中编译执行()
正确答案: A D
dir.listFiles((File f)->f.getName().endsWith(“.Java”));
dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
dir.listFiles((_.getName().endsWith(“.Java”)));
dir.listFiles( f->f.getName().endsWith(“.Java”));
题解:
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:
(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
(2) 箭头(→)。必须通过英文中画线和大于符号组成。
(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。
由此可见,应该是A和D正确。
8、Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:( )
正确答案: A D F
A Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下
B 通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法
C 通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成员
D Java反射机制提供了字节码修改的技术,可以动态的修剪一个类
E Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多
F Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率
题解:
A:java.lang.reflect包中的Field、Method、Constructor,分别用于描述类的与、方法和构造器。A中的Class类在java.lang中,错;
B:动态代理可以通过接口与类实现,通过反射形成新的代理类,这个代理类增强了原来类的方法。对;
C:反射可以强制访问private类型的成员,对;
D:反射并不能对类进行修改,只能对类进行访问,错;
E:反射机制对永生堆要求较多,对;
F:即使使用缓存,反射的效率也比调用类的方法低,错;
9、以下哪种JAVA得变量声明方式可以避免程序在多线程竞争情况下读到不正确的值( )
正确答案: A B
volatile
static volatile
synchronized
static
题解:
synchronized不是修饰变量的,它修饰方法或代码块或对象
synchronized修饰的对象有几种:
1、修饰一个类:其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象;
2、修饰一个方法:被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
3、修饰一个静态的方法:其作用的范围是整个方法,作用的对象是这个类的所有对象;
4、修饰一个代码块:被修饰的代码块称为同步语句块,其作用范围是大括号{}括起来的代码块,作用的对象是调用这个代码块的对象;
首先需要理解线程安全的两个方面:执行控制和内存可见。
执行控制的目的是控制代码执行(顺序)及是否可以并发执行。
内存可见控制的是线程执行结果在内存中对其它线程的可见性。根据Java内存模型的实现,线程在具体执行时,会先拷贝主存数据到线程本地(CPU缓存),操作完成后再把结果从线程本地刷到主存。
synchronized关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被synchronized关键字保护的代码块无法被其它线程访问,也就无法并发执行。更重要的是,synchronized还会创建一个内存屏障,内存屏障指令保证了所有CPU操作结果都会直接刷到主存中,从而保证了操作的内存可见性,同时也使得先获得这个锁的线程的所有操作,都happens-before于随后获得这个锁的线程的操作。
volatile关键字解决的是内存可见性的问题,会使得所有对volatile变量的读写都会直接刷到主存,即保证了变量的可见性。这样就能满足一些对变量可见性有要求而对读取顺序没有要求的需求。
使用volatile关键字仅能实现对原始变量(如boolen、 short 、int 、long等)操作的原子性,但需要特别注意, volatile不能保证复合操作的原子性,即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。
对于volatile关键字,当且仅当满足以下所有条件时可使用:
1.对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
2.该变量没有包含在具有其他变量的不变式中。
10、下列哪些操作会使线程释放锁资源?
正确答案: B C
sleep()
wait()
join()
yield()
题解:
1.sleep()方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
2.wait()方法
wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”),通过wait()来通知对象内置的monitor对象释放,而且事实上因为这涉及对硬件底层的操作,所以wait()方法是native方法,底层是用C写的。
3.join()方法
join()等待该线程终止。
等待调用join方法的线程结束,再继续执行。
join()有资格释放资源其实是通过调用wait()来实现的(join()源码中调用了wait())
主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束。如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到 join() 方法
4.yield()方法
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
答案汇总:
1、正确答案: B
2、正确答案: B
3、正确答案: C
4、正确答案: B
5、正确答案: A B C D
6、正确答案: A C
7、正确答案: A D
8、正确答案: A D F
9、正确答案: A B
10、正确答案: B C
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!