Java基礎知識

2021-07-25 13:43:54 字數 3455 閱讀 5789

今天在牛客網刷題時碰到了這樣一道題,感覺是很基礎的知識點,但是要做出來並不容易,先來看一下題目

/**

* created by zmt on 2016/12/22.

*/public class test

static class a

public void setvalue(int value)

public int getvalue() catch(exception e) finally

return value;}}

static class b extends a

public void setvalue(int value)}}

寫出上述**執行完成後的輸出結果,這道題考的就是**執行順序的知識,如果大家不是很清楚,最直接的方法就是單步除錯一下,這樣就清楚了,我在每個方法上打上斷點,開始除錯看下執行過程。

首先是main方法,new了乙個b物件,然後就是呼叫該物件的getvalue()方法,這個沒什麼好說的。

接下來就要執行b類的構造方法了,這個也沒啥說的

然後執行b的構造方法,super(5);也就是呼叫b的父類a的構造方法,應該是到a構造的setvalue()方法,同時a的成員變數value的值被賦為5,通過除錯可以清楚的看到。

接下來就是執行setvalue()方法了,但是此時a類和b類都有乙個setvalue()方法,到底執行哪乙個呢,我一開始認為是a類的setvalue()方法,但是結果並不是這樣的,看下除錯過程。

執行的是b的setvalue()方法,,,因為現在正在執行b類的構造方法,所以預設先會呼叫b類中的方法,如果b類中沒有,才會呼叫其父類a中的方法。我們繼續看,,,接下來到super.setvalue(2 * value),即執行a類的setvalue()方法,這時,a類的成員變數value應該就變成了10

繼續往下看,這時b類的構造方法中的super(5)就執行完了,然後就到了setvalue(getvalue() - 3)方法

接著執行getvalue()方法,首先在b類中找,但b類沒有getvalue()方法,所以就執行a類中的getvalue()方法,a類中肯定是有的,要不然編譯就不會通過

然後就開始執行try、catch、finally這一塊,給a的成員變數value自增,從之前的10變為11,然後直接返回value,沒有捕獲異常,繼續到finally裡面的this.setvalue(value)

然後這個this指的到底是a類還是b類呢,答案是b類,因為現在是在執行b的構造方法,所以this指的應該是b類,即呼叫b類的setvalue(int value)方法

然後又super.setvalue(2 * value);執行父類a的setvalue(int value),把2 * 11作為引數傳遞,a類的setvalue(int value)把傳進來的value值賦給了a的成員變數value,變成了22。

然後this.setvalue(value)就執行完了,最後輸出value,22

到這兒getvalue()方法就執行完了,但是有一點需要注意,此時的value為22,但是getvalue()的返回值確是11,因為在try中已經return了,所以這個方法的返回值級已經儲存下來了,是11,即使finally裡面又對value的值做出了改變,但是getvalue()的返回值是不會變的。接著繼續執行b類構造方法中的setvalue(getvalue() - 3);getvalue()是11,所以b的setvalue(int value)方法的引數就為8,接著又到了super.setvalue(2 * value)

呼叫a類的setvalue(int value)方法,同時將引數賦值給a類的成員變數value,此時value變為16

到這兒b類的構造方法就全部執行完了,也就是new b(),然後又呼叫了該物件 的getvalue()方法,b類沒有,但是父類a有,所以,

繼續try、catch、finally,a類的成員變數value為16,然後value++,再返回,這時getvalue()的返回值已經確定了,就是17,即使在finally中對value做出改變,其返回值不會變。然後到finally,又是this.setvalue(value),前面已經說過了,這個this指的是b類的this,所以呼叫b類的setvalue(int value)

接著又是super.setvalue(2 * value),呼叫a類的setvalue(),並把2 * 17作為引數傳遞過去

把引數賦給a的成員變數value,這時this.setvalue(value)就執行完了,此時的value為34。最後輸出value。

需要注意的是,此時的getvalue()方法的返回值是17,這個前面已經提到了,到這兒,整個new b().getvalue()就執行完了,最後又輸出了getvalue的返回值,也就是17。所以整個過程執行完後的輸出結果是22、34、17。。。。。。

這道題雖然饒了很多彎,但是我們做完後發現整體過程其實並不是很複雜,就是自類繼承父類,呼叫方法時先是呼叫子類中的方法,如果沒有就呼叫父類中的方法,還有一點就是try、catch、finally返回值的問題,一旦try中返回了某乙個值,如果finally有返回值,finally中的返回值會覆蓋try的返回值,如果finally沒有返回值,就是try中的返回值。掌握了這些,這道題就顯得很簡單了。

java 基礎知識

1.複製。賦值操作。就是先將其本身加乙個變數再賦值給其本身。如a b就是a a b 2.比較兩個值或者說是位址是否相同 指向同乙個物件 和 或 3.操作符是if else操作的縮寫,如果 右邊判斷為true則返回 左邊的計算結果。右邊錯誤,返回 右邊的計算結果。在class09裡面有例子。4.流程控...

Java基礎知識

1 物件導向的特徵有哪些方面 1.抽象 抽象就是忽略乙個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是資料抽象。2.繼承 繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用...

JAVA基礎知識

一 關鍵字 由以下關鍵字修飾的變數 方法和類所具有的特性如下 public 包內及包外的任何類中均可訪問 private 包內及包外的任何類中均無權訪問 protected 包內的任何類以及包外的那些繼承了此類的子類中均可訪問 friendly 如果不以如上關鍵字修飾,則預設為friendly型別,...