萌新卷妹带你攻略java选择题【2】

举报
京与旧铺 发表于 2022/10/31 17:27:10 2022/10/31
【摘要】 萌新卷妹带你攻略java选择题【2】👩‍💻博客主页:京与旧铺的博客主页✨欢迎关注🖱点赞🎀收藏⭐留言✒🔮本文由京与旧铺原创,csdn首发!😘系列专栏:java学习👕参考网站:牛客网💻首发时间:🎞2022年10月9日🎠🎨你做三四月的事,八九月就会有答案,一起加油吧🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大...

萌新卷妹带你攻略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

类变量在不设置初始值时,会进行默认值赋值,而局部方法中声明的变量则必须进行初始化,他不会进行默认值赋值。

第八题

以下代码执行的结果显示是多少( )?

img

正确答案: 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堆中的哪个位置)

先来两个例子,变量的赋值在内存中是怎么样的:

先上一张运行时数据区的网图

img

局部变量表、操作数栈在虚拟机栈中

一:基本变量的赋值

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

SqlException

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。