下面有关java类加载器牛客网_牛客网——java专项练习019

1

关于 Java 线程,下面说法错误的是()。

正确答案: C

创建线程的方法有两种:实现Runnable接口和继承Thread类

java利用线程使整个系统成为异步

新线程一旦被创建,它将自动开始运行

创建线程的方法有三种:

(1)继承Thread类,重写run方法;

(2)实现Runnable接口,并将对象实例作为参数传递给Thread类的构造方法;

(3)实现callable接口,并实现call方法,并且线程执行完毕后会有返回值。

注意:(1)和(2)都是调用start()方法启动线程的,然后JVM虚拟机将此线程放到就绪队列中,有处理机可用时,则执行run方法。这两种方法都重写了run方法,但是没有返回值。

2

关于抽象类叙述正确的是? ( )

正确答案: B

抽象类不能实现接口

抽象类必须有“abstract class”修饰

抽象类必须包含抽象方法

抽象类也有类的特性,可以被实例化

A.抽象类是可以实现接口的,而且抽象类也可以继承自抽象类

B.对

C.抽象类指有abstract修饰的class,其可以包含抽象方法,也可以不包含

D.抽象类和接口都是不能被实例化的,只有具体的类才可以被实例化

3

下列哪些语句关于 java 内存回收的说明是正确的?

正确答案: B

程序员必须创建一个线程来释放内存

内存回收程序负责释放无用内存

内存回收程序允许程序员直接释放内存

内存回收程序可以在指定的时间释放内存对象

A:垃圾回收程序是一般是在堆上分配空间不够的时候会自己进行一次GC,程序员不需要也不能主动释放内存。

B:Java的内存释放由垃圾回收程序来进行释放

C:在Java里,内存的释放由垃圾回收程序进行管理,程序员不能直接进行释放。

D:程序员可以调用System.gc()运行垃圾回收器,但是不能指定时间。

4

以下代码的输出结果是?

public class B

{

public static B t1 = new B();

public static B t2 = new B();

{

System.out.println("构造块");

}

static

{

System.out.println("静态块");

}

public static void main(String[] args)

{

B t = new B();

}

}

正确答案: C

静态块 构造块 构造块 构造块

构造块 静态块 构造块 构造块

构造块 构造块 静态块 构造块

构造块 构造块 构造块 静态块

开始时JVM加载B.class,对所有的静态成员进行声明,t1 t2被初始化为默认值,为null,又因为t1 t2需要被显式初始化,所以对t1进行显式初始化,初始化代码块→构造函数(没有就是调用默认的构造函数),咦!静态代码块咋不初始化?因为在开始时已经对static部分进行了初始化,虽然只对static变量进行了初始化,但在初始化t1时也不会再执行static块了,因为JVM认为这是第二次加载类B了,所以static会在t1初始化时被忽略掉,所以直接初始化非static部分,也就是构造块部分(输出''构造块'')接着构造函数(无输出)。接着对t2进行初始化过程同t1相同(输出'构造块'),此时就对所有的static变量都完成了初始化,接着就执行static块部分(输出'静态块'),接着执行,main方法,同样也,new了对象,调用构造函数输出('构造块')

之前我一直有一个误区!就是认为静态块一定是最先初始化的!但是,阿里爸爸今天又用一记重拳猛击我的脸,额,好疼....当时的情况是这样的:

我在牛客网找虐中,碰到了这样的一道题,心中充满了鄙夷,心想"这tm还用看吗,肯定先是静态块,再接着三个构造块,弱鸡题",但是 = = ,答案却是"构造块 构造块 静态块 构造块".

......[黑线|||||||||]

于是总结了一下,以警后世 - -

正确的理解是这样的:

并不是静态块最先初始化,而是静态域.(BM:啊!多么痛的领悟!)

而静态域中包含静态变量、静态块和静态方法,其中需要初始化的是静态变量和静态块.而他们两个的初始化顺序是靠他们俩的位置决定的!

So!

初始化顺序是 t1 t2 静态块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值