萌新卷妹带你攻略java选择题【2】
萌新卷妹带你攻略java选择题【2】
👩💻博客主页:京与旧铺的博客主页
✨欢迎关注🖱点赞🎀收藏⭐留言✒
🔮本文由京与旧铺原创,csdn首发!
😘系列专栏:java学习
👕参考网站:牛客网
💻首发时间:🎞2022年10月9日🎠
🎨你做三四月的事,八九月就会有答案,一起加油吧
🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲
💬推荐一款模拟面试、刷题神器👉点击进入网站
🛒导航小助手🎪
第一题
关于JDK1.8中Java的抽象类、接口,以下描述错误的是?
正确答案: C 你的答案: D (错误)
抽象类不一定含有抽象方法,接口中的方法都是抽象方法
一个类只能继承一个抽象类,但可以实现多个接口;一个接口可以继承多个接口
抽象类和接口中的方法都没有方法体
抽象类可以含有私有成员变量,接口不含有私有成员变量
选择C。
A----------抽象类不一定含有抽象方法,接口中的方法都是抽象方法。
接口中的方法默认修饰符有public abstract。 B----------一个类只能继承一个一个抽象类,但可以实现多个接口;一个接口可以继承多个接口。 Java里类是单继承的,接口是可以多继承的,用关键字extends。 C----------抽象类和接口中的方法都没有方法体。 抽象类中的方法是可以有方法体的。JDK1.8之后,接口中的方法也可以有方法体,用default关键字修饰方法。 D----------抽象类可以含有私有成员变量,接口不含有私有成员变量。 接口中的成员变量都是public static final的,一般用作常量。
第二题
Thread. sleep()是否会抛出checked exception?
正确答案: A 你的答案: B (错误)
会
不会
checked exception:指的是编译时异常,该异常需要本函数必须处理的,不能忽略,用try和catch处理,或者throws抛出异常,然后交给调用者处理
runtiThread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)me exception:指的是运行时异常,该类一场不必须本函数必须处理,当然也可以不处理
第三题
下面关于垃圾收集的说法正确的是
正确答案: D 你的答案: B (错误)
一旦一个对象成为垃圾,就立刻被收集掉。
对象空间被收集掉之后,会执行该对象的finalize方法
finalize方法和C++的析构函数是完全一回事情
一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此
1、在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行。
2、一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存(《java 编程思想》)
3、*在C++中,对象的内存在哪个时刻被回收,是可以确定的,*在C++中,析构函数和资源的释放息息相关,能不能正确处理析构函数,关乎能否正确回收对象内存资源。****
*在java中,对象的内存在哪个时刻回收,取决于垃圾回收器何时运行,*在java中,所有的对象,包括对象中包含的其他对象,它们所占的内存的回收都依靠垃圾回收器,因此不需要一个函数如C++析构函数那样来做必要的垃圾回收工作。当然存在本地方法时需要finalize()方法来清理本地对象。在《java编程思想》中提及,finalize()方法的一个作用是用来回收“本地方法”中的本地对象
4、“**但是线程并非如此”不理解,希望大佬补充**
第四题
以下 _ 不是 Object 类的方法
正确答案: D 你的答案: B (错误)
clone()
finalize()
toString()
hasNext()
hasNext()是迭代器的
第五题
以下代码将打印出
public static void main(String args[]) {
List Listlist1 = new ArrayList();
Listlist1.add(0);
List Listlist2 = Listlist1;
System.out.println(Listlist1.get(0) instanceof Integer);
System.out.println(Listlist2.get(0) instanceof Integer);
}
正确答案: B 你的答案: C (错误)
编译错误
true true
true false
false false
解析
B.collection类型的集合(ArrayList,LinkedList)只能装入对象类型的数据,该题中装入了0,是一个基本类型,但是JDK5以后提供了自动装箱与自动拆箱,所以int类型自动装箱变为了Integer类型。编译能够正常通过。将list1的引用赋值给了list2,那么list1和list2都将指向同一个堆内存空间。instanceof是Java中关键字,用于判断一个对象是否属于某个特定类的实例,并且返回boolean类型的返回值。显然,list1.get(0)和list2.get(0)都属于Integer的实例
第六题
Integer a = 1;
Integer b = 1;
Integer c = 500;
Integer d = 500;
System.out.print(a == b);
System.out.print(c == d);
上述代码返回结果为:
正确答案: B 你的答案: D (错误)
true、true
true、false
false、true
false、false
Integer类型在-128-->127范围之间是被缓存了的,也就是每个对象的内存地址是相同的,赋值就直接从缓存中取,不会有新的对象产生,而大于这个范围,将会重新创建一个Integer对象,也就是new一个对象出来,当然地址就不同了,也就!=;
第七题
关于下列程序段的输出结果,说法正确的是:( )
public class MyClass{
static int i;
public static void main(String argv[]){
System.out.println(i);
}
}
正确答案: D 你的答案: A (错误)
有错误,变量i没有初始化。
null
1
0
类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量则必须进行初始化,他不会进行默认值赋值。
第八题
以下代码执行的结果显示是多少( )?
正确答案: D 你的答案: B (错误)
true,false,true
false,true,false
true,true,false
false,false,true
其实当我们在为Integer赋值的时候,java编译器会将其翻译成调用valueOf()方法。比如Integer i=127翻译为Integer i=Integer.valueOf(127)
然后我们来看看valueOf()函数的源码:
public static Integer valueOf(int i)
{
//high为127
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.***[i + 128];
else
return new Integer(i);
}
可以看出,对于-128到127之间的数,Java会对其进行缓存。而超出这个范围则新建一个对象。
所以现在回到这道问题
i1和i2为128,超出范围,所以都需要新建对象,对象比较为false;
i5和i6为100,在范围之内,在执行Integer i5=100时,就会直接缓存到内存中,但执行执行Integer i6=100时,就直接从缓存里取,而不需要新建对象,所以为true。
第九题
下面叙述那个是正确的?()
正确答案: B 你的答案: A (错误)
java中的集合类(如Vector)可以用来存储任何类型的对象,且大小可以自动调整。但需要事先知道所存储对象的类型,才能正常使用。
在java中,我们可以用违例(Exception)来抛出一些并非错误的消息,但这样比直接从函数返回一个结果要更大的系统开销。
java接口包含函数声明和变量声明。
java中,子类不可以访问父类的私有成员和受保护的成员。
我就说下B选项和C选项。 B选项说的情况就是我们自定义异常的情况,请仔细读:我们可以用违例(Exception)来抛出一些并非错误的消息,可以,并非错误的消息。比如我自定义一个异常,若一个变量大于10就抛出一个异常,这样就对应了B选项说的情况,我用抛出异常说明这个变量大于10,而不是用一个函数体(函数体内判断是否大于10,然后返回true或false)判断,因为函数调用是入栈出栈,栈是在寄存器之下的速度最快,且占的空间少,而自定义异常是存在堆中,肯定异常的内存开销大!所以B对。 C选项说的是接口包含方法声明和变量声明。因为接口中方法默认是 abstract public,所以在接口只写函数声明是符合语法规则。但是变量默认是用public final static 修饰的,意思它是静态常量,常量不管在接口中还是类中必须在声明时初始化!所以C的后半句是错的,必须在声明时并给出初始化!
第十题
关于多线程和多进程,下面描述正确的是():
正确答案: A C 你的答案: C D (错误)
多进程里,子进程可获得父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,拥有自己的栈空间。
线程因为有自己的独立栈空间且共享数据,所有执行的开销相对较大,同时不利于资源管理和保护。
线程的通信速度更快,切换更快,因为他们在同一地址空间内。
一个线程可以属于多个进程。
A.子进程得到的是除了代码段是与父进程共享以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,子进程可获得父进程的所有堆和栈的数据,但二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行;进程的线程之间共享由进程获得的资源,但线程拥有属于自己的一小部分资源,就是栈空间,保存其运行状态和局部自动变量的。
B.线程之间共享进程获得的数据资源,所以开销小,但不利于资源的管理和保护;而进程执行开销大,但是能够很好的进行资源管理和保护。
C.线程的通信速度更快,切换更快,因为他们共享同一进程的地址空间。
D.一个进程可以有多个线程,线程是进程的一个实体,是CPU调度的基本单位。
第十一题
下面哪些情况会引发异常:
正确答案: A B C 你的答案: A B C D (错误)
数组越界
指定URL不存在
使用throw语句抛出
使用throws语句
关于throws 是不是可以理解为 异常不是throws引发的,而是用来防范出现异常的
第十二题
下面有关值类型和引用类型描述正确的是()?
正确答案: A B C 你的答案: B D (错误)
值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。
值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。
引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。
值类型变量的作用域主要是在栈上分配内存空间内,而引用类型变量作用域主要在分配的堆上。
我的理解(有错麻烦大家指正,谢谢!)
值类型:基本数据类型(int、double、boolean ...) 引用类型:reference类型,通过它可以直接或间接的查找到对象在java堆中数据存放的起始地址或索引(对象在java堆中的哪个位置)
先来两个例子,变量的赋值在内存中是怎么样的:
先上一张运行时数据区的网图
局部变量表、操作数栈在虚拟机栈中
一:基本变量的赋值
public void method() {
int a = 1;
int b = a;
}
该方法的字节码:
0 iconst_1 // 将 int 型 1 推送至操作数栈栈顶
1 istore_1 // 将操作数栈栈顶 int 型值存入第二个本地变量
2 iload_1 // 将第二个int型本地变量推送至操作数栈顶
3 istore_2 // 将操作数栈栈顶 int 型值存入第三个本地变量
4 return // 方法返回
二:基本变量的赋值
public void method2() {
Object a = new Object();
Object b = a;
}
该方法的字节码:
0 new #15 <java/lang/Object> // 创建一个对象,并将其引用压入栈顶
3 dup // 复制栈顶引用类型数据并将其值压入栈顶
4 invokespecial #1 <java/lang/Object.<init>> // 执行对象构造方法(使用了栈顶引用类型)
7 astore_1 // 将操作数栈栈顶引用类型数据值存入第二个本地变量 a
8 aload_1 // 将第二个引用类型本地变量推送至栈顶
9 astore_2 // 将栈顶引用类型数值存入第三个本地变量b
10 return // 方法返回
再看选项
-
A(✔):值类型的和引用类型的变量赋值就像上面一样,先把局部变量表中 a 的数值存入操作数栈,再取出来放入 b,不过区别在于:
-
前者在局部变量表中存放的数值是真正意义上的 a 代表的数据,所以说赋值操作是“复制(iload_1、istore_2)”一份出来再给 b
-
后者在局部变量表中存放的数值不是真正意义上 a 代表的数据,只是指向堆中对象的指针(指向 a 真正代表的数据)。赋值操作只是把 a 中数值即指针复制给 b ,堆中a代表正真的数据即对象(0x11)并没有被复制
-
-
B(✔):
-
"值类型数据是在栈(指虚拟机栈)上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。" :局部变量表(在虚拟机栈中)中存放数值的就是真正意义上的数据,不用访问堆,效率较高
-
“而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例(指向堆中对象)的指针,变量通过指针来引用实例。” :局部变量表中存放的数值是指向堆中数据(对象)的指针
-
-
C(✔):类可以继承,基本数据类型不能继承
-
D(X):“值类型变量的作用域主要是在栈上分配内存空间内”:如果是跟上诉一致在方法内定义的基本变量,它的作用域就在栈中;如果是在类中定义的成员变量例如 Class A 中有成员变量 int val,这个类的实例在堆中,那么 val 作用域也在堆中
题外话:操作数栈深度在编译期就已经决定
第十三题
以下说法哪个是正确的()
正确答案: A B C D 你的答案: B D (错误)
IOException在编译时会被发现
NullPointerEception在编译时不会被发现
SQLException在编译时会被发现
FileNotFoundException在编译时会被发现
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。
1、运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
ClassCastException(类转换异常)
ClassNotFoundException
IndexOutOfBoundsException(数组越界异常)
NullPointerException(空指针异常)
ArrayStoreException(数组存储异常,即数组存储类型不一致)
还有IO操作的BufferOverflowException异常
2、非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
IOException
- 点赞
- 收藏
- 关注作者
评论(0)