首页 > 试题广场 >

关于Java的一些概念,下面哪些描述是正确的:( &...

[不定项选择题]
关于Java的一些概念,下面哪些描述是正确的:(    )
  • 所有的Java异常和错误的基类都是java.lang.Exception, 包括java.lang.RuntimeException
  • 通过try … catch … finally语句,finally中的语句部分无论发生什么异常都会得到执行
  • java中所有的数据都是对象
  • Java通过垃圾回收回收不再引用的变量,垃圾回收时对象的finallize方法一定会得到执行
  • Java是跨平台的语言,无论通过哪个版本的Java编写的程序都能在所有的Java运行平台中运行
  • Java通过synchronized进行访问的同步,synchronized作用非静态成员方法和静态成员方法上同步的目标是不同的
A、java异常和错误的基类Throwable,包括Exception和Error
B、try...catch...finally finally不管什么异常都会执行
C、java是面向对象的,但是不是所有的都是对象,基本数据类型就不是对象,所以才会有封装类的;
D、如果是等待清理队列中如果又被调用,则不会执行finallize方法
E、JAVA跨平台性    实现在任意平台的java程序都可以在其他平台运行
F、synchronized实现方式:三种

编辑于 2019-09-11 12:33:58 回复(27)
A.错误(Error)的基类是Throwable
C.基本类型不是对象
D.垃圾回收器并不总是工作,只有当内存资源告急时,垃圾回收器才会工作;即使垃圾回收器工作,finalize方法也不一定得到执行,这是由于程序中的其他线程的优先级远远高于执行finalize()函数线程的优先级。(这是楼下的答案)
E.低版本JRE无法运行高版本JRE

发表于 2019-10-23 09:34:26 回复(9)
finalize在被JVM回收时会进行判断:1、如果此对象finalize未被执行过,则执行,并放置此对象到F-Queue中,此时,若在下次GC之前,重新与GC ROOTS建立引用连接,则对象"复活",下次GC时如果此对象又被GC,则直接进行回收,因为finalize只执行一次。2、如果此对象finalize已经执行过一次,则在GC时不执行finalize,直接回收
发表于 2019-09-18 18:25:58 回复(4)
1.Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。
2.Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。

发表于 2020-04-13 13:24:20 回复(1)
学java第一天就“万物皆对象“

看到很多人对F有疑问;
非静态锁的是实力的对象:多个非静态方法同时加了synchronized,互不影响
静态锁的是类:多个静态方法加了synchronized,如果其中一个方法被锁了,其他的静态方法是拿不到锁的,没法执行,只有等该方法执行结束,其它静态方法才能拿到锁

编辑于 2020-02-18 11:31:47 回复(3)
做了700多到第一次全对,心酸
发表于 2019-12-03 17:53:39 回复(23)
E选项:采用高版本的JDK编写的程序,在低版本的JRE中无法运行。
发表于 2019-10-19 16:22:43 回复(0)
D:1、垃圾回收器并不总是工作,只有当内存资源告急时,垃圾回收器才会工作;
  2、即使垃圾回收器工作,finalize方法也不一定得到执行,这是由于程序中的其他线程的优先级远远高于执行finalize()函数线程的优先级。
发表于 2019-09-11 10:49:17 回复(0)
D:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行
发表于 2019-09-09 08:50:11 回复(1)
A.异常和错误的基类是Throwable
B.不太严谨,发现异常在途中exit就不会执行
public class Test {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
            System.out.println("try");
        } catch (ArithmeticException e) {
            System.out.println("catch");
        }finally {
            System.exit(0);
            System.out.println("finally");
        }
    }
}
C.基本类型不属于对象,但是都有对应的包装类
D.finalize()方法只会被系统调用一次,多次被gc只有第一次会被调用
E.JDK版本问题

发表于 2021-11-23 10:54:28 回复(0)
这个b选项通过system.exit(0)就不执行了
发表于 2020-10-19 10:01:25 回复(1)
说好的万物皆对象呢
发表于 2021-03-15 15:57:58 回复(0)
对于其他的我没啥意见,但是对于D选项,我提一个自己的看法,他们说的如果该变量在等待清理队列被调用就不会调用finallize方法,我想说这是不对的,因为在进入等待清理队列时,gc会给该变量一个自救的机会,如果他重写了finallize方法他就可以执行,如果finallize中将其引用赋给某个变量时候他就自救成功了,如果没有就进等待队列,这里有第二次的自救机会,就是等待别人的调用,在回收前如果被调用,则也自救成功。。。如有错误还请指正
发表于 2020-12-22 13:16:01 回复(0)
synchronized锁普通成员方法的时候,锁的时执行该方法的对象。synchronized锁静态成员方法的时候,锁的是类信息。
发表于 2021-09-07 08:12:17 回复(0)
A:Java中所有错误和异常的父类为java.lang.Throwable;
C:基本数据类型不是对象,不能new;
D:Java垃圾回收器负责回收无用对象占据的内存资源,但对象没有使用new获取了一块特殊区域,这块特殊区域的 
   回收使用finallize;
E:JVM环境不同;
F:Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”
   Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。
发表于 2021-06-15 09:17:31 回复(0)
错误基类是error
发表于 2019-09-06 15:30:21 回复(1)
B选项的问题在牛客上已经存在已久了,这里不再赘述。这里谈一谈争议比较大的D选项。
判定一个对象 objA 是否可回收,至少要经历两次标记过程:
1. 如果对象 objA 到 GC Roots 没有引用链,则进行第一次标记。
2. 进行筛选,判断此对象是否有必要执行 finalize()方法:
    ①  如果对象 objA 没有重写 finalize()方法,或者 finalize() 方法已经被虚拟机调用过,则虚拟机视为 "没有必要执行",objA 被判定为不可触及的。
    ②  如果对象 objA 重写了 finalize() 方法,且还未执行过,那么 objA 会被插入到 F-Queue 队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其 finalize() 方法执行。
    ③  finalize() 方法时对象逃脱的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在 finalize()方法中与引用链上的任何一个对象建立了联系,那么第二次标记时,objA会被移出 "即将回收" 集合。之后,对象会再次出现没有引用存在的情况。这个情况下,finalize 方法不会被再次调用,对象会直接编程不可触及的状态,也就是说,一个对象的 finalize 方法只会被调用一次。
(PS:有错误请指正!)
发表于 2022-09-04 15:51:28 回复(1)
B其实不太严谨。finally不是必定会执行的。
发表于 2021-10-31 14:52:39 回复(1)

大哥们F怎么说

发表于 2020-01-08 09:56:58 回复(2)
基本类型的数据不是对象,是对象就必然是Object的子类,试下声明一个int类型的变量,看能不能点出来Object里的方法来,不行吧~
编辑于 2021-04-24 19:58:20 回复(0)