Java概念性问题11

以下内容来自学习整理:

下面哪些属于JSP内置对象及方法?ABCD

A request
B out
C application
D config
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对象)


Servlet与JSP九大内置对象的关系

JSP对象 怎样获得   
out->response.getWriter   
request ->Service方法中的req参数   
response ->Service方法中的resp参数   
session ->request.getSession   
application->getServletContext   
exception ->Throwable   
page  ->this   
pageContext  ->PageContext   
Config ->getServletConfig
以下哪几种方式可用来实现线程间通知和唤醒:( AC)

A Object.wait/notify/notifyAll
B ReentrantLock.wait/notify/notifyAll
C Condition.await/signal/signalAll
D Thread.wait/notify/notifyAll

wait()、notify()和notifyAll()是Object类中的方法;Condition是在java1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、 notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。

Which four statements are true ?ACDG

class A {}
class B extends A {}
class C extends A {}
class D extends B {}
A The type List<.A>is assignable to List.
B The type List<.B>is assignable to List<.A>.
C The type List<.Object>is assignable to List<.?>
D The type List<.D>is assignable to List<.?extends B>.
E The type List<.?extends A>is assignable to List<.A>.
F The type List<.Object>is assignable to any List reference.
G The type List<.?extends B>is assignable to List<.?extends A>.

耐心看完,保证能懂这道题!

  1. 只看尖括号里边的!!明确点和范围两个概念
  2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<.A>,List<.B>,List<.Object>
  3. 如果尖括号里面带有问号,那么代表一个范围,<.? extends A>代表小于等于A的范围,<.? super A>代表大于等于A的范围,<.?>代表全部范围
  4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
  5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
  6. List<.?>和List 是相等的,都代表最大范围
    7.补充:List既是点也是范围,当表示范围时,表示最大范围
public static void main(String[] args) {
        List<A> a;
        List list;
        list = a;   //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内
        List<B> b;
        a = b;      //B错,点之间不能相互赋值
        List<?> qm;
        List<Object> o;
        qm = o;     //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内
        List<D> d;
        List<? extends B> downB;
        downB = d;  //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中
        List<?extends A> downA;
        a = downA;  //E错,范围不能赋值给点
        a = o;      //F错,List<Object>只是一个点
        downA = downB;  //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛
    }

泛型只是在编译期保证对象类型相同的技术。 真正在代码的运行期,jvm会擦出泛型的存在。 所以我们可以利用反射技术为一个已指定泛型的集合添加一个不符合泛型要求的元素,因为反射的生效期在运行期,泛型无法进行拦截。 因此,泛型指定的元素不具有继承的特性。不能将泛型中的派生类类型复制给基类类型。
因此BEF错误。
从而出现了通配符的技术,为了解决在泛型中不能像正常JAVA类中的继承关系。 我个人的理解是通配符的继承就是为了弥补泛型在继承关系上面的缺陷而诞生的。 因此集合可以使用通配符来描述继承关系,但不能直接使用指定泛型来描述。 通配符的方式可以正确的描述带泛型集合的继承关系。
因此CDG正确。


大概的观点就是:java数组具有协变性,而java集合不是协变的;
什么意思呢?我举几个例子:

  1. 假设有一个函数 fun(Animal animal),如果我们传入一个Dog d 对象进去,编译器是不会报错的,这是多态的概念;
  2. 假设有一个函数 fun(Animal[] animals),如果我们传如一个Dog[] dogs数组进去,编译器也不会报错,这就是数组的协变性;
  3. 假设有一个函数 fun(List<.Animal> animal),如果我们传如一个List <.Dog> dog 集合进去,编译器就会报错了,这就是集合泛型的不变性;

那么该怎么办呢?我们可以将泛型改成这样 fun (List <.? extends Animal> ),这样之后,当我们再传入一个List <.Dog> dog 集合进去,编译器就就不会报错了。也就是说可以传入包含Animal的子类的List了。


?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
? extends E:向下限定,E及其子类
? super E:向上限定,E及其父类

What results from the following code fragment?C
int i = 5;
int j = 10;
System.out.println(i + ~j);

A Compilation error because”~”doesn’t operate on integers
B -5
C -6
D 15
公式-n=n+1可推出n=-n-1,所以~10=-11再加5结果为-6
//或者按位取反后求出负数源码所对应的十进制值在相加

一道题

http://blog.csdn.net/zhumintao/article/details/53818972

如果希望监听TCP端口9000,应该怎样创建socket?B

A new Socket(“localhost”,9000);
B new ServerSocket(9000);
C new Socket(9000);
D new ServerSocket(“localhost”,9000);

ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket。
Socket(InetAddress address ,int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口。
socket和servletSocket的交互如下图所示:
http://www.cnblogs.com/rond/p/3565113.html
这里写图片描述

下列关于JAVA多线程的叙述正确的是(C)

A 调用start()方法和run()都可以启动一个线程
B CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程
C Callable类的call()方法可以返回值和抛出异常
D 新建的线程调用start()方法就能立即进行运行状态

CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫做同步点时被阻塞),直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。 CountDownLatch允许一个或多个线程等待其他线程操作完成。
关于countDownLatch与cyclicBarrier相关知识可以参考这篇博客http://www.jianshu.com/p/424374d71b67

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值