1. 结构型模式中最体现扩展性的模式是(A)
A 装饰模式
B 合成模式
C 桥接模式
D 适配器
解析:
结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例。故可以分为类结构模式和对象结构模式。
在GoF设计模式中,结构型模式有:
1).适配器模式 Adapter
适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
两个成熟的类需要通信,但是接口不同,由于开闭原则,我们不能去修改这两个类的接口,所以就需要一个适配器来完成衔接过程。
2).桥接模式 Bridge
桥接模式将抽象部分与它的实现部分分离,是它们都可以独立地变化。它很好的支持了开闭原则和组合锯和复用原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这些多角度分离出来让他们独立变化,减少他们之间的耦合。
3).组合模式 Composite
组合模式将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
4).装饰模式 Decorator
装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。 装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。
5).外观模式 Facade
外观模式为子系统中的一组接口提供了同意的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式中,客户对各个具体的子系统是不了解的,所以对这些子系统进行了封装,对外只提供了用户所明白的单一而简单的接口,用户直接使用这个接口就可以完成操作,而不用去理睬具体的过程,而且子系统的变化不会影响到用户,这样就做到了信息隐蔽。
6).享元模式 Flyweight
享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。.
享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。
7).代理模式 Proxy
为其他对象提供一种代理,并由代理对象控制对原对象的引用,以间接控制对原对象的访问。
2.下面代码运行结果是(C)
public class Test{
public int add(int a,int b){
try {
return a+b;
}
catch (Exception e) {
System.out.println("catch语句块");
}
finally{
System.out.println("finally语句块");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
A catch语句块 和是:43
B 编译异常
C finally语句块 和是:43
D 和是:43 finally语句块
解析:程序先执行try块中return之前(包括return语句中的表达式运算)的代码;再执行finally块,最后执行try块中的return; 而finally块之后的return语句,因为程序在try块中已经return了,所以不再执行。
3.下列Java代码中的变量a、b、c分别在内存的 C 存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
A 堆区、堆区、堆区
B 堆区、栈区、堆区
C 堆区、栈区、栈区
D 堆区、堆区、栈区
E 静态区、栈区、堆区
F 静态区、栈区、栈区
解析:a属于类所以在堆中。bc属于方法,b c为局部变量,局部变量不属于任何类或者实例,因此它总是保存在其所在方法的栈内存中!
4. 以下声明合法的是(B)
A default String s
B public final static native int w( )
C abstract double d
D abstract final double hyperbolicCosine( )
解析:
A:属性的可访问控制符可以是public、protected、private、默认(如果不写的话,被认为是friendly,但是写上friendly会报错),没有default修饰符,所以A错误
B:定义的是本地方法,从修饰符native可以看出来,被native修饰的方法,底层是C++,表明这个方法采用的是JNI技术(Java Native Interface)完成想要的功能,JNI技术上层规范是JNA(Java Native Access),JNI技术其实也是实现了Java语言与其他语言的通信,比如这次就是C++,很多的方法采用的都是native修饰符,比如Object中hashCode()、clone()、notify()、wait()、以及System中的arraycopy(),所以B正确
C:属性的非可访问控制符可以是static和final,没有abstract,所以C错误
D:方法的非可访问控制符可以是abstract、static、final,但是abstract不可以和static以及final连用,毕竟abstract是虚拟的动态的,但是static和final都是静态的,不过static和final可以连用,毕竟两个都是静态的
5. 在使用super 和this关键字时,以下描述正确的是(A)
A 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B super()和this()不一定要放在构造方法内第一行
C this()和super()可以同时出现在一个构造函数中
D this()和super()可以在static环境中使用,包括static方法和static语句块
解析:
a。super() ,this() 和super, this关键字不是一个概念, 前者是在构造器之间相互调用的语法, 后者是代之父类或者本类的对象
b。每个构造器默认的第一行都是super(), 但有时候父类没有无参构造, 那么就必须在子类构造的第一行显式的声明要调用哪个构造器
c。this() 和 super() 都必须出现在构造器中的第一行, 所以两者不可能出现在同一个构造器中.
d。this和super都不能出现在静态方法或静态块中
6.下面代码的输出结果是什么?
public class ZeroTest {
public static void main(String[] args) {
try{int i = 100 / 0;
System.out.print(i);
}catch(Exception e){
System.out.print(1);
throw new RuntimeException();
}finally{
System.out.print(2);
}
System.out.print(3);
}
}
A 3
B 123
C 1
D 12
答案:D
解析:首先try中会出现异常,所以会出发catch打印 1 ,因为finally一定会执行所以还会打印2. 因为触发异常了,最后的3 是执行不到的。
7.代码片段:
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
A 输出结果:13
B 语句:b6=b4+b5编译出错
C 语句:b3=b1+b2编译出错
D 运行期抛出异常
答案:C
解析:
被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了;而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。 Java中的byte,short,char进行计算时都会提升为int类型。
8.以下java程序代码,执行后的结果是()
public class Test {
public static void main(String[] args) {
Object o = new Object() {
public boolean equals(Object obj) {
return true;
}};
System.out.println(o.equals("Fred"));
}
}
A Fred
B true
C 编译错误
D 运行时抛出异常
解析:重写了object 的equals 的方法,使他怎么输出都是true
9.执行以下程序后的输出结果是(D)
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
A A,A
B A,B
C B,B
D AB,B
10.下面所示的java代码,运行时,会产生(D)类型的异常
int Arry_a[] = new int[10];
System.out.println(Arry_a[10]);
A ArithmeticException
B NullPointException
C IOException
D ArrayIndexOutOfBoundsException
解析:定义的数组长度为10,角标即为0-9,访问数组角标10会出现数组角标越界异常