牛客网-java一般版专项练习
1:求cnt
public class Test{
static int cnt = 6;
static{
cnt += 9;
}
public static void main(String[] args){
System.out.println(“cnt =” + cnt);
}
static{
cnt /=3;
};
}
答:cnt=5
解析:
在JVM调用mian方法之前先用进行静态内容的初始化。顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。
初始化顺序:
1.先父类,后子类
2.先属性,后构造函数
3.先静态,后非静态
4.先静态属性,后静态代码块
5.同一类型(非数据类型,指以上),按代码先后顺序
2: 下面所示的java代码,运行时,会产生()类型的异常
int Arry_a[] = new int[10];
System.out.println(Arry_a[10]);
ArithmeticException(算术异常):
NullPointException(零点异常):
IOException(输出异常):
ArrayIndexOutOfBoundsException(数组下标越界异常):T
解析:
定义的数组长度为10,角标即为0-9
访问数组角标10会出现数组角标越界异常
3:在类设计中,类的成员变量要求仅仅能够被同一package下的类访问,请问应该使用下列哪个修饰词()
protected:
public:
private:
不需要任何修饰词:T
解析:
4:final、finally和finalize的区别中,下述说法正确的有?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。:T
finally是异常处理语句结构的一部分,表示总是执行。:
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。:T
引用变量被final修饰之后,不能再指向其他对象,它指向的对象的内容也是不可变的。:T
解析:
深入理解java虚拟机中说到:
当对象不可达后,仍需要两次标记才会被回收,首先垃圾收集器会先执行对象的finalize方法,但不保证会执行完毕(死循环或执行很缓慢的情况会被强行终止),此为第一次标记。第二次检查时,如果对象仍然不可达,才会执行回收。
最好不要以任何方式使用finalize方法。
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
5:Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述错误的是
A: ArrayList和LinkedList均实现了List接口
B: ArrayList的访问速度比LinkedList快
C: 添加和删除元素时,ArrayList的表现更佳
D: HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
解析:
A正确,因为ArrayList和LinkedList都实现List接口。
B正确,ArrayList底层是数组,所以查询快,增删慢;而LinkedList底层是链表,查询慢,增删快。
C错误,见B解析。
D正确,描述正确,有一个Hashtable类,是不允许null作键和值的。
6:下面有关java的一些细节问题,描述错误的是?
A: 构造方法不需要同步化
B: 一个子类不可以覆盖掉父类的同步方法
C: 定义在接口中的方法默认是public的
D: 容器保存的是对象的引用 :F
解析:
构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步 。
如果父类中的某个方法使用了 synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类中的这个方法并不是同步的,必须显示的在子类的这个方法中加上 synchronized关键字才可。当然,也可以在子类中调用父类中相应的方法,这样虽然子类中的方法并不是同步的,但子类调用了父类中的同步方法,也就相当子类方法也同步了。详见:http://blog.csdn.net/welcome000yy/article/details/8941644
7:假设有以下代码String s = “hello”:String t = “hello”;char c [ ] = {‘h’,’e’,’l’,’l’,’o’};下列选项中返回false的语句是?
s.equals (t);
t.equals (c);F
s==t;
t.equals (new String (“hello”));
解析:
首先==与equals是有明显区别的。
==强调栈中的比较,可以理解为地址比较
equals强调对象的内容比较
String s=“hello”;会在栈中生成hello字符串,并存入字符串常量池中。
String t=“hello” ;创建时,会在字符串常量池中寻找,当找到需要的hello时,不进行字符串的创建,引用已有的。 所以,s==t返回true,s.equals(t)也是true。
char c[]={‘h’,’e’,’l’,’l’,’o’}; c==s这个是不存在的,==两边类型不同
t.equals(c)这个语句在anObject instanceof String这步判断不会通过,也就是cha[] 压根不能与String相比较,类型不是相同的。返回false
备注知识点:
1.静态代码块 2.构造代码块3.构造方法的执行顺序是1>2>3;明白他们是干嘛的就理解了。
1.静态代码块:是在类的加载过程的第三步初始化的时候进行的,主要目的是给类变量赋予初始值。
2.构造代码块:是独立的,必须依附载体才能运行,Java会把构造代码块放到每种构造方法的前面,用于实例化一些共有的实例变量,减少代码量。
3.构造方法:用于实例化变量。
1是类级别的,2、3是实例级别的,自然1要优先23.
在就明白一点:对子类得主动使用会导致对其父类得主动使用,所以尽管实例化的是子类,但也会导致父类的初始化和实例化,且优于子类执行。
8:以下声明合法的是
default String s
public final static native int w( ):T
abstract double d
**abstract fina**l double hyperbolicCosine( )
解析:
A:变量不能被defalut修饰
B:native修饰方法,native修饰的方法简单来说就是:一个Java方法调用了一个非Java代码的接口。
定义navtive方法时,并不提供实现体,因为其实现体是用非Java语言在外面实现的。native可以和任何修饰符连用,abstract除外。因为native暗示这个方法时有实现体的,而abstract却显式指明了这个方法没有实现体。
C:abstract修饰方法和类
D:final修饰的方法不能被重写。而abstract定义的方法没有实现,必须被子类重写,明显不能一起使用。
注意一点:变量的定义一般遵循》访问修饰符+ 修饰符 +数据类型 +变量名=初始值.
9:JSP分页代码中,哪个步骤次序是正确的?
先取总记录数,得到总页数,再取所有的记录,最后显示本页的数据。T
先取所有的记录,得到总页数,再取总记录数,最后显示本页的数据。
先取总页数,得到总记录数,再取所有的记录,最后显示本页的数据。
先取本页的数据,得到总页数,再取总记录数,最后显示所有的记录。
解析:
1、count(*)得到总记录数
2、计算总页数
3、获取所有记录(个人感觉这一步不需要,可以直接获取指定页数数据)
4、过滤显示本页数据
10:以下java程序代码,执行后的结果是()
java.util.HashMap map=new java.util.HashMap();
map.put(“name”,null);
map.put(“name”,”Jack”);C
System.out.println(map.size());
解析:
HashMap可以插入null的key或value,插入的时候,检查是否已经存在相同的key,如果不存在,则直接插入,如果存在,则用新的value替换旧的value,在本题中,第一条put语句,会将key/value对插入HashMap,而第二条put,因为已经存在一个key为name的项,所以会用新的value替换旧的vaue,因此,两条put之后,HashMap中只有一个key/value键值对。那就是(name,jack)。所以,size为1.