2019年11月6日 java2

考点2

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String args[]) {
Thread t=new Thread(){
public void run(){
dianping();

}
};
t.run();
System.out.print("dazhong");
}
static void dianping(){
System.out.print("dianping");
}
  • A dazhongdianping
  • B dianpingdazhong
  • C a和b都有可能
  • D dianping循环输出,dazhong夹杂在中间

正确答案: B

解析

  • 调用run()方法不会创建一个新的线程,也就是现在只有一个main线程,run方法在main线程中执行。
  • 一个线程中的代码执行顺序是固定的,所以先执行run(),在输出dazhong
  • 调用start()方法才会创建线程。

考点3

下面有关java object默认的基本方法,说法错误的是?

  • A equals(Object obj) 指示某个其他对象是否与此对象“相等”
  • B copy() 创建并返回此对象的一个副本
  • C wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
  • D toString() 返回该对象的字符串表示

正确答案: B

解析

Object中没有copy方法,想不到吧!

考点4

结构型模式中最体现扩展性的模式是()

  • A 装饰模式
  • B 合成模式
  • C 桥接模式
  • D 适配器

正确答案: A

解析

什么是结构型模式

结构型模式是描述如何将类对象结合在一起,形成一个更大的结构
结构模式描述两种不同的东西:类与类的实例。故可以分为类结构模式和对象结构模式。

GoF结构型模式

在GoF设计模式中,结构型模式有:

1.适配器模式 Adapter

适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
两个成熟的类需要通信,但是接口不同,由于开闭原则,我们不能去修改这两个类的接口,所以就需要一个适配器来完成衔接过程。

2.桥接模式 Bridge

桥接模式将抽象部分与它的实现部分分离,是它们都可以独立地变化。它很好的支持了开闭原则和组合锯和复用原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这些多角度分离出来让他们独立变化,减少他们之间的耦合。

3.组合模式 Composite

组合模式将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

4.装饰模式 Decorator

装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。
装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。

5.外观模式 Facade

外观模式为子系统中的一组接口提供了同意的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式中,客户对各个具体的子系统是不了解的,所以对这些子系统进行了封装,对外只提供了用户所明白的单一而简单的接口,用户直接使用这个接口就可以完成操作,而不用去理睬具体的过程,而且子系统的变化不会影响到用户,这样就做到了信息隐蔽。

6.享元模式 Flyweight

享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。

7.代理模式 Proxy

为其他对象提供一种代理,并由代理对象控制对原对象的引用,以间接控制对原对象的访问。

考点5

下面有关 java 类加载器,说法正确的是?()

  • A 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的
  • B 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
  • C 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
  • D tomcat 为每个 App 创建一个 Loader,里面保存着此 WebApp 的 ClassLoader。需要加载 WebApp 下的类时,就取出 ClassLoader 来使用

正确答案: ABCD

解析

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定
目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

自底向上检查类是否加载

加载过程中会先检查类是否被已加载,检查顺序是自底向上,
从Custom ClassLoader到BootStrap
ClassLoader逐层检查,
只要某个classloader已加载就视为已加载此类

加载顺序自顶向下

而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

考点6

Java类Demo中存在方法func0、func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Demo{
  float func0()
  {
    byte i=1;
    return i;
  }
  float func1()
  {
    int i=1;
    return;
  }
  float func2()
  {
    short i=2;
    return i;
  }
  float func3()
  {
    long i=3;
    return i;
  }
  float func4()
  {
    double i=4;
    return i;
  }
}
  • A func1
  • B func2
  • C func3
  • D func4

正确答案: AD

解析

这道题考的是数据类型转换问题。由大到小需要强制转换,由小到大不需要。
A:return; 没有返回值,错误
B:short 转成 float 无须强制转换,正确
C:long 转成 float 无须强制转换(这个最选项容易出错),正确。
float占4个字节为什么比long占8个字节大呢,因为底层的实现方式不同。
浮点数的32位并不是简单直接表示大小,而是按照一定标准分配的。
第1位,符号位,即S
接下来8位,指数域,即E。
剩下23位,小数域,即M,取值范围为[1 ,2 ) 或[0 , 1)
然后按照公式:
V=(-1)^s * M * 2^E
也就是说浮点数在内存中的32位不是简单地转换为十进制,而是通过公式来计算而来

虽然float只有4个字节,但浮点数最大值要比长整型的范围要大。
D:double → float 没有强制转换,错误。