Java日常练习题 Java日常练习题,每天进步一点点(60)
牛哄哄的柯南 人气:01、假设 A 类有如下定义,设 a 是 A 类同一个包下的一个实例,下列语句调用哪个是错误的?()
class A{ int i; static String s; void method1() { } static void method2() { } }
正确答案:C
A System.out.println(a.i);
B a.method1();
C A.method1();
D A.method2()
题解:
1、非静态方法只能通过实例对象来调用,不能直接通过类名调用。静态方法(static)才能通过类名直接调用.
2、 类中变量:除了private权限外,其他权限的变量(没有表示默认default),均可以用“对象.变量名”来调用。对于private变量,即使使用static,也不能用“类.变量名”来调用私有变量。只能通过类中的public get()方法来调用。 类中方法:除了private权限外,其他权限的方法(没有表示默认default),均可以用“对象.方法名”来调用。private方法可以用java反射机制调用。当然如果用 private修饰方法,该方法只在类的内部调用。其中比较著名的就是单例模式中的私有构造方法。 static属性:static方法在编译期就已经生成了,其他方法在运行期生成。非私有的static方法可以用“类.方法名”调用。但是私有的static变量和方法都是不可能被调用的,虽然private static这种写法很少见,但仍然存在,且编译器不会报错。题中static void method2() { }的权限是默认权限,所以可以用“类.方法名”来调用。如果题目中写成private static void method2(){ }
3、那么D选项也是错误的。
4、 小学语文毕业了再来出题!只是说a是A类同包下的一个实例,那么有关a的选项全是错的。
2、Java中基本的编程单元为:
正确答案:A
A类
B 函数
C 变量
D 数据
题解:
1、java的基本编程单元是类,基本存储单元是变量。
2、 没有类就没有函数
3、 Java的基本编程单位是类,基本存储单元是变量
3、下列代码的执行结果是:( )
public class Test3{ public static void main(String args){ System.out.println(100%3); System.out.println(100%3.0); } }
正确答案:B
A 1和1
B 1和1.0
C 1.0和1
D 1.0和1.0
题解:
1、多种混合计算时,自动将所有数据类型转换为容量最大的一种数据类型。所以都转为float类型。
2、 修复后的答案是B 100对3取余,两者都是int型,所以结果也是int型,也就是1 100对3.0取余,虚拟机会对100进行转换,转换成100.0,也就是float型,结果也就是float型,也就是1.0
3、 根据Java 语言规范(JLS) 中15.17.3 对 %运算的定义可以知 %是可以用于浮点数 因此是B。 In C and C++
4、 the remainder operator accepts only integral operands
5、 but in the Java programming language
6、 it also accepts floating-point operands. The result of a floating-point remainder operation is determined by the rules of IEEE 754 arithmetic: If either operand is NaN
7、 the result is NaN. If the result is not NaN
8、 the sign of the result equals the sign of the dividend. If the dividend is an infinity
9、 or the divisor is a zero
:、 or both
;、 the result is NaN. If the dividend is finite and the divisor is an infinity
<、 the result equals the dividend. If the dividend is a zero and the divisor is finite
=、 the result equals the dividend. In the remaining cases
、 where neither an infinity
?、 nor a zero
@、 nor NaN is involved
A、 the floating-point remainder r from the division of a dividend n by a divisor d is defined by the mathematical relation r = n - ( d ⋅ q ) where q is an integer that is negative only if n / d is negative and positive only if n / d is positive
B、 and whose magnitude is as large as possible without exceeding the magnitude of the true mathematical quotient of n and d . 参考地址:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.3
4、给定以下JAVA代码,这段代码运行后输出的结果是()
public class Test { public static int aMethod(int i)throws Exception { try{ return i / 10; } catch (Exception ex) { throw new Exception(“exception in a Method”); } finally{ System.out.printf(“finally”); } } public static void main(String args) { try { aMethod(0); } catch (Exception ex) { System.out.printf(“exception in main”); } System.out.printf(“finished”); } }
正确答案:B
A exception in main finished
B finally finished
C exception in main finally
D finally exception in main finished
题解:
1、 尼玛,看成了10/0
2、 1、finally块一定会执行,无论是否try…catch。 2、finally前有return,会先执行return语句,并保存下来,再执行finally块,最后return。 3、finally前有return、finally块中也有return,先执行前面的return,保存下来,再执行finally的return,覆盖之前的结果,并返回。
5、以下哪一项正则能正确的匹配网址: http://www.bilibili.com/video/av21061574 ()
正确答案:B
A /^(https?:\/\/)?(a-zA-Z\d+).bilibili.com\/?video\/av(\D{1 ,8})\/?$/
B /^(http:\/\/)?(\w+)\.bilibili\.com\/?video\/av(\d{1 ,8})\/?$/
C /^(https?:\/\/)?(\w+)\.bilibili\.com\/?\w*$/
D /^(http:\/\/)?(a-zA-Z\d+).bilibili.com\/?video\/av\w*\/+$/
题解:
简单的梳理一下这道题用到的正则表达式的知识点: 首先,^表示匹配输入的开始,$表示匹配输入的结束 每个选项从前向后看,http都能够严格匹配 ?表示匹配某元素0次或1次,这里四个选项都没有问题,能够匹配0次或1次字符s 接下来:严格匹配,\/\/严格匹配两个// 接着往下看,[]表示字符集合,它用在正则表达式中表示匹配集合中的任一字符 A D 选项中的 [a-zA-Z\d] 表示匹配一个小写字母 或者 大写字母 或者 数字 B C 选项中的 \w 表示匹配字母数字或下划线(注意这里比A D中能多匹配下划线类型) +表示匹配某元素1次或多次,到这里四个选项都能够完美匹配字符www .可以匹配除了换行符\n \r外的任何字符 接下来我们看选项A,bilibili com video av都严格匹配,而 \D 表示匹配一个非数字字符而非数字字符,av后的数字是无法匹配成功的,A错误 B选项,\d匹配数字,{m,n}表示最少匹配m次,最多匹配n次,\/?能匹配末尾的0个或1个/字符,B正确 C选项,*表示匹配某元素0次或多次,但 \w 并不能匹配字符 /,C错误 D选项,前面都对,错在最后的\/+至少要匹配一个/,而原字符串最后并没有/
6、下列关于异常处理的描述中,错误的是()。
正确答案:D
A 程序运行时异常由Java虚拟机自动进行处理
B 使用try-catch-finally语句捕获异常
C 可使用throw语句抛出异常
D 捕获到的异常只能在当前方法中处理,不能在其他方法中处理
题解:
1、编译时异常必须显示处理,运行时异常交给虚拟机。 运行时异常可以不处理。当出现这样的异常时,总是由虚拟机接管。比如我们从来没有人去处理过Null Pointer Exception异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往不对它处理罢了。也就是说,如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
2、 捕获到的异常不仅可以在当前方法中处理,还可以将异常抛给调用它的上一级方法来处理。
3、 D"捕获到的异常只能在当前方法中处理,不能在其他方法中处理"这句话是错的,在实际应用中,当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才可以处理,这个时候同时使用catch和throw语句,捕获异常后,只对异常进行部分处理,还有些处理需要在该方法的调用者中才能完成,所以应该再次抛出异常,让该方法的调用者也能捕获到异常。(引用自《Java疯狂讲义》)
7、以下哪项不属于java类加载过程?
正确答案:B
A 生成java.lang.Class对象
B int类型对象成员变量赋予默认值
C 执行static块代码
D 类方法解析
题解:
1、 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。如图所示。 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。以下陈述的内容都已HotSpot为基准。 加载 在加载阶段(可以参考java.lang.ClassLoader的loadClass()方法),虚拟机需要完成以下3件事情: 通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class文件中获取,可以从其他渠道,譬如:网络、动态生成、数据库等); 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构; 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口; 加载阶段和连接阶段(Linking)的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。 验证 验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 验证阶段大致会完成4个阶段的检验动作: 文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以魔术0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。 元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。 符号引用验证:确保解析动作能正确执行。 验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。 准备 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为: 1 publicstaticintvalue=123; 那变量value在准备阶段过后的初始值为0而不是123.因为这时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中,所以把value赋值为123的动作将在初始化阶段才会执行。 至于“特殊情况”是指:public static final int value=123,即当类字段的字段属性是ConstantValue时,会在准备阶段初始化为指定的值,所以标注为final之后,value的值在准备阶段初始化为123而非0. 解析 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。 初始化 类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。在准备极端,变量已经付过一次系统要求的初始值,而在初始化阶段,则根据程序猿通过程序制定的主管计划去初始化类变量和其他资源,或者说:初始化阶段是执行类构造器()方法的过程. ()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块static{}中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问 原文链接 http://www.importnew.com/18548.html
2、 java类加载过程如图所示
8、对于文件的描述正确的是( )
正确答案:D
A 文本文件是以“.txt”为后缀名的文件,其他后缀名的文件是二进制文件。
B File类是Java中对文件进行读写操作的基本类。
C 无论文本文件还是二进制文件,读到文件末尾都会抛出EOFException异常。
D Java中对于文本文件和二进制文件,都可以当作二进制文件进行操作。
题解:
1、A.文件分为文本文件和二进制文件,计算机只认识二进制,所以实际上都是二进制的不同解释方式。文本文件是以不同编码格式显示的字符,例如Ascii、Unicode等,window中文本文件的后缀名有".txt"
2、".log"
3、各种编程语言的源码文件等;二进制文件就是用文本文档打开是看不懂乱码,只要能用文本打开的文件都可以算是文本文件,只是显示的结果不是你想要的,二进制文件只有用特殊的应用才能读懂的文件,例如".png"
4、".bmp"等,计算机中大部分的文件还是二进制文件。 B.File类是对文件整体或者文件属性操作的类,例如创建文件、删除文件、查看文件是否存在等功能,不能操作文件内容;文件内容是用IO流操作的。 C.当输入过程中意外到达文件或流的末尾时,抛出EOFException异常
5、正常情况下读取到文件末尾时,返回一个特殊值表示文件读取完成,例如read()返回-1表示文件读取完成。 D.上面A选项已经说了,不论是文本文件还是二进制文件,在计算机中都是以二进制形式存储的,所以都当做二进制文件读取。
6、 File类是 文件和目录路径名的抽象表示形式。
7、 D:正确 B:File类是java中文件和目录路径名的抽象表示形式。Java中对文件进行读写操作的基本类是IO类。 C:读到文件末尾不会抛出异常。EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常。
9、有关hashMap跟hashtable的区别,说法正确的是?
正确答案:BCD
A HashMap和Hashtable都实现了Map接口
B HashMap是非synchronized,而Hashtable是synchronized
C HashTable使用Enumeration,HashMap使用Iterator
D HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
题解:
1、HashTable和HashMap区别 ①继承不同。 public class Hashtable extends Dictionary implements Map public class HashMap extends AbstractMap implements Map ② Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。 ③ Hashtable中,key和value都不允许出现null值。 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。 ④两个遍历方式的内部实现上不同。 Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。 ⑤ 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。 ⑥ Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
2、 A正确。Map是一个接口,hashtable
3、hashmap都是它的实现。 B正确。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。 C正确。 HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。 D正确。 哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的: int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; 而HashMap重新计算hash值,而且用与代替求模: int hash = hash(k); int i = indexFor(hash
4、 table.length);
5、 选ABCD,下面是直接总结的,有个地方写错了Hashtable的默认长度是11不是16。
10、java中 String str = "hello world"下列语句错误的是?
正确答案:ABC
A str+=' a'
B int strlen = str.length
C str=100
D str=str+100
题解:
1、str += ‘a' 和 str +=“a"都是对的,但是如果a前面加一个空格,那么只能用双引号了。代表字符串
2、 数组有length属性,字符串只有length()方法
3、 ABC在java中会报错,D可以正常运行
4、 所以答案是ABC. A. ‘a'是字符
5、' a'这个是空格和a,必须要用” a"才可以; B.String有length()方法 C.int 无法直接转成String类型 D.尾部添加字符串”100“
答案汇总:
1、正确答案:C
2、正确答案:A
3、正确答案:B
4、正确答案:B
5、正确答案:B
6、正确答案:D
7、正确答案:B
8、正确答案:D
9、正确答案:BCD
10、正确答案:ABC
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!
加载全部内容