Java日常刷题第十三天

选择题

1.在Java Applet程序用户自定义的Applet子类中,一般需要重载父类的( paint( ) )方法来完成一些画图操作。
解析:start():由浏览器或 applet viewer 调用,通知 applet 它应该开始执行。 stop():由浏览器或 applet viewer 调用,通知 applet 它应该终止执行。 init():由浏览器或 applet viewer 调用,通知applet它已经被加载在系统中。 paint():绘制容器。该方法将 paint 转发给任意一个此容器子组件的轻量级组件。如果重新实现此方法,那么么应该调用 super。paint(g)方法,从而可以正确地呈现轻量级组件。如果通过g中的当前剪切设置完全剪切某个子组件,则不会将 paint()转发给这个子组件。(从类Container继承的方法)
2.在异常处理中,以下描述不正确的有(D)
A.try块不可以省略
B.可以使用多重catch块
C.finally块可以省略
D.catch块和finally块可以同时省略
解析:用try-catch 捕获异常;
。用try-finally 清除异常;
。用try-catch-finally 处理所有的异常. 三者选一种即可

1.try块中放置可能引发异常的代码 故不可被省略
2.Jdk1.7中新增了多个catch块的功能,用以捕获多异常, 捕获顺序为先小后大
3.finally块用作回收无法被JVM回收的物理资源 例如数据库链接 网络链接等 Jdk1.7中虽增强了try()的功能,使得其中的代码在程序执行完毕后自动关闭代码 相当与隐含finally块
4.catch块用作捕获异常
总结
异常处理语法结构中只有try块是必须的,但不能只有try块,1.7中的增强try除外 因为其中的try()已经隐含了finally了
3.下列类定义中哪些是合法的抽象类的定义?(C)
A.abstract Animal{abstract void growl();}
B.class abstract Animal{abstract void growl();}
C.abstract class Animal{abstract void growl();}
D.abstract class Animal{abstract void growl(){System.out.println( “growl”);};}
解析:普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。

那么什么叫抽象方法呢?在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。

而拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。

范例:定义一个抽象类

abstract class A{//定义一个抽象类 public void fun(){//普通方法 System.out.println("存在方法体的方法");
    } public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰  }

4.如何跳出Array的forEach循环?(A )
A.break
B.return true
C.return false
D.以上都不是
5.关于static说法不正确的是(D )
A。可以直接用类名来访问类中静态方法(public权限)
B。静态块仅在类加载时执行一次
C。static方法中不能有用this调用的方法
D。不可以用对象名来访问类中的静态方法(public权限)
解析:this表示当前类的对象,由static修饰的方法是由类直接调用,不需要创建对象,所以在static里不能用this.
6.下面有关java classloader说法错误的是?(C)
A.Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
B.ClassLoader使用的是双亲委托模型来搜索类的
C.JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
D.ClassLoader就是用来动态加载class文件到内存当中用的
解析:一个jvm中默认的classloader有Bootstrap ClassLoader、Extension ClassLoader、App ClassLoader,分别各司其职:

Bootstrap ClassLoader 负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
Extension ClassLoader 负责加载java扩展类,主要是 %JRE_HOME/lib/ext 目录下的jar和class
App ClassLoader 负责加载当前java应用的classpath中的所有类。
classloader 加载类用的是全盘负责委托机制。 所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。
所以,当我们自定义的classlo ader加载成功了 com.company.MyClass以后,MyClass里所有依赖的class都由这个classLoader来加载完成。
比较两个类是否相等,只有这两个类是由同一个类加载器加载才有意义。否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类必定不相等。
补充:

  1. 什么是类加载器?

把类加载的过程放到Java虚拟机外部去实现,让应用程序决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。

  1. 有哪些类加载器,分别加载哪些类

类加载器按照层次,从顶层到底层,分为以下三种:
(1)启动类加载器 : 它用来加载 Java 的核心库,比如String、System这些类
(2)扩展类加载器 : 它用来加载 Java 的扩展库。

(3) 应用程序类加载器 : 负责加载用户类路径上所指定的类库,一般来说,Java 应用的类都是由它来完成加载的。

  1. 双亲委派模型

我们应用程序都是由以上三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。

  1. 双亲委托模型的工作原理

是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。

  1. 使用双亲委派模型好处?(原因)

第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。

第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类装载器。
7.以下不是修饰符final的作用的是(C )。
A修饰常量
B修饰不可被继承的类
C修饰不可变类
D修饰不可覆盖的方法
解析:final的作用:
1. 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。
2. 修饰方法,方法不可被重写,但是还是可以重载
3. 修饰类,类不可继承。

不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。
8.Which statement is true for the class java.util.ArrayList?(A)
A.The elements in the collection are ordered.
B.The collection is guaranteed to be immutable.
C.The elements in the collection are guaranteed to be unique.
D.The elements in the collection are accessed using a unique key.
E.The elements in the collections are guaranteed to be synchronized.
解析:Which statement is true for the class java.util.ArrayList?
下面那个选项有关java.util.ArrayList是正确的
A.The elements in the collection are ordered.
集合中的元素是排序的
B.The collection is guaranteed to be immutable.
集合不可改变
C.The elements in the collection are guaranteed to be unique.
集合中的元素必须唯一
D.The elements in the collection are accessed using a unique key.
集合中元素的键是唯一的
E.The elements in the collections are guaranteed to be synchronized.
集合中的元素是线程同步的
9.代码片段:

byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
关于上面代码片段叙述正确的是(C)
A.输出结果:13
B.语句:b6=b4+b5编译出错
C.语句:b3=b1+b2编译出错
D.运行期抛出异常
解析:被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了
而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。
Java中的byte,short,char进行计算时都会提升为int类型。
10.final、finally和finalize的区别中,下述说法正确的有?(AB)
A.final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
B.finally是异常处理语句结构的一部分,表示总是执行。
C.finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。
D.引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。
解析:一.final
如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能覆盖(重写)。
二.finally
在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

三.finalize
方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。
A,D考的一个知识点,final修饰变量,变量的引用(也就是指向的地址)不可变,但是引用的内容可以变(地址中的内容可变)。
B,finally表示总是执行。但是其实finally也有不执行的时候,但是这个题不要扣字眼。

  1. 在try中调用System.exit(0),强制退出了程序,finally块不执行。
  2. 在进入try块前,出现了异常,finally块不执行。
    C,finalize方法,这个选项错就错在,这个方法一个对象只能执行一次,只能在第一次进入被回收的队列,而且对象所属于的类重写了finalize方法才会被执行。第二次进入回收队列的时候,不会再执行其finalize方法,而是直接被二次标记,在下一次GC的时候被GC。
    放一张图吧在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yangyuCISCO/article/details/83585168
今日推荐