Java学习记录——错题总结(十八)

第一套

1.Java数据库连接库JDBC用到哪种设计模式?
正确答案: B 你的答案: A (错误)
生成器
桥接模式
抽象工厂
单例模式

桥接模式:
定义 :将抽象部分与它的实现部分分离,使它们都可以独立地变化。
意图 :将抽象与实现解耦。
桥接模式所涉及的角色

  1. Abstraction :定义抽象接口,拥有一个Implementor类型的对象引用
  2. RefinedAbstraction :扩展Abstraction中的接口定义
  3. Implementor :是具体实现的接口,Implementor和RefinedAbstraction接口并不一定完全一致,实际上这两个接口可以完全不一样Implementor提供具体操作方法,而Abstraction提供更高层次的调用
  4. ConcreteImplementor :实现Implementor接口,给出具体实现
    Jdk中的桥接模式:JDBC
    JDBC连接 数据库 的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不动,原因就是JDBC提供了统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了

2.下面有关java的instanceof、?、&、&&说法正确的有?
正确答案: A B C D 你的答案: A B C (错误)
instanceof 可用来判断某个实例变量是否属于某种类的类型。
“?:” 三目运算符
&在逻辑运算中是非短路逻辑与,在位运算中是按位与
&& 逻辑运算:逻辑与

值得一提的是:
1、三目运算是右结合的。
2、&不短路,&&短路。

3.Which statement declares a variable a which is suitable for referring to an array of 50 string objects?
下面哪个Java语句声明了一个适合于创建50个字符串对象数组的变量?
正确答案: B C F 你的答案: C D E F (错误)
char a[][];
String a[];
String[] a;
Object a[50];
String a[50];
Object a[];

BCF
在java 中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度。
如下,1,2,3可以通过编译,4,5不行。而String是Object的子类,所以上述BCF均可定义一个存放50个String类型对象的数组。

  1. String a[]=new String[50];
  2. String b[];
  3. char c[];
  4. String d[50];
  5. char e[50];

第二套

1.如果一个接口Cow有个方法drink(),有个类Calf实现接口Cow,则在类Calf中正确的是? ( )

正确答案: C 你的答案: D (错误)
void drink() { …}
protected void drink() { …}
public void drink() { …}
以上语句都可以用在类Calf中

1、接口是一种约束和规范,是一种更加更高级的抽象类,抽象类的方法必须是公开的,因为要给人继承和使用啊,不用public,别人怎么看得到,所以在接口实现时,定义的方法修饰符必须是public;因此子类在实现接口重写方法时的修饰符必须是public。
2、另外再扩展一下,接口中没有变量(既然是约束和规范,怎么能够定义一个大家都可以改的东西呢?),只能是常量,接口中定义常量默认的修饰符为public static final。

2.下面关于Spring的说法中错误的是()
正确答案: D 你的答案: C (错误)
Spring是一个支持快速开发Java EE框架的框架
Spring中包含一个“依赖注入”模式的实现
使用Spring可以实现声明式事务
Spring提供了AOP方式的日志系统

D.Spring提供了AOP方式的日志系统
Spring并没有为我们提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

3.如果Child extends Parent,那么正确的有()?
正确答案: B C D 你的答案: A B C (错误)
如果Child是class,且只有一个有参数的构造函数,那么必然会调用Parent中相同参数的构造函数
如果Child是interface,那么Parent必然是interface
如果Child是interface,那么Child可以同时extends Parent1,Parent2等多个interface
如果Child是class,并且没有显示声明任何构造函数,那么此时仍然会调用Parent的构造函数

选BCD
A、子类的构造器第一行默认都是super(),默认调用直接父类的无参构造,一旦直接父类没有无参构造,那么子类必须显式的声明要调用父类或者自己的哪一个构造器。(本题a选项有参数)
BC、接口只能继承接口,但是可以多继承。类都是单继承,但是继承有传递性。
D、一个类一旦没有显式的定义任何构造,那么JVM会默认给你一个无参构造。无参构造的第一行依然默认是super()。

4.下面有关Java的说法正确的是( )
正确答案: A C D F 你的答案: A B D E F (错误)

一个类可以实现多个接口
抽象类必须有抽象方法
protected成员在子类可见性可以修改
通过super可以调用父类构造函数
final的成员方法实现中只能读取类的成员变量
String是不可修改的,且java运行环境中对string对象有一个常量池保存

A对:java类单继承,多实现
B错:被abstract修饰的类就是抽象类,有没有抽象方法无所谓
C错:描述有问题。protected成员在子类的可见性,我最初理解是子类(不继承父类protected成员方法)获取父类被protected修饰的成员属性或方法,可见性是不可能变的,因为修饰符protected就是描述可见性的。
这道题应该是要考察子类继承父类,并重写父类的protected成员方法,该方法的可见性可以修改,这是对的,因为子类继承父类的方法,访问权限可以相同或往大了改
D对。
E错:final修饰的方法只是不能重写,static修饰的方法只能访问类的成员变量
F对。

5.下面HttpServletResponse方法调用,那些给客户端回应了一个定制的HTTP回应头:( )
正确答案: A B 你的答案: C D (错误)
response.setHeader(“X-MyHeader”, “34”);
response.addHeader(“X-MyHeader”, “34”);
response.setHeader(new HttpHeader(“X-MyHeader”, “34”));
response.addHeader(new HttpHeader(“X-MyHeader”, “34”));
response.addHeader(new ServletHeader(“X-MyHeader”, “34”));
response.setHeader(new ServletHeader(“X-MyHeader”, “34”));

1、同名Header可以有多个 ,Header[] getHeaders(String name)。
2、运行时使用的是第一个, Header getFirstHeader(String name)。
3、addHeader,如果同名header已存在,则追加至原同名header后面。
4、setHeader,如果同名header已存在,则覆盖一个同名header。

第三套

11.判断对错。在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。
正确答案: B 你的答案: A (错误)

B

java多态有两种情况:重载和覆写
在重写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法;
在重载中,运用的是静态多分派,即根据静态类型确定对象,因此不是根据new的类型确定调用的方法

2.以下哪几种方式可用来实现线程间通知和唤醒:( )
正确答案: A C 你的答案: A D (错误)
Object.wait/notify/notifyAll
ReentrantLock.wait/notify/notifyAll
Condition.await/signal/signalAll
Thread.wait/notify/notifyAll

wait()、notify()和notifyAll()是 Object类 中的方法
从这三个方法的文字描述可以知道以下几点信息:

1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。

2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)

3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;

4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;

有朋友可能会有疑问:为何这三个不是Thread类声明中的方法,而是Object类中声明的方法

(当然由于Thread类继承了Object类,所以Thread也可以调用者三个方法)?其实这个问

题很简单,由于每个对象都拥有monitor(即锁),所以让当前线程等待某个对象的锁,当然

应该通过这个对象来操作了。而不是用当前线程来操作,因为当前线程可能会等待多个线程

的锁,如果通过线程来操作,就非常复杂了。

上面已经提到,如果调用某个对象的wait()方法,当前线程必须拥有这个对象的monitor(即

锁),因此调用wait()方法必须在同步块或者同步方法中进行(synchronized块或者

synchronized方法)。

调用某个对象的wait()方法,相当于让当前线程交出此对象的monitor,然后进入等待状态,

等待后续再次获得此对象的锁(Thread类中的sleep方法使当前线程暂停执行一段时间,从

而让其他线程有机会继续执行,但它并不释放对象锁);

notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象

的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。

同样地,调用某个对象的notify()方法,当前线程也必须拥有这个对象的monitor,因此调用

notify()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。

nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。

Condition是在java
1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。
Condition是个接口,基本的方法就是await()和signal()方法;
Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用Conditon中的await()对应Object的wait();
Condition中的signal()对应Object的notify();
Condition中的signalAll()对应Object的notifyAll()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值