【280天】我愛刷題系列(39)

叨叨兩句

  1. 把金錢視爲工具,而不是財富java

  2. 人與人最美好的關係,是彼此成就程序員

牛客網——java專項練習019

1

關於 Java 線程,下面說法錯誤的是()。
正確答案: C異步

  1. 建立線程的方法有兩種:實現Runnable接口和繼承Thread類函數

  2. java利用線程使整個系統成爲異步工具

  3. 新線程一旦被建立,它將自動開始運行線程

建立線程的方法有三種:
(1)繼承Thread類,重寫run方法;
(2)實現Runnable接口,並將對象實例做爲參數傳遞給Thread類的構造方法;
(3)實現callable接口,並實現call方法,而且線程執行完畢後會有返回值。
注意:(1)和(2)都是調用start()方法啓動線程的,而後JVM虛擬機將此線程放到就緒隊列中,有處理機可用時,則執行run方法。這兩種方法都重寫了run方法,可是沒有返回值。

2

關於抽象類敘述正確的是? ( )code

正確答案: B對象

  1. 抽象類不能實現接口繼承

  2. 抽象類必須有「abstract class」修飾接口

  3. 抽象類必須包含抽象方法

  4. 抽象類也有類的特性,能夠被實例化

A.抽象類是能夠實現接口的,並且抽象類也能夠繼承自抽象類
B.對
C.抽象類指有abstract修飾的class,其能夠包含抽象方法,也能夠不包含
D.抽象類和接口都是不能被實例化的,只有具體的類才能夠被實例化

3

下列哪些語句關於 java 內存回收的說明是正確的?
正確答案: B

  1. 程序員必須建立一個線程來釋放內存

  2. 內存回收程序負責釋放無用內存

  3. 內存回收程序容許程序員直接釋放內存

  4. 內存回收程序能夠在指定的時間釋放內存對象

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

  1. 靜態塊 構造塊 構造塊 構造塊

  2. 構造塊 靜態塊 構造塊 構造塊

  3. 構造塊 構造塊 靜態塊 構造塊

  4. 構造塊 構造塊 構造塊 靜態塊

開始時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 靜態塊
相關文章
相關標籤/搜索