java常見面試題(三)

二:http://www.reibang.com/p/603cb432dd6f

1壶栋、描述一下JVM加載class文件的原理機(jī)制薪夕?
答:JVM中類的裝載是由類加載器(ClassLoader)和它的子類來(lái)實(shí)現(xiàn)的,Java中的類加載器是一個(gè)重要的Java運(yùn)行時(shí)系統(tǒng)組件赫蛇,它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件中的類浮庐。
由于Java的跨平臺(tái)性,經(jīng)過(guò)編譯的Java源程序并不是一個(gè)可執(zhí)行程序否淤,而是一個(gè)或多個(gè)類文件。當(dāng)Java程序需要使用某個(gè)類時(shí)棠隐,JVM會(huì)確保這個(gè)類已經(jīng)被加載石抡、連接(驗(yàn)證、準(zhǔn)備和解析)和初始化助泽。類的加載是指把類的.class文件中的數(shù)據(jù)讀入到內(nèi)存中啰扛,通常是創(chuàng)建一個(gè)字節(jié)數(shù)組讀入.class文件嚎京,然后產(chǎn)生與所加載類對(duì)應(yīng)的Class對(duì)象。加載完成后隐解,Class對(duì)象還不完整鞍帝,所以此時(shí)的類還不可用。當(dāng)類被加載后就進(jìn)入連接階段煞茫,這一階段包括驗(yàn)證帕涌、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號(hào)引用替換為直接引用)三個(gè)步驟。最后JVM對(duì)類進(jìn)行初始化续徽,包括:1)如果類存在直接的父類并且這個(gè)類還沒(méi)有被初始化蚓曼,那么就先初始化父類;2)如果類中存在初始化語(yǔ)句钦扭,就依次執(zhí)行這些初始化語(yǔ)句辟躏。
類的加載是由類加載器完成的,類加載器包括:根加載器(BootStrap)土全、擴(kuò)展加載器(Extension)捎琐、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)。從Java 2(JDK 1.2)開始裹匙,類加載過(guò)程采取了父親委托機(jī)制(PDM)瑞凑。PDM更好的保證了Java平臺(tái)的安全性,在該機(jī)制中概页,JVM自帶的Bootstrap是根加載器籽御,其他的加載器都有且僅有一個(gè)父類加載器。類的加載首先請(qǐng)求父類加載器加載惰匙,父類加載器無(wú)能為力時(shí)才由其子類加載器自行加載技掏。JVM不會(huì)向Java程序提供對(duì)Bootstrap的引用。下面是關(guān)于幾個(gè)類加載器的說(shuō)明:

Bootstrap:一般用本地代碼實(shí)現(xiàn)项鬼,負(fù)責(zé)加載JVM基礎(chǔ)核心類庫(kù)(rt.jar)哑梳;
Extension:從java.ext.dirs系統(tǒng)屬性所指定的目錄中加載類庫(kù),它的父加載器是Bootstrap绘盟;
System:又叫應(yīng)用類加載器鸠真,其父類是Extension。它是應(yīng)用最廣泛的類加載器龄毡。它從環(huán)境變量classpath或者系統(tǒng)屬性java.class.path所指定的目錄中記載類吠卷,是用戶自定義加載器的默認(rèn)父加載器。
22沦零、char 型變量中能不能存貯一個(gè)中文漢字祭隔,為什么?
答:char類型可以存儲(chǔ)一個(gè)中文漢字路操,因?yàn)镴ava中使用的編碼是Unicode(不選擇任何特定的編碼疾渴,直接使用字符在字符集中的編號(hào)千贯,這是統(tǒng)一的唯一方法),一個(gè)char類型占2個(gè)字節(jié)(16比特)程奠,所以放一個(gè)中文是沒(méi)問(wèn)題的。

補(bǔ)充:使用Unicode意味著字符在JVM內(nèi)部和外部有不同的表現(xiàn)形式祭钉,在JVM內(nèi)部都是Unicode瞄沙,當(dāng)這個(gè)字符被從JVM內(nèi)部轉(zhuǎn)移到外部時(shí)(例如存入文件系統(tǒng)中),需要進(jìn)行編碼轉(zhuǎn)換慌核。所以Java中有字節(jié)流和字符流距境,以及在字符流和字節(jié)流之間進(jìn)行轉(zhuǎn)換的轉(zhuǎn)換流,如InputStreamReader和OutputStreamReader垮卓,這兩個(gè)類是字節(jié)流和字符流之間的適配器類垫桂,承擔(dān)了編碼轉(zhuǎn)換的任務(wù);對(duì)于C程序員來(lái)說(shuō)粟按,要完成這樣的編碼轉(zhuǎn)換恐怕要依賴于union(聯(lián)合體/共用體)共享內(nèi)存的特征來(lái)實(shí)現(xiàn)了诬滩。

2、抽象類(abstract class)和接口(interface)有什么異同灭将?
答:抽象類和接口都不能夠?qū)嵗勰瘢梢远x抽象類和接口類型的引用。一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對(duì)其中的抽象方法全部進(jìn)行實(shí)現(xiàn)庙曙,否則該類仍然需要被聲明為抽象類空镜。接口比抽象類更加抽象,因?yàn)槌橄箢愔锌梢远x構(gòu)造器捌朴,可以有抽象方法和具體方法吴攒,而接口中不能定義構(gòu)造器而且其中的方法全部都是抽象方法。抽象類中的成員可以是private砂蔽、默認(rèn)洼怔、protected、public的左驾,而接口中的成員全都是public的茴厉。抽象類中可以定義成員變量,而接口中定義的成員變量實(shí)際上都是常量什荣。有抽象方法的類必須被聲明為抽象類矾缓,而抽象類未必要有抽象方法。

3稻爬、靜態(tài)嵌套類(Static Nested Class)和內(nèi)部類(Inner Class)的不同嗜闻?
答:Static Nested Class是被聲明為靜態(tài)(static)的內(nèi)部類,它可以不依賴于外部類實(shí)例被實(shí)例化桅锄。而通常的內(nèi)部類需要在外部類實(shí)例化后才能實(shí)例化琉雳,其語(yǔ)法看起來(lái)挺詭異的样眠,如下所示。

/**

  • 撲克類(一副撲克)
  • @author 駱昊

*/
public class Poker {
private static String[] suites = {"黑桃", "紅桃", "草花", "方塊"};
private static int[] faces = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

private Card[] cards;

/**
 * 構(gòu)造器
 * 
 */
public Poker() {
    cards = new Card[52];
    for(int i = 0; i < suites.length; i++) {
        for(int j = 0; j < faces.length; j++) {
            cards[i * 13 + j] = new Card(suites[i], faces[j]);
        }
    }
}

/**
 * 洗牌 (隨機(jī)亂序)
 * 
 */
public void shuffle() {
    for(int i = 0, len = cards.length; i < len; i++) {
        int index = (int) (Math.random() * len);
        Card temp = cards[index];
        cards[index] = cards[i];
        cards[i] = temp;
    }
}

/**
 * 發(fā)牌
 * @param index 發(fā)牌的位置
 * 
 */
public Card deal(int index) {
    return cards[index];
}

/**
 * 卡片類(一張撲克)
 * [內(nèi)部類]
 * @author 駱昊
 *
 */
public class Card {
    private String suite;   
    private int face;       

    public Card(String suite, int face) {
        this.suite = suite;
        this.face = face;
    }

    @Override
    public String toString() {
        String faceStr = "";
        switch(face) {
        case 1: faceStr = "A"; break;
        case 11: faceStr = "J"; break;
        case 12: faceStr = "Q"; break;
        case 13: faceStr = "K"; break;
        default: faceStr = String.valueOf(face);
        }
        return suite + faceStr;
    }
}

}
測(cè)試代碼:

class PokerTest {

public static void main(String[] args) {
    Poker poker = new Poker();
    poker.shuffle();                
    Poker.Card c1 = poker.deal(0);  
    
    
    Poker.Card c2 = poker.new Card("紅心", 1);    

    System.out.println(c1);     
    System.out.println(c2);     
}

}
面試題 - 下面的代碼哪些地方會(huì)產(chǎn)生編譯錯(cuò)誤翠肘?

class Outer {

class Inner {}

public static void foo() { new Inner(); }

public void bar() { new Inner(); }

public static void main(String[] args) {
    new Inner();
}

}
注意:Java中非靜態(tài)內(nèi)部類對(duì)象的創(chuàng)建要依賴其外部類對(duì)象檐束,上面的面試題中foo和main方法都是靜態(tài)方法,靜態(tài)方法中沒(méi)有this束倍,也就是說(shuō)沒(méi)有所謂的外部類對(duì)象被丧,因此無(wú)法創(chuàng)建內(nèi)部類對(duì)象,如果要在靜態(tài)方法中創(chuàng)建內(nèi)部類對(duì)象绪妹,可以這樣做:

new Outer().new Inner();

4甥桂、Java 中會(huì)存在內(nèi)存泄漏嗎,請(qǐng)簡(jiǎn)單描述邮旷。
答:理論上Java因?yàn)橛欣厥諜C(jī)制(GC)不會(huì)存在內(nèi)存泄露問(wèn)題(這也是Java被廣泛使用于服務(wù)器端編程的一個(gè)重要原因)黄选;然而在實(shí)際開發(fā)中,可能會(huì)存在無(wú)用但可達(dá)的對(duì)象婶肩,這些對(duì)象不能被GC回收办陷,因此也會(huì)導(dǎo)致內(nèi)存泄露的發(fā)生。例如Hibernate的Session(一級(jí)緩存)中的對(duì)象屬于持久態(tài)律歼,垃圾回收器是不會(huì)回收這些對(duì)象的懂诗,然而這些對(duì)象中可能存在無(wú)用的垃圾對(duì)象,如果不及時(shí)關(guān)閉(close)或清空(flush)一級(jí)緩存就可能導(dǎo)致內(nèi)存泄露苗膝。下面例子中的代碼也會(huì)導(dǎo)致內(nèi)存泄露殃恒。

import java.util.Arrays;
import java.util.EmptyStackException;

public class MyStack {
private T[] elements;
private int size = 0;

private static final int INIT_CAPACITY = 16;

public MyStack() {
    elements = (T[]) new Object[INIT_CAPACITY];
}

public void push(T elem) {
    ensureCapacity();
    elements[size++] = elem;
}

public T pop() {
    if(size == 0) 
        throw new EmptyStackException();
    return elements[--size];
}

private void ensureCapacity() {
    if(elements.length == size) {
        elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

}
上面的代碼實(shí)現(xiàn)了一個(gè)棧(先進(jìn)后出(FILO))結(jié)構(gòu),乍看之下似乎沒(méi)有什么明顯的問(wèn)題辱揭,它甚至可以通過(guò)你編寫的各種單元測(cè)試离唐。然而其中的pop方法卻存在內(nèi)存泄露的問(wèn)題,當(dāng)我們用pop方法彈出棧中的對(duì)象時(shí)问窃,該對(duì)象不會(huì)被當(dāng)作垃圾回收亥鬓,即使使用棧的程序不再引用這些對(duì)象,因?yàn)闂?nèi)部維護(hù)著對(duì)這些對(duì)象的過(guò)期引用(obsolete reference)域庇。在支持垃圾回收的語(yǔ)言中嵌戈,內(nèi)存泄露是很隱蔽的,這種內(nèi)存泄露其實(shí)就是無(wú)意識(shí)的對(duì)象保持听皿。如果一個(gè)對(duì)象引用被無(wú)意識(shí)的保留起來(lái)了熟呛,那么垃圾回收器不會(huì)處理這個(gè)對(duì)象,也不會(huì)處理該對(duì)象引用的其他對(duì)象尉姨,即使這樣的對(duì)象只有少數(shù)幾個(gè)庵朝,也可能會(huì)導(dǎo)致很多的對(duì)象被排除在垃圾回收之外,從而對(duì)性能造成重大影響,極端情況下會(huì)引發(fā)Disk Paging(物理內(nèi)存與硬盤的虛擬內(nèi)存交換數(shù)據(jù))九府,甚至造成OutOfMemoryError椎瘟。

5、抽象的(abstract)方法是否可同時(shí)是靜態(tài)的(static),是否可同時(shí)是本地方法(native)侄旬,是否可同時(shí)被synchronized修飾肺蔚?
答:都不能。抽象方法需要子類重寫儡羔,而靜態(tài)的方法是無(wú)法被重寫的宣羊,因此二者是矛盾的。本地方法是由本地代碼(如C代碼)實(shí)現(xiàn)的方法笔链,而抽象方法是沒(méi)有實(shí)現(xiàn)的段只,也是矛盾的腮猖。synchronized和方法的實(shí)現(xiàn)細(xì)節(jié)有關(guān)鉴扫,抽象方法不涉及實(shí)現(xiàn)細(xì)節(jié),因此也是相互矛盾的澈缺。

6坪创、闡述靜態(tài)變量和實(shí)例變量的區(qū)別。
答:靜態(tài)變量是被static修飾符修飾的變量姐赡,也稱為類變量莱预,它屬于類,不屬于類的任何一個(gè)對(duì)象项滑,一個(gè)類不管創(chuàng)建多少個(gè)對(duì)象依沮,靜態(tài)變量在內(nèi)存中有且僅有一個(gè)拷貝;實(shí)例變量必須依存于某一實(shí)例枪狂,需要先創(chuàng)建對(duì)象然后通過(guò)對(duì)象才能訪問(wèn)到它危喉。靜態(tài)變量可以實(shí)現(xiàn)讓多個(gè)對(duì)象共享內(nèi)存。

補(bǔ)充:在Java開發(fā)中州疾,上下文類和工具類中通常會(huì)有大量的靜態(tài)成員辜限。

7、是否可以從一個(gè)靜態(tài)(static)方法內(nèi)部發(fā)出對(duì)非靜態(tài)(non-static)方法的調(diào)用严蓖?
答:不可以薄嫡,靜態(tài)方法只能訪問(wèn)靜態(tài)成員,因?yàn)榉庆o態(tài)方法的調(diào)用要先創(chuàng)建對(duì)象颗胡,在調(diào)用靜態(tài)方法時(shí)可能對(duì)象并沒(méi)有被初始化毫深。

8、如何實(shí)現(xiàn)對(duì)象克露疽獭费什?
答:有兩種方式:
??1). 實(shí)現(xiàn)Cloneable接口并重寫Object類中的clone()方法;
??2). 實(shí)現(xiàn)Serializable接口,通過(guò)對(duì)象的序列化和反序列化實(shí)現(xiàn)克隆鸳址,可以實(shí)現(xiàn)真正的深度克隆瘩蚪,代碼如下。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class MyUtil {

private MyUtil() {
    throw new AssertionError();
}

public static  T clone(T obj) throws Exception {
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bout);
    oos.writeObject(obj);

    ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bin);
    return (T) ois.readObject();

    
    
}

}
下面是測(cè)試代碼:

import java.io.Serializable;

/**

  • 人類
  • @author 駱昊

*/
class Person implements Serializable {
private static final long serialVersionUID = -9102017020286042305L;

private String name;    
private int age;        
private Car car;        

public Person(String name, int age, Car car) {
    this.name = name;
    this.age = age;
    this.car = car;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public Car getCar() {
    return car;
}

public void setCar(Car car) {
    this.car = car;
}

@Override
public String toString() {
    return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}

}
/**

  • 小汽車類
  • @author 駱昊

*/
class Car implements Serializable {
private static final long serialVersionUID = -5713945027627603702L;

private String brand;       
private int maxSpeed;       

public Car(String brand, int maxSpeed) {
    this.brand = brand;
    this.maxSpeed = maxSpeed;
}

public String getBrand() {
    return brand;
}

public void setBrand(String brand) {
    this.brand = brand;
}

public int getMaxSpeed() {
    return maxSpeed;
}

public void setMaxSpeed(int maxSpeed) {
    this.maxSpeed = maxSpeed;
}

@Override
public String toString() {
    return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
}

}
class CloneTest {

public static void main(String[] args) {
    try {
        Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
        Person p2 = MyUtil.clone(p1);   
        p2.getCar().setBrand("BYD");
        
        
        
        System.out.println(p1);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
注意:基于序列化和反序列化實(shí)現(xiàn)的克隆不僅僅是深度克隆稿黍,更重要的是通過(guò)泛型限定疹瘦,可以檢查出要克隆的對(duì)象是否支持序列化,這項(xiàng)檢查是編譯器完成的巡球,不是在運(yùn)行時(shí)拋出異常言沐,這種是方案明顯優(yōu)于使用Object類的clone方法克隆對(duì)象。讓問(wèn)題在編譯的時(shí)候暴露出來(lái)總是優(yōu)于把問(wèn)題留到運(yùn)行時(shí)酣栈。

9险胰、GC是什么?為什么要有GC矿筝?
答:GC是垃圾收集的意思起便,內(nèi)存處理是編程人員容易出現(xiàn)問(wèn)題的地方,忘記或者錯(cuò)誤的內(nèi)存回收會(huì)導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰窖维,Java提供的GC功能可以自動(dòng)監(jiān)測(cè)對(duì)象是否超過(guò)作用域從而達(dá)到自動(dòng)回收內(nèi)存的目的榆综,Java語(yǔ)言沒(méi)有提供釋放已分配內(nèi)存的顯示操作方法。Java程序員不用擔(dān)心內(nèi)存管理铸史,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理鼻疮。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() 琳轿,但JVM可以屏蔽掉顯示的垃圾回收調(diào)用判沟。
垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存崭篡。垃圾回收器通常是作為一個(gè)單獨(dú)的低優(yōu)先級(jí)的線程運(yùn)行挪哄,不可預(yù)知的情況下對(duì)內(nèi)存堆中已經(jīng)死亡的或者長(zhǎng)時(shí)間沒(méi)有使用的對(duì)象進(jìn)行清除和回收,程序員不能實(shí)時(shí)的調(diào)用垃圾回收器對(duì)某個(gè)對(duì)象或所有對(duì)象進(jìn)行垃圾回收媚送。在Java誕生初期中燥,垃圾回收是Java最大的亮點(diǎn)之一,因?yàn)榉?wù)器端的編程需要有效的防止內(nèi)存泄露問(wèn)題塘偎,然而時(shí)過(guò)境遷疗涉,如今Java的垃圾回收機(jī)制已經(jīng)成為被詬病的東西。移動(dòng)智能終端用戶通常覺得iOS的系統(tǒng)比Android系統(tǒng)有更好的用戶體驗(yàn)吟秩,其中一個(gè)深層次的原因就在于Android系統(tǒng)中垃圾回收的不可預(yù)知性咱扣。

補(bǔ)充:垃圾回收機(jī)制有很多種,包括:分代復(fù)制垃圾回收涵防、標(biāo)記垃圾回收闹伪、增量垃圾回收等方式。標(biāo)準(zhǔn)的Java進(jìn)程既有棧又有堆。棧保存了原始型局部變量偏瓤,堆保存了要?jiǎng)?chuàng)建的對(duì)象杀怠。Java平臺(tái)對(duì)堆內(nèi)存回收和再利用的基本算法被稱為標(biāo)記和清除,但是Java對(duì)其進(jìn)行了改進(jìn)厅克,采用“分代式垃圾收集”赔退。這種方法會(huì)跟Java對(duì)象的生命周期將堆內(nèi)存劃分為不同的區(qū)域,在垃圾收集過(guò)程中证舟,可能會(huì)將對(duì)象移動(dòng)到不同區(qū)域:

  • 伊甸園(Eden):這是對(duì)象最初誕生的區(qū)域硕旗,并且對(duì)大多數(shù)對(duì)象來(lái)說(shuō),這里是它們唯一存在過(guò)的區(qū)域女责。
  • 幸存者樂(lè)園(Survivor):從伊甸園幸存下來(lái)的對(duì)象會(huì)被挪到這里漆枚。
  • 終身頤養(yǎng)園(Tenured):這是足夠老的幸存對(duì)象的歸宿旱函。年輕代收集(Minor-GC)過(guò)程是不會(huì)觸及這個(gè)地方的咕村。當(dāng)年輕代收集不能把對(duì)象放進(jìn)終身頤養(yǎng)園時(shí)渊额,就會(huì)觸發(fā)一次完全收集(Major-GC)席吴,這里可能還會(huì)牽扯到壓縮,以便為大對(duì)象騰出足夠的空間姨涡。

與垃圾回收相關(guān)的JVM參數(shù):

-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年輕代的大小
-XX:-DisableExplicitGC — 讓System.gc()不產(chǎn)生任何作用
-XX:+PrintGCDetails — 打印GC的細(xì)節(jié)
-XX:+PrintGCDateStamps — 打印GC操作的時(shí)間戳
-XX:NewSize / XX:MaxNewSize — 設(shè)置新生代大小/新生代最大大小
-XX:NewRatio — 可以設(shè)置老生代和新生代的比例
-XX:PrintTenuringDistribution — 設(shè)置每次新生代GC后輸出幸存者樂(lè)園中對(duì)象年齡的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:設(shè)置老年代閥值的初始值和最大值
-XX:TargetSurvivorRatio:設(shè)置幸存區(qū)的目標(biāo)使用率
10、String s = new String("xyz");創(chuàng)建了幾個(gè)字符串對(duì)象?
答:兩個(gè)對(duì)象吱肌,一個(gè)是靜態(tài)區(qū)的"xyz",一個(gè)是用new創(chuàng)建在堆上的對(duì)象仰禽。

11氮墨、接口是否可繼承(extends)接口?抽象類是否可實(shí)現(xiàn)(implements)接口吐葵?抽象類是否可繼承具體類(concrete class)规揪?
答:接口可以繼承接口,而且支持多重繼承温峭。抽象類可以實(shí)現(xiàn)(implements)接口猛铅,抽象類可繼承具體類也可以繼承抽象類。

12凤藏、一個(gè)".java"源文件中是否可以包含多個(gè)類(不是內(nèi)部類)奸忽?有什么限制?
答:可以揖庄,但一個(gè)源文件中最多只能有一個(gè)公開類(public class)而且文件名必須和公開類的類名完全保持一致栗菜。

13、Anonymous Inner Class(匿名內(nèi)部類)是否可以繼承其它類蹄梢?是否可以實(shí)現(xiàn)接口疙筹?
答:可以繼承其他類或?qū)崿F(xiàn)其他接口,在Swing編程和Android開發(fā)中常用此方式來(lái)實(shí)現(xiàn)事件監(jiān)聽和回調(diào)。

14而咆、內(nèi)部類可以引用它的包含類(外部類)的成員嗎霍比?有沒(méi)有什么限制?
答:一個(gè)內(nèi)部類對(duì)象可以訪問(wèn)創(chuàng)建它的外部類對(duì)象的成員暴备,包括私有成員桂塞。

15、Java 中的final關(guān)鍵字有哪些用法馍驯?
答:(1)修飾類:表示該類不能被繼承阁危;(2)修飾方法:表示方法不能被重寫;(3)修飾變量:表示變量只能一次賦值以后值不能被修改(常量)汰瘫。

16狂打、指出下面程序的運(yùn)行結(jié)果。

class A {

static {
    System.out.print("1");
}

public A() {
    System.out.print("2");
}

}

class B extends A{

static {
    System.out.print("a");
}

public B() {
    System.out.print("b");
}

}

public class Hello {

public static void main(String[] args) {
    A ab = new B();
    ab = new B();
}

}
答:執(zhí)行結(jié)果:1a2b2b混弥。創(chuàng)建對(duì)象時(shí)構(gòu)造器的調(diào)用順序是:先初始化靜態(tài)成員趴乡,然后調(diào)用父類構(gòu)造器,再初始化非靜態(tài)成員蝗拿,最后調(diào)用自身構(gòu)造器晾捏。

提示:如果不能給出此題的正確答案,說(shuō)明之前第21題Java類加載機(jī)制還沒(méi)有完全理解哀托,趕緊再看看吧惦辛。

17、數(shù)據(jù)類型之間的轉(zhuǎn)換:

  • 如何將字符串轉(zhuǎn)換為基本數(shù)據(jù)類型仓手?
  • 如何將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串胖齐?
    答:
  • 調(diào)用基本數(shù)據(jù)類型對(duì)應(yīng)的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應(yīng)基本類型;
  • 一種方法是將基本數(shù)據(jù)類型與空字符串("")連接(+)即可獲得其所對(duì)應(yīng)的字符串嗽冒;另一種方法是調(diào)用String 類中的valueOf()方法返回相應(yīng)字符串

18呀伙、如何實(shí)現(xiàn)字符串的反轉(zhuǎn)及替換?
答:方法很多添坊,可以自己寫實(shí)現(xiàn)也可以使用String或StringBuffer/StringBuilder中的方法剿另。有一道很常見的面試題是用遞歸實(shí)現(xiàn)字符串反轉(zhuǎn),代碼如下所示:

public static String reverse(String originStr) {
    if(originStr == null || originStr.length() <= 1) 
        return originStr;
    return reverse(originStr.substring(1)) + originStr.charAt(0);
}

19贬蛙、怎樣將GB2312編碼的字符串轉(zhuǎn)換為ISO-8859-1編碼的字符串雨女?
答:代碼如下所示:

String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

最后

想領(lǐng)取免費(fèi)資料的朋友,歡迎加群957734884


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末速客,一起剝皮案震驚了整個(gè)濱河市戚篙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溺职,老刑警劉巖岔擂,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件位喂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乱灵,警方通過(guò)查閱死者的電腦和手機(jī)塑崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痛倚,“玉大人规婆,你說(shuō)我怎么就攤上這事〔跷龋” “怎么了抒蚜?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耘戚。 經(jīng)常有香客問(wèn)我嗡髓,道長(zhǎng),這世上最難降的妖魔是什么收津? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任饿这,我火速辦了婚禮,結(jié)果婚禮上撞秋,老公的妹妹穿的比我還像新娘长捧。我一直安慰自己,他們只是感情好吻贿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布串结。 她就那樣靜靜地躺著,像睡著了一般廓八。 火紅的嫁衣襯著肌膚如雪奉芦。 梳的紋絲不亂的頭發(fā)上赵抢,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天剧蹂,我揣著相機(jī)與錄音,去河邊找鬼烦却。 笑死宠叼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的其爵。 我是一名探鬼主播冒冬,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摩渺!你這毒婦竟也來(lái)了简烤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摇幻,失蹤者是張志新(化名)和其女友劉穎横侦,沒(méi)想到半個(gè)月后挥萌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枉侧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年引瀑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榨馁。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憨栽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翼虫,到底是詐尸還是另有隱情屑柔,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布珍剑,位于F島的核電站锯蛀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏次慢。R本人自食惡果不足惜旁涤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迫像。 院中可真熱鬧劈愚,春花似錦、人聲如沸闻妓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)由缆。三九已至注祖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間均唉,已是汗流浹背是晨。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舔箭,地道東北人罩缴。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像层扶,于是被迫代替她去往敵國(guó)和親箫章。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容