Java 學習筆記(基本概念)

1,基本概念  
        向過程的思想:由過程、步驟、函數組成,以過程爲核心。先有算法,後有數據結構。
        面向對象的思想:以對象爲中心,先開發類,得到對象,通過對象之間相互通信實現功能。先有數據結構,後有算法。
     Java虛擬機代碼被存儲在.class文件中,每個文件都包含最多一個public類。
     編譯器在獲取Java應用程序的源代碼後,將其生產字節碼,它是爲JVM生成的一種機器碼指令。
    Java編程語言解除了程序員取消分配存儲器的責任,它可提供一種系統級線程以跟蹤每一存儲器的分配情況。在Java虛擬機的空閒週期,垃圾收集線程檢查並釋放那些可被釋放的存儲器。
    javaHello.java——>編譯  Hello.class
    加載代碼——>校驗代碼——>執行代碼
    類加載器:爲程序的執行加載所需要的全部類。
 
2,名門規則
類: 類中單詞的首字母大寫
局部變量:定義在方法之中的變量,要先賦值再進行運算
實例變量:定義在類中,但在方法之外,實例變量的對象賦值爲null
注意:實例變量和局部變量允許命名衝突

3,構造方法
構造方法是當用類生成對象時,系統在生成對象的過程中利用的方法。
用類來生成對象的語句: Student s = new Studeng();
此時S成爲一個對象變量,存儲的是地址,首地址被賦予S空間。
注意:在對象變量中存放的是引用(地址);在簡單變量中存放的是數值。
     可以有多個構造方法,但多個構造方法的參數表一定不同,參數順序不同既屬於不同的構造方法。如果我們未寫構造方法,則系統會自動生成一個空的構造方法。

4,重載和覆蓋
在JAVA中將Overloading 稱爲重載,overriding稱爲覆蓋。
重載:在一個類中可以定義多個同名的方法,各個方法的參數表一定不同,但是修飾詞可能相同,返回值也可能相同。
子類可以從父類繼承一個方法,也可以定義一個同名異參的方法,也稱爲重載。
Overloading方法從低向高轉:
          Byte——short——float——int——long——double
在構造方法中,this()表示調用本類的其他構造方法。
特別注意:用this調用其他構造方法時,this必須爲第一條語句,然後纔是其他語句。
this表示的是當前對象,區分實例變量和局部變量時一定要寫this.

覆蓋:當子類從父類繼承了一個無參方法,而又定義了一個同樣的無參方法,則子類新寫的方法覆蓋父類的方法,稱爲覆蓋。注意返回值類型必須相同,否則出錯。

5,繼承
父類的非私有化屬性和方法可以默認繼承到子類。
父類的構造方法子類不可以繼承,更不存在覆蓋的問題。
Java不允許多繼承,一個類有且只有一個父類。
Java的數據結構爲樹型機構,而非網狀機構。Java可以通過接口和內部類實現多繼承。

對於方法的修飾詞,子類方法要比父類的範圍更加寬泛。如果父類爲public,子類爲private則出錯。之所以構造方法先運行父類再運行子類是因爲構造方法是無法覆蓋的。
範圍順序
private: 本類訪問
default: 表示默認,不僅本類訪問,而且是同包可見。
protected: 同包可見,不同包的子類可見。
public:所有地方均可見

構造一個對象的順序:遞歸構造父類對象,順序調用本類成員屬性賦初值語句,本類構造方法。

Super() 表示調用父類的構造方法,和this一樣必須放在第一行。如果沒有定義構造方法,那麼就會調用父類的無慘構造方法既:super()。

6,多態
     多態指的是編譯時類型變化,而運行時類型不變。多態分兩種:
編譯時多態: 編譯時動態重載。
運行時多態:指一個對象可以具有多個類型。
Animal a = new Dog();   Dog d = (Dog)a; 聲明父類來引用子類。

運行時多態的三個原則:(應用時覆蓋)
1)對象不變,改變的是主觀認識。
2)對於對象的調用只能限於編譯時類型的方法。注意:編譯時類型一定要爲運行時類型的父類,或者同類型。
如a只能調用Animal的方法,而d可以調用運行時Dog的方法。
3)在程序運行時,動態類型鎖定。運行時調用運行時類型,既它調用覆蓋後的方法。

7,關係運算符 instanceof
a instanceof Animal 這個表達式結果是一個布爾表達式,a爲對象變量,Animal爲類名。
上面語句是判斷a是否可以貼Animal標籤。如果可以返回true否則返回false
用於判斷是否將前面的對象變量賦值後邊的類名,一般用於判斷在強制類型轉換之前判定變量是否可以強制轉換。
封裝、繼承、多態是面向對象的三大特性。運行時的動態類型判定針對的是方法,運行程序訪問的屬性仍然爲編譯時屬性。

8,修飾符
static: 可修飾變量,方法,代碼塊。
static int num; 說明num爲類變量,爲一個類的共享變量,屬於整個類。訪問:類名.變量名
public static void printData() {} 表面此方法是類方法(靜態方法),不需要對象。可以使用類名調用。注意靜態方法中不允許訪問類的非靜態成員,包括成員的變量和方法。
一般情況下:主方法是靜態方法,所有可調用靜態方法。是因爲它是整個系統軟件的入口,而進入入口時系統沒有任何對象,只能使用類調用。
覆蓋不適用於靜態方法。允許在子類中定義同名靜態方法,但是沒有多態。
代碼塊:修飾代碼塊,此代碼塊要在此類的任何一個方法之外。這個代碼塊在代碼被裝載進虛擬機生成對象時被裝載一次,以後就再也不執行了。一般靜態代碼塊被用來初始化靜態成員。

final: 修飾類,屬性和方法。
當用final修飾類的時候,此類不可被繼承,防止子類覆蓋。
當用final修飾變量(屬性)的時候,此時變量爲常量。注意:常量需要大寫 常量的地址不可變,但是地址中保存的值可以改變。可以配合static使用。
常量:在初始化的時候通過顯示聲明賦值,在構造的時候賦值。局部變量可以隨時賦值。
當用final修飾方法時:表示這個方法不可覆蓋。
如果一個方法前有修飾詞private或static,則系統會自動在前面加上final。即private和static方法默認均爲final方法。

abstract: 修飾方法、類。
表示抽象方法,此時方法不需要實現,實現留給子類覆蓋。
如果一個類中有一個抽象方法,那麼這個類一定爲一個抽象方法。
反之,如果一個類爲抽象類,那麼其中可能有非抽象的方法。
所以子類的方法必須覆蓋父類的抽象方法,方法才能起作用。

Abstractstatic不能放在一起,否則便會出現錯誤。(這是因爲 static不可被覆蓋,而abstract爲了生效必須被覆蓋。)
例如:
public class TestClass {
     public static void main(String[] args) {
          SuperClass sc = new SubClass();
          sc.print();
     }
     Abstract class SuperClass{
          Abstract void print(); }
}

class SubClass extends SuperClass() {
     void print() {
          System.out.println("Hello World"); }
}

9,接口interface
接口是 一種特殊的抽象類。
public interface: 公開接口。
與類相似,一個文件只能有一個public接口,且與文件名相同,在一個文件中不能同時定義一個public接口和一個public 類。
注意:一個接口中,所有的方法爲公開、抽象方法;所有的屬性爲公開、靜態、常量。
一個類實現一個接口的格式:
     class IAImple implements IA {};
一個類實現接口,相當於它繼承一個抽象類。類必須實現接口中的方法,否則其爲一個抽象類。
接口中可不寫 public,但在子類中實現接口的過程中 public不可省。
注意:
1)一個類可繼承另外一個類,還可以實現接口。
2)一個類只能繼承另外一個類,但是可以繼承多個接口,中間用,隔開。
3)接口和接口之間的關係可以定義繼承關係,並且接口之間運行實現多繼承。
interface IC extends IA, IB {};
4)接口也可定義對象。 IA I = new IAImpl();
實現的類從父類和接口繼承的都可做運行時類型。
 
10, 高級訪問控制
 
11,內部類
   允許一個類定義被放到另一個類裏,把類在邏輯上組織在一起,可以訪問他們所嵌套的類的範圍。
     
類內部屬性:     
     類名稱只能用在定義過的範圍中,除非用限定的名稱。
     內部類可以被定義在方法中
     任何變量,無論是本地變量還是正式參數,如果變量被標識爲final,那麼久可以被內部類中的方法訪問。
     內部類可以使用被嵌套的類和實例變量以及所嵌套的塊中的本地變量。
     內部類可以被定義爲abstract

     只有內部類可以 被聲明爲private或 protected,以便防止它們不受來自外部類的訪問。訪問保護不阻止內部類使用其他類的任何成員。
     一個內部類可以作爲一個接口,由另一個內部類實現。
     被自動聲明爲static的內部類成爲頂層類,這些內部類失去了在本地範圍和其他內部類中使用數據和變量的能力。
     內部類不能聲明任何static成員,只有頂層類可以聲明static成員
 
12,異常
 
     異常類定義程序中可能遇到的輕微的錯誤條件,可以寫代碼來處理異常並繼續程序執行,而不是讓程序中斷。

發生下列情況時,會出現異常:
     想打開的文件不存在
     網絡連接中斷
     受控操作數超出預定範圍
     非常感興趣的正在裝載的類文件丟失
     
異常處理:
     try {
               // code that might thwos a particular exception 
     } catch (MyExceptionType e) {
               // code to execute if a MyExceptionType exception is thrown
     } catch (Exception e) {
               // code to execute if a general Exception is thrown
     }
 
     要處理特殊的異常,將能夠拋出異常的代碼放入try中,然後創建相應的catch塊的列表。如果生成的異常與catch中提高的相匹配,那麼catch條件的塊語句就被執行。

調用棧機制:
     如果方法中一個語句拋出一個沒在相應的try/catch塊中處理的異常,那麼這個異常被拋出到調用方法中,如果在調用方法中也沒被處理,它就被拋出到該方法的調用程序,這個過程一直延續到異常被處理,直到回到main()中,如果main也處理它,那麼該異常就中斷程序。

finally語句:
     定義一個總是執行的代碼快,而不考慮異常是否被捕獲。
     try {
          .....
     } catch {
          .....
     }
     finally {
          stopFaucet();
     }

 
異常分類:
     異常分三類:Java.lang.Throwable類充當所有對象的父類,可以使用異常處理機制將這些對象拋出並捕獲。它有Error 和 Exception兩個基本子類。
 
 
Throwable類不能使用,而使用子類異常中的一個來描述任何特殊異常
     Error: 表示恢復不是不可能但是很困難的情況下的一種嚴重問題,如內存溢出。
     RuntimeException:表示一種設計或實現問題。

共同異常:
     ArithmeticException
          整數倍 0 除
     NullPointerException
          對象沒有被實例化時,訪問對象的屬性或方法。
     NegativeArraySizeException
          創建帶負維數大小的數組的嘗試
     ArrayIndexoutofBoungdsException
          訪問超過數組大小範圍的一個元素的嘗試
     SecurityException
          典型的被拋出到瀏覽器中,SecurityManager類拋出一個applets的異常,該異常企圖做下述工作:
               ——訪問一個本地文件
               ——打開主機的一個socket,這個主機與服務於applet的主機不是同一個
               ——在運行時環境中執行另一個程序

處理或聲明規則:
     用try-catch-finally來處理異常
     用throws 字句聲明代碼能引起一個異常
創建自己的異常:
     通過擴展Exception類來創建自己的異常。
public class ServerTimeOutException extends Exception {
     private String reason;
     private int port;
    
     public ServerTimeOutException (String reason, int port) {
          this.reason = reason;
          this.port = port;     
     }
     
     public String getReason() {
          return reason;
     }

     public int getPort() {
          return port;
     }
}
     
public void connectMe( String serverName ) throws 
     ServerTimeOutException {
     int success;
     int portToConnect = 80;
     
     success = open(serverName, portToConnect);
     if (success == -1) {
          throws new ServerTimeOutException("Could not connect", 80);
     }
}

public void findServer() {
     ....
     try {
          connectMe(defaultServer);
     } catch(ServerTimeOutException e) {
          
          System.out.println("Server time out");
     
          try {
               ConnectMe(alternateServer);     
          } catch (ServerTimeOutException e) {
               System.out.println("No server available");
          }
     }
}

發佈了44 篇原創文章 · 獲贊 12 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章