Java基礎易錯部分(完結)

學習需要沉澱!耐心看此文的踩坑總結,相信你會學到更多的Java知識。本文將持續更新。最新更新時間2019/09/21 16:49

目錄直通車

一、關於Java平臺

二、Java語言概論

1、Java獨立於平臺的原因

三、基本數據類型

1、合法定義變量名

2、整數的定義

3、單精度數的定義

4、Boolean值轉爲某類型的問題

5、某類型轉爲int類型的問題

6、整型常量的字長問題

四、運算符與表達式

1、運算符的優先級

2、Java位運算符

移位運算符規律

3、i++與++i的區別

4、&和&&的區別

五、流程控制

1、switch(expression) 語句

2、跳轉語句

六、繼承、多態、高級類特性和數組

1、繼承

七、線程

1、補腦內容

2、線程易錯內容整理


一、關於Java平臺

SUN公司將Java劃分爲三個技術平臺:JavaEE、JavaME、JavaSE。

簡述

①SE最基本的版本,做桌面開發;

②EE企業級開發,指WEB B/S結構開發;

③ME針對手機嵌入式程序的開發。

詳述

①JavaEE:這個版本以前被稱爲J2EE.企業版本幫助開發和部署可移植、健壯、可伸縮切安全的服務端Java應用。Java EE是在JavaSE的基礎上構建的他提供Web 服務、組建模型、管理和通信API.可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和web2.0應用程序。

②JavaME:Java ME爲在移動設備和嵌入式設備(比如手機、PDA、電視機頂盒和打印機)上運行的應用程序提供一個健壯且靈活的環境。Java ME包括靈活的用戶界面、健壯的安全模式、許多內置的網絡協議以及對於動態下載的連網和離線應用程序的豐富支持。基於Java ME規範的應用程序只需要編寫一次,就可以用於許多設備,而且可以利用每個設備的本級功能。

③JavaSE:JavaSE以前稱爲J2SE.它允許開發和部署在桌面、服務器、嵌入式環境和實施環境中使用的Java應用程序。JavaSE 包括支持Java Web服務開發的類,併爲Java Platform,Enterprise Edition(Java EE)提供基礎。

二、Java語言概論

1、Java獨立於平臺的原因

Java 語言的執行模式是半編譯和半解釋型,Java 編寫好的程序首先由編譯器轉換爲標準字節代碼作爲中間碼,然後由 Java 虛擬機去解釋執行,Java 虛擬機把字節代碼程序與各操作系統和硬件分開,從而使 Java 程序獨立於平臺。

這裏再普及一個你可能不知道的 javac.exe 與 java.exe 的編譯過程:

源文件(xx.java)----------Javac.exe----------->  二進制字節碼(xx.class)  -----------Java.exe------------>  JVM

三、基本數據類型

1、合法定義變量名

標識符的命名規則是:

①以字母、下劃線(_)、美元符號($)作爲首字符首字符後面可以跟字母、下劃線、美元符和數字;

②不限字符個數,但爲便於閱讀和記憶,不宜太長;

③變量名的首字符不能爲“#”數字

2、整數的定義

①整數有三種表示方法,分別爲八進制(int a=012;)、十進制(int a = 186;)和十六進制(如int d=0x123;)。

②八進制數以0開始,十六進制數以0x開始。

3、單精度數的定義

①單精度應該是浮點型,如float a = 0.2f;

②如浮點型數據(如 5.2 )後沒有任何字母,計算機默認爲雙精度浮點型。

4、Boolean值轉爲某類型的問題

①布爾類型只有兩個值:true(真)或 false(假)。

②不能將 boolean 類型的數值轉換爲其他基本數據類型。

使用時要注意:布爾型數據不可以和數字進行相互轉換,布爾型數據一般用於邏輯判別,除局部變量之外,布爾型數據默認爲 false。

5、某類型轉爲int類型的問題

字符常量是用單引號括起來的一個字符,如 'a'。用雙引號括起來的是字符串,如 "ABC"。字符型數據類型能向 int 數據類型自動轉換,而字符串不可以。

6、整型常量的字長問題

整型常量在計算機中默認佔32位(一個byte(字節)等於8bit(位)),分 byte、short、int 和 long 4類,佔多少位數與操作系統無關

①byte        8 bit

②short     16 bit      2byte

③int          32 bit     4byte

④long       64 bit     8byte

四、運算符與表達式

1、運算符的優先級

單目:單目運算符+ –(負數) ++ -- 等
乘除:算數單目運算符* / % + - 
爲:位移單目運算符  <<   >> 
關係:關係單目運算符>  <   >=    <=    ==     != 
邏輯:邏輯單目運算符&& || & | ^ 
三目:三目單目運算符A > B ? X : Y 

2、Java位運算符

Java 位運算符包括:“~” 按位非(NOT),“&” 按位與(AND),“|” 按位或(OR),“^” 按位異或(XOR),“>>” 算數右移,“>>>” 邏輯右移,“<<” 算數左移,“<<<” 邏輯左移。“!”是“非”位運算符。

移位運算符規律

算術左移運算符

如計算 System.out.println(a <<  b);的運算結果,結果爲:方法① a 乘上 2的b次方

方法②a的二進制中向左移動b位,並且在低位補零。此處我以a=2,b=2爲例演示計算過程,2 的二進制是00000010,向左移動2 位,就變成了00001000,即8。

算術右移運算符

如計算 System.out.println(a >> b);的運算結果,結果爲:方法① a 除以2的b次方

方法②a的二進制中向右移動b位,低位捨棄,高位補入原來高位的值右移一位相當於除2取商。此處若a=89,b=2,則89除以2,商是44。所以89>>1的結果是44。

注意:另外提一點,在正數情況下,算術右移(>> )和邏輯右移(>>>)算法一致,但負數不同。原因如下:

>>  :算術右移運算符,也稱帶符號右移。用最高位填充移位後左側的空位。

>>>:邏輯右移運算符,也稱無符號右移。只對位進行操作,用0填充左側的空位。

以上總結的規律給你來個程序調試一下就能得出結論了:

public static void ShiftTest(){
     
        int a = 8;
        int b = 2;
        int leftResult;
        int rightResult;
        
        System.out.println("a="+a+",b="+b);
        leftResult = a << b;
        System.out.println(a+" * "+" 2`b");
        System.out.println("leftResult="+leftResult);
        
        rightResult = a >> b;
        System.out.println("rightResult="+rightResult);
  
    }

3、i++與++i的區別

先看下面一個題結果爲下面的A還是B:

A. 4.0,40.0

B. 3.0,40.0

        float i = 3.0f;
        int n = 10;
        System.out.print(i++);
        System.out.println(","+n*i++);

此處選擇B,原因爲:i++是先賦值再加1,輸出爲3之後才加的1,所以在第二輪的計算中,i=4。

4、&和&&的區別

舉個栗子吧,如   if(str != null && !"".equals(str)),當 str != null 的時候,接下來纔會去執行: !"".equals(str),就相當於一個電路短路的問題。但是,if(str != null & !"".equals(str))  不管: str != null 的結果如何(即true,false),程序都會執行: !"".equal(str)。

運算法則

對於:&  -- >  只要左右兩邊有一個爲false,則爲false;只有全部都爲true的時候,結果爲true

對於:&& -- > 只要符號左邊爲false,則結果爲false;當左邊爲true,同時右邊也爲true,則結果爲true

五、流程控制

(最新更新時間:2019-09-04 19:33)

1、switch(expression) 語句

在 switch(expression) 語句中,表達式 expression 只能返回 int、byte、 short 和 char 類型的值!不能有double類型等。

2、跳轉語句

這裏主要講一個坑:break也是跳轉語句。跳轉語句包含:break、return、continue。

六、繼承、多態、高級類特性和數組

1、繼承

(1)繼承帶來的最大的好處是類的可重用性,減少代碼的冗餘;另一個作用是規範子類的行爲。 繼承是面向對象的一個重要特性,對一個類的繼承是指在現有類(父類)的基礎上構建一個新類(子類),子類重用(繼承)了父類的方法和屬性,同時還可以向新類中增添新的方法的狀態。所以,在子類中可以進行的操作是添加方法。但是不能減少或更換父類的方法。在對父類的方法進行重寫的時候,方法的返回值、返回值類型、參數個數、相應的參數類型都要一一對應。

(2)在覆蓋一個方法時,子類方法不能低於父類方法的可見性。即如果父類方法是 public,則其子類方法一定要聲明爲 public。

(3)java.lang.String 和 java.lang.StringBuffer 這兩類都被定義爲 final, final最終類指明該類不能有子類,即不可以被繼承。

七、線程

1、補腦內容

(不願看或已瞭解該內容可跳過此段)

(1)進程

進程是操作系統結構的基礎;是 一 次程序的執行;是 一 個程序及其數據在處理機上順序執行時所發生的活動。一 個程序進入內存運行,即變成 一 個進程,進程是處於運行過程中的程序,並且具有 一 定獨立功能。描述進程的有句話非常經典的話:進程是系統進行資源分配和調度的 一 個獨立單位。

(2)併發性(concurrency)和並行性(parallel)區別

並行指的是同 一 時刻,多個指令在多臺處理器上同時運行。併發指的是同 一 時刻只能有 一 條指令執行,但多個進程指令被快速輪換執行,看起來就好像多個指令同時執行。

(3)線程

線程是進程中的—個實體,線程是程序執行流的最小單元,一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。
由於線程之間的相互制約,致使線程在運行中呈現出間斷性每個程序都至少有—個線程,若程序是單線程的,則就是該程序本身。

(4)多線程

線程是程序中—個單—的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱爲多線程。
線程是JVM級別的,與JVM共存亡,所以關閉應用時要麼停止線程要麼關閉JVM。

(5)Java 中創建線程

Java 語言中提供兩種創建線程的方法, 一種是通過繼承 Thread 類創建線程,另一種是通過實現 Runnable 接口來創建線程。

2、線程易錯內容整理

(1)在 Java.API 中支持線程的類或接口的有:java. lang.Thread、java. lang.Runnable、java. lang.ThreadGroup

(2)Java中的線程體是由線程類的 run() 方法定義,該方法定義線程的具體行爲。Java語言中提供兩種創建線程的方法,一種是通過繼承 Thread 類創建線程,另一種是通過實現 Runnable 接口來創建線程,如果線程是使用獨立的 Runnable 運行對象構造的,則調用該 Runnable 對象的 run() 方法。stop() 方法可以強行終止線程;sleep() 方法使一個線程暫停運行一段固定的時間,使比其優先級低的線程運行;resume() 方法是回覆運行掛起的線程; start() 方法是開始運行當前線程。

(3)線程終止。舉個例子吧,如何安全終止線程 t ?

中斷線程比較安全的做法是引入共享變量,所以使用標誌 flag,通過設置 flag 通知線程 t 結束是最好的辦法。stop()方法是強制當前線程停止運行,並拋出 ThreadDead 錯誤。suspend()方法是臨時掛起當前線程。yield()方法是使當前執行線程暫時停止執行而讓其他線程運行。 Thread.stop,Thread.suspend,Thread.resume 和 Runtime.runfinalizers(),Exit 這些終止線程運行的方法已經被廢棄,使用它們是極端不安全的。

(4)線程返回所持有的對象的鎖。

對象的鎖在如下幾種情況下由持有線程返還:①當 synchronized()語句塊執行完後;②當在 synchronized()語句塊中出現異常 (exception) 時;③當持有鎖的線程調用該對象的 wait()方法時。而調用線程的suspend()方法只是使線程暫時停止執行,可以使用其他線程調用 resume()方法恢復執行。

(5)線程的生命週期。

線程的生命週期主要分爲如下幾個狀態:新建狀態、可運行狀態、運行狀態、阻塞狀態、終止狀態。線程一旦創建,就開始了它的生命週期。線程的生命週期主要分爲:①新建狀態 (new),線程創建後處於該狀態;②可運行狀態 (Runnable),新建的線程調用 start()方法,將使線程的狀態從 New 轉換爲 Runnable;③運行狀態 (Running),運行狀態使線程佔有 CPU 並實際運行的狀態;④阻塞狀態 (Blocked),導致該狀態的原因很多;⑤終止狀態 (Dead),線程執行結束的狀態,沒有任何方法可改變它的狀態。

八、Applet 程序設計

1、Applet 與 Application

Applet 是 Java 類,運行過程比 Application 更復雜,Applet 不能由 JDK 中的解釋器 java 直接運行,要在瀏覽器或 appletviewer 中運行; Applet 的主類一定要定義爲 java.applet.Applet 類或 JApplet 類的子類; Applet 與 Application 的主要區別在執行方式上,Application 以 mian()方法爲入口點運行,applet不需要main()函數也能執行,比如說構造函數就已經把窗體繪製完成了。但兩者都是通過” Javac”命令編譯。

爲了使 Applet 在瀏覽器中運行,所以需要在 HTML 文件智能嵌入相應的 Applet 類。

2、Applet 生命週期

Applet 生命週期包括 Applet 的創建(包含初始化)、運行與消亡。Applet 類提供了在生命週期不同階段響應主要事件的4種方法,這4種方法的調用次序如下圖所示:

 

九、其它

1、二分查找算法

適用於排好序的數組

定義三個變量: min , max ,則 mid=(min+max)/2,
如果 value == arr[mid],中間值即爲查找的值,return mid;
如果 value < arr[mid], 要找的值小於中間的值,則再往數組的小端找, max=mid-1;
如果 value > arr[mid], 要找的值大於中間的值,則再往數組的大端找, min=mid+1;
e、g:(13, 18,24,35,47,50,62,83,90,115,134) 查找到90需要比較做少次?
首先將 90 與表中間的元素 50 進行比較,由於 90 > 50,所以在後半部分查找;
第二次比較的元素是後半部分的中間元素90相等。所以共查詢2次。

 

推薦閱讀:Java初級面試題集錦

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章