JavaSE - 練習(xí)面試題目 [3] 面向?qū)ο蟛糠?/h1>
1.哪個選項和show()方法重載
class Demo{
    void show(int a,int b,float c){}
}

A.void show(int a,float c,int b){}//yes
B,void show(int a,int b,float c){}//一模一樣吵血。不可以出現(xiàn)在同一個類中银亲。
C.int show(int a,float c,int b){return a;}//yes抵赢。
D.int show(int a,float c){return a;}//yes

2.方法的重載

方法重載(overload)必須滿足________
A. 在不同class中定義的方法 B.在同一類型中定義的方法
C. 方法名必須相同 D.返回類型必須相同
E. 參數(shù)一定不同 F.參數(shù)可以相同
答案:BCE

3.面向?qū)ο笕筇卣鞯恼f明

答:面向?qū)ο笥腥筇攸c:封裝贱傀、繼承磺平、多態(tài)。(如果要回答四個捉貌,可加上 抽象性 這一特點)

3.1繼承性:

繼承是一種聯(lián)結(jié)類的層次模型昔穴,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法剧蚣。對象的一個新類可以從現(xiàn)有的類中派生支竹,這個過程稱為類繼承。新類繼承了原始類的特性鸠按,新類稱為原始類的派生類(子類)礼搁,而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量目尖,并且類可以修改或增加新的方法使之更適合特殊的需要馒吴。

3.2 封裝性:

封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定義的界面瑟曲。面向?qū)ο笥嬎闶加谶@個基本概念饮戳,即現(xiàn)實世界可以被描繪成一系列完全自治、封裝的對象测蹲,這些對象通過一個受保護(hù)的接口訪問其他對象莹捡。

3.3 多態(tài)性:

多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性扣甲。多態(tài)性語言具有靈活篮赢、抽象齿椅、行為共享、代碼共享的優(yōu)勢启泣,很好的解決了應(yīng)用程序函數(shù)同名問題涣脚。
4.抽象性:
抽象就是忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面寥茫。抽象并不打算了解全部問題遣蚀,而只是選擇其中的一部分,暫時不用部分細(xì)節(jié)纱耻。抽象包括兩個方面芭梯,一是過程抽象,二是數(shù)據(jù)抽象弄喘。

4.作用域public,private,protected,以及默認(rèn)不寫時的區(qū)別
5.找錯
public class Something {
   void doSomething () {
       private String s = "";
       int l = s.length();
   }
}

有錯嗎?
答案: 錯玖喘。局部變量前不能放置任何訪問修飾符 (private,public蘑志,和protected)累奈。

6.Java的內(nèi)存管理之垃圾回收(了解)

分配:由JVM自動為其分配相應(yīng)的內(nèi)存空間
釋放:由JVM提供垃圾回收機(jī)制自動的釋放內(nèi)存空間
垃圾回收機(jī)制(GC:Garbage Collection):將垃圾對象所占用的堆內(nèi)存進(jìn)行回收。Java的垃圾回收機(jī)制是JVM提供的能力急但,由單獨的系統(tǒng)級垃圾回收線程在空閑時間以不定時的方式動態(tài)回收澎媒。
垃圾對象:不再被任何引用指向的對象。

面試題:
問:在程序中是否可以通知垃圾回收機(jī)制過來回收垃圾波桩?
能戒努,通過調(diào)用System.gc();或Runtime.getRuntime().gc();

再問:調(diào)用了System.gc();或Runtime.getRuntime().gc();后是立刻執(zhí)行垃圾回收嗎?
不是突委,該調(diào)用并不會立刻啟動垃圾回收機(jī)制開始回收柏卤,但會加快垃圾回收機(jī)制的運行。

7.構(gòu)造器Constructor是否可被override

答:構(gòu)造器Constructor不能被繼承匀油,因此不能重寫Override缘缚,但可以被重載Overload

7.簡答

當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性敌蚜,并可返回變化后的結(jié)果桥滨,那么這里到底是值傳遞還是引用傳遞?

答:是值傳遞。Java 編程語言只有值傳遞參數(shù)弛车。當(dāng)一個對象實例作為一個參數(shù)被傳遞到方法中時齐媒,參數(shù)的值就是對該對象的引用。對象的內(nèi)容可以在被調(diào)用的方法中改變纷跛,但對象的引用是永遠(yuǎn)不會改變的

8.java類是否可以多繼承喻括,怎么實現(xiàn)多繼承?

答:java沒有多繼承贫奠,但可以通過接口的形式來達(dá)到多繼承的目地唬血。

9.重載(overload)和重寫(overried望蜡,有的書也叫做“覆蓋”)的區(qū)別?

答:方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)拷恨。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn)脖律,重載Overloading是一個類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù)腕侄,我們說該方法被重寫 (Overriding)小泉。子類的對象使用這個方法時,將調(diào)用子類中的定義冕杠,對它而言微姊,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法分预,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類型柒桑,則稱為方法的重載(Overloading)。

10.Overload的方法是否可以改變返回值的類型噪舀?

Overloaded的方法是可以改變返回值的類型

11.寫出錯誤答案錯誤的原因
class Demo{
    int show(int a,int b){
        return 0;
    }
}

下面那些函數(shù)可以存在于Demo的子類中。
A.public int show(int a,int b){return 0;}//可以飘诗,覆蓋与倡。
B.private int show(int a,int b){return 0;}//不可以,權(quán)限不夠昆稿。
C.private int show(int a,long b){return 0;}//可以纺座,和父類不是一個函數(shù)。沒有覆蓋溉潭,相當(dāng)于重載净响。
D.public short show(int a,int b){return 0;}//不可以,因為該函數(shù)不可以和給定函數(shù)出現(xiàn)在同一類中喳瓣,或者子父類中馋贤。
E.static int show(int a,int b){return 0;}//不可以,靜態(tài)只能覆蓋靜態(tài)畏陕。

12.寫出程序結(jié)果
class Super {
    public int get() {
        return 4;
    }
}

class Demo15 extends Super {
    public long get() {
        return 5;
    }

    public static void main(String[] args) {
        Super s = new Demo15();
        System.out.println(s.get());
    }
}

編譯失敗配乓,因為子類父類中的get方法沒有覆蓋。但是子類調(diào)用時候不能明確返回的值是什么類型惠毁。所以這樣的函數(shù)不可以存在子父類中犹芹。

13.Object類的使用說明

我比較兩個String總是false,但是它們明明都是"abc" 鞠绰!
答:比較String一定要使用equals或equalsIgnoreCase方法腰埂,不要使用 ==
  ==比較的是兩個引用(變量)是否指向了同一個對象,而不是比較其內(nèi)容蜈膨。

14.為什么要重寫toString()方法屿笼?

方面打印對象,覆蓋Object的toString方法,Object的toString方法打印的是引用地址

15.為什么要重寫equals()方法牺荠?

如果不重寫equals,那么比較的將是對象的引用是否指向同一塊內(nèi)存地址刁卜,重寫之后目的是為了比較兩個對象的value值是否相等志电。特別指出利用equals比較八大包裝對象(如int,float等)和String類(因為該類已重寫了equals和hashcode方法)對象時蛔趴,默認(rèn)比較的是值挑辆,在比較其它自定義對象時都是比較的引用地址。
而且重寫equals方法必須重寫 hashCode方法
object對象中的 public boolean equals(Object obj)孝情,對于任何非空引用值 x 和 y鱼蝉,當(dāng)且僅當(dāng) x 和 y 引用同一個對象時,此方法才返回 true箫荡;
注意:當(dāng)此方法被重寫時魁亦,通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定羔挡,該協(xié)定聲明相等對象必須具有相等的哈希碼洁奈。如下:

(1)當(dāng)obj1.equals(obj2)為true時,obj1.hashCode() == obj2.hashCode()必須為true
(2)當(dāng)obj1.hashCode() == obj2.hashCode()為false時绞灼,obj1.equals(obj2)必須為false

hashcode是用于散列數(shù)據(jù)的快速存取利术,如利用HashSet/HashMap/Hashtable類來存儲數(shù)據(jù)時,都是根據(jù)存儲對象的hashcode值來進(jìn)行判斷是否相同的低矮。
這樣如果我們對一個對象重寫了equals印叁,意思是只要對象的成員變量值都相等那么equals就等于true,但不重寫hashcode军掂,那么我們再new一個新的對象轮蜕,當(dāng)原對象.equals(新對象)等于true時,兩者的hashcode卻是不一樣的蝗锥,由此將產(chǎn)生了理解的不一致跃洛,如在存儲散列集合時(如Set類),將會存儲了兩個值一樣的對象玛追,導(dǎo)致混淆税课,因此,就也需要重寫hashcode()痊剖。

16.寫出“==”和equals的區(qū)別

== 是比較的對象 是地址的引用
equals 是比較的內(nèi)容

17.包裝類的使用

寫出8中基本數(shù)據(jù)類型的包裝類
int 和 Integer 有什么區(qū)別
答:Java 提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)韩玩。
int是java的原始數(shù)據(jù)類型,Integer是java為int提供的封裝類陆馁。Java為每個原始類型提供了封裝類找颓。
原始類型封裝類型及其對應(yīng)的包裝類:boolean Boolean,char Character,byte Byte,short Short,int Integer,long Long,float Float,doubl Double
引用類型和原始類型的行為完全不同,并且它們具有不同的語義叮贩。
引用類型和原始類型具有不同的特征和用法击狮,它們包括:大小和速度問題佛析,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺省值彪蓬。對象引用實例變量的缺省值為 null寸莫,而原始類型實例變量的缺省值與它們的類型有關(guān)。

18.請寫出java基本數(shù)據(jù)類型及對應(yīng)的封裝類型档冬,并說明封裝類的作用膘茎。

boolean Boolean,
char Character,
byte Byte,
short Short,
int Integer,
long Long,
float Float,
double Double
包裝之后,int 是基本類型,Integer是引用類型
對于a你只能用來做計算。酷誓。比如加減乘除披坏。。

b你可以用來做很多事情盐数,因為他是一個對象棒拂,他有很多方法,你可以像使用String對象那樣使用它玫氢。 java.lang.Integer是一個類.對它的操作要通過類的方法帚屉,可以toString等,而int不行

另外漾峡,Integer對于-128到127之間的數(shù)涮阔,會進(jìn)行緩存,Integer i = 127時灰殴,會將127進(jìn)行緩存,下次再寫Integer j = 127時掰邢,就會直接從緩存中取牺陶,就不會new了

總結(jié)一下幾個點:
1.int 和Integer在進(jìn)行比較的時候,Integer會進(jìn)行拆箱辣之,轉(zhuǎn)為int值與int進(jìn)行比較掰伸。
2.Integer與Integer比較的時候,由于直接賦值的時候會進(jìn)行自動的裝箱怀估,那么這里就需要注意兩個問題狮鸭,一個是-128<= x<=127的整數(shù),將會直接緩存在IntegerCache中多搀,那么當(dāng)賦值在這個區(qū)間的時候歧蕉,不會創(chuàng)建新的Integer對象,而是從緩存中獲取已經(jīng)創(chuàng)建好的Integer對象康铭。二:當(dāng)大于這個范圍的時候惯退,直接new Integer來創(chuàng)建Integer對象。
3.new Integer(1) 和Integer a = 1不同从藤,前者會創(chuàng)建對象催跪,存儲在堆中锁蠕,而后者因為在-128到127的范圍內(nèi),不會創(chuàng)建新的對象懊蒸,而是從IntegerCache中獲取的荣倾。那么Integer a = 128, 大于該范圍的話才會直接通過new Integer(128)創(chuàng)建對象,進(jìn)行裝箱骑丸。

19.寫出程序結(jié)果
class Super {
    int i = 0;

    public Super(String s) {
        i = 1;
    }
}

class Demo extends Super {
    public Demo(String s) {

        i = 2;
    }

    public static void main(String[] args) {
        Demo d = new Demo("yes");
        System.out.println(d.i);
    }
}

//編譯失敗舌仍,因為父類中缺少空參數(shù)的構(gòu)造器。
//或者子類應(yīng)該通過super語句指定要調(diào)用的父類中的構(gòu)造器者娱。

20.main()方法

選擇題

class Test {
    public static void main(String[] args) {
        String foo = args[1];
        String bar = args[2];
        String baz = args[3];
    }
}

d:>java Test Red Green Blue

what is the value of baz?
A. baz has value of ""
B. baz has value of null
C. baz has value of "Red"
D. baz has value of "Blue" //正確
E. baz has value of "Green"
F. the code does not compile
G. the program throw an exception

21.選擇題:

1)下面關(guān)于接口的說法中不正確的是(C)抡笼。
A.接口中所有的方法都是抽象的
B.接口中所有的方法都是public訪問權(quán)限
C.子接口繼承父接口所用的關(guān)鍵字是implements
D.接口是Java中的特殊類,包含常量和抽象方法

public interface I extends Runner{

}

2)Java語言接口間的繼承關(guān)系是(A)黄鳍。
A.單繼承 B.多重繼承 C.不能繼承 D.不一定
3)一個類實現(xiàn)接口的情況是(A)推姻。
A.一次可以實現(xiàn)多個接口 B.一次只能實現(xiàn)一個接口
C.不能實現(xiàn)接口 D.不一定

22.填空題

1)____implements____是聲明接口的關(guān)鍵字,可以把它看成一個特殊類框沟。接口中的數(shù)據(jù)成員默認(rèn)的修飾符是public static final_藏古,接口中的成員方法默認(rèn)的修飾符是 public abstruct
2)如果實現(xiàn)某接口的類不是abstract的抽象類忍燥,則在類的定義部分必須該接口的所有抽象方法拧晕;如果實現(xiàn)某接口的類是abstract的抽象類,則它可以該接口所有的方法梅垄。但是對于這個抽象類任何一個非抽象的子類而言厂捞,它們父類所實現(xiàn)的接口中的所有抽象方法以及自身所實現(xiàn)接口中的抽象方法都必須有實在的。

23.abstract class 和interface 有什么區(qū)別?

答:聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstract class)队丝,它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類靡馁,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況机久。不能創(chuàng)建abstract 類的實例臭墨。然而可以創(chuàng)建一個變量,其類型是一個抽象類膘盖,并讓它指向具體子類的一個實例胧弛。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現(xiàn)侠畔,否則它們也是抽象類结缚。取而代之,在子類中實現(xiàn)該方法软棺。知道其行為的其它類可以在類中實現(xiàn)這些方法

接口(interface)是抽象類的變體掺冠。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得德崭。接口中的所有方法都是抽象的斥黑,沒有一個有程序體。接口只可以定義static final成員變量眉厨。接口的實現(xiàn)與子類相似锌奴,除了該實現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實現(xiàn)特殊接口時憾股,它定義(即將程序體給予)所有這種接口的方法鹿蜀。然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法服球。由于有抽象類茴恰,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效斩熊。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換往枣,instanceof 運算符可以用來決定某對象的類是否實現(xiàn)了接口

24.接口是否可繼承接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承實體類(concrete class)?

答案是: 接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口粉渠,
抽象類可繼承實體類分冈,但實體類必須不能是如下兩種情況之一:
1,final修飾符修飾的類是不能的
2霸株,如果此實體類有且僅有私有的構(gòu)造函數(shù)也是不能的雕沉。

25.是否能通過編譯?
interface  A{
   int x = 0;
}
class B{
   int x =1;
}
class C extends B implements A {
   public void pX(){
      System.out.println(x);  //super.x   A.x
   }
   public static void main(String[] args) {
      new C().pX();
   }
}

答案:錯誤去件。在編譯時會發(fā)生錯誤(錯誤描述不同的JVM有不同的信息坡椒,意思就是未明確的x調(diào)用,
兩個x都匹配(就象在同時import java.util和java.sql兩個包時直接聲明Date一樣)尤溜。對于父類的變量,可以用super.x來明確肠牲,
而接口的屬性默認(rèn)隱含為 public static final.所以可以通過A.x來明確。

26.內(nèi)部類

選擇題

public class OuterClass { 
  private double d1 = 1.0; 
    //insert code here 
} 

You need to insert an inner class declaration at line 3. Which two inner class declarations are valid?(Choose two.)
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
說明如下:
一.靜態(tài)內(nèi)部類可以有靜態(tài)成員靴跛,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員。 故 A渡嚣、B 錯
二.靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的靜態(tài)變量梢睛,而不可訪問外部類的非靜態(tài)變量;return d1 出錯识椰。
故 D 錯
三.非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量绝葡。 故 C 正確
四.答案為C、E

27.Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類腹鹉,是否可以implements(實現(xiàn))interface(接口)

答:匿名的內(nèi)部類是沒有名字的內(nèi)部類藏畅。不能extends(繼承) 其它類,但一個內(nèi)部類可以作為一個接口,由另一個內(nèi)部類實現(xiàn)

28.Static Nested Class 和 Inner Class的不同

答:Nested Class (一般是C++的說法)愉阎,Inner Class (一般是JAVA的說法)绞蹦。
Java內(nèi)部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。
注: 靜態(tài)內(nèi)部類(Inner Class)意味著
1創(chuàng)建一個static內(nèi)部類的對象榜旦,不需要一個外部類對象幽七,2不能從一個static內(nèi)部類的一個對象訪問一個外部類對象

29.寫出程序結(jié)果
class TD {
    int y = 6;

    class Inner {
        static int y = 3;

        void show() {
            System.out.println(y);
        }
    }
}

class TC {
    public static void main(String[] args) {
        TD.Inner ti = new TD().new Inner();
        ti.show();
    }
}

編譯失敗,非靜態(tài)內(nèi)部類中不可以定義靜態(tài)成員溅呢。
內(nèi)部類中如果定義了靜態(tài)成員澡屡,該內(nèi)部類必須被靜態(tài)修飾

30.判斷題

1)內(nèi)部類(可以/不可以)了解外部類
2)靜態(tài)內(nèi)部類用修飾。
3)外部類(可以/不可以)通過類名訪問靜態(tài)內(nèi)部類里的靜態(tài)成員(變量和方法)
4)外部類(可以/不可以)通過類名訪問非靜態(tài)內(nèi)部類里的成員(變量和方法)
5)非靜態(tài)內(nèi)部類可以訪問外部類的成員咐旧,也能訪問外部類的成員
6)靜態(tài)內(nèi)部類可以訪問外部類的成員驶鹉,不能訪問外部類的成員
7)非靜態(tài)內(nèi)部類(可以/不可以)用static修飾她的成員(變量和方法)

31.抽象類與抽象方法 abstract 的method 是否可同時是static,是否可同時是native铣墨,是否可同時是synchronized室埋?

答:都不能

32.抽象類和抽象方法之間的關(guān)系

定義抽象類和抽象方法的關(guān)鍵字是(abstruct)。抽象類中(可以)(可以/不可以)有抽象方法踏兜,(可以)(可以/不可以)有普通方法(可以)(可以/不可以)有屬性词顾;一個類中定義了抽象方法,那這個類(必須)(必須/不必須)用abstract修飾碱妆,即抽象類肉盹。

33.判斷題
abstract class Name {
   private String name;
   public abstract boolean isStupidName(String name) {}
}

這有何錯誤?
答案: 錯。abstract method必須以分號結(jié)尾疹尾,且不帶花括號上忍。

34.是否可以通過編譯?

abstract class Something {
private abstract String doSomething ();
}

答案: 錯纳本。abstract的methods不能以private修飾窍蓝。abstract的methods就是讓子類implement(實現(xiàn))具體細(xì)節(jié)的,怎么可以用private把a(bǔ)bstract method封鎖起來呢? (同理繁成,abstract method前不能加final)吓笙。

35.static的使用

是否可以從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用?
答:不可以,如果其中包含對象的method()巾腕;不能保證對象初始化.

36.編譯是否通過面睛?
public class Something {
     public static void main(String[] args) {
        Something s = new Something();
        System.out.println("s.doSomething() returns " + doSomething());
    }
    public String doSomething() {
        return "Do something ...";
    }
}

看上去很完美。
答案: 錯尊搬∪看上去在main里call doSomething沒有什么問題,畢竟兩個methods都在同一個class里佛寿。
但仔細(xì)看幌墓,main是static的。static method不能直接call non-static methods。
可改成"System.out.println("s.doSomething() returns " + s.doSomething());"常侣。
同理蜡饵,static method不能訪問non-static instant variable。

37.談?wù)刦inal, finally, finalize的區(qū)別(后面異常中講finally)

答:final—修飾符(關(guān)鍵字)如果一個類被聲明為final袭祟,意味著它不能再派生出新的子類验残,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的巾乳,又被聲明為final的您没。將變量或方法聲明為final,可以保證它們在使用中不被改變胆绊。被聲明為final的變量必須在聲明時給定初值氨鹏,而在以后的引用中只能讀取,不可修改压状。被聲明為final的方法也同樣只能使用仆抵,不能重載

finally—再異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個異常种冬,那么相匹配的 catch 子句就會執(zhí)行镣丑,然后控制就會進(jìn)入 finally 塊(如果有的話)

finalize—方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作娱两。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的莺匠。它是在 Object 類中定義的,因此所有的類都繼承了它十兢。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作趣竣。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的

38.如下程序是否可通過編譯?
public class Something {
   public int addOne(final int x) {
       return ++x;
   }
}

這個比較明顯旱物。
答案: 錯遥缕。int x被修飾成final,意味著x不能在addOne method中被修改宵呛。

如果修改為以下代碼就沒錯了

public class Something {
   public int addOne(final int x) {
       return x+1;
   }
}
39.如下程序是否可通過編譯单匣?
public class Something {
   public static void main(String[] args) {
       Other o = new Other();
       new Something().addOne(o);
   }
   public void addOne(final Other o) {
       o.i++;
   }
}
class Other {
   public int i;
}

和上面的很相似,都是關(guān)于final的問題宝穗,這有錯嗎?
答案: 正確户秤。在addOne method中,參數(shù)o被修飾成final讽营。如果在addOne method里我們修改了o的reference
(比如: o = new Other();),那么如同上例這題也是錯的泡徙。但這里修改的是o的member vairable
(成員變量)橱鹏,而o的reference并沒有改變。

40.是否可以通過編譯?
class Something {
    int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
} 

答案: 正確莉兰。輸出的是"i = 0"挑围。int i屬於instant variable (實例變量,或叫成員變量)糖荒。instant variable有default value杉辙。 int的default value是0。

41.是否可以通過編譯捶朵?

接上題

class Something {
    final int i;
    public void doSomething() {
        System.out.println("i = " + i);
    }
}

和上面一題只有一個地方不同蜘矢,就是多了一個final。這難道就錯了嗎?
答案: 錯综看。final int i是個final的instant variable (實例變量品腹,或叫成員變量)。final的instant variable沒有default value,必須在constructor (構(gòu)造器)結(jié)束之前被賦予一個明確的值〈眩可以修改為"final int i = 0;"铜幽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咬摇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖惧浴,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锡溯,居然都是意外死亡赶舆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門祭饭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芜茵,“玉大人,你說我怎么就攤上這事倡蝙【糯” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵寺鸥,是天一觀的道長猪钮。 經(jīng)常有香客問我,道長胆建,這世上最難降的妖魔是什么烤低? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮笆载,結(jié)果婚禮上扑馁,老公的妹妹穿的比我還像新娘涯呻。我一直安慰自己,他們只是感情好腻要,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布复罐。 她就那樣靜靜地躺著,像睡著了一般雄家。 火紅的嫁衣襯著肌膚如雪效诅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天趟济,我揣著相機(jī)與錄音乱投,去河邊找鬼。 笑死咙好,一個胖子當(dāng)著我的面吹牛篡腌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勾效,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘹悼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了层宫?” 一聲冷哼從身側(cè)響起杨伙,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萌腿,沒想到半個月后限匣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡毁菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年米死,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮庞。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡峦筒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窗慎,到底是詐尸還是另有隱情物喷,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布遮斥,位于F島的核電站峦失,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏术吗。R本人自食惡果不足惜尉辑,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望较屿。 院中可真熱鬧隧魄,春花似錦实幕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽末贾。三九已至闸溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拱撵,已是汗流浹背辉川。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拴测,地道東北人乓旗。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像集索,于是被迫代替她去往敵國和親屿愚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354