主要內容:類和對象,方法詳解,成員變量和局部變量,隱藏和封裝,深刻構造器,類的繼承,多態,繼承和組合,初始化塊。java
1.類和對象:程序員
全部使用類定義的變量都是引用變量,引用變量裏存放的僅僅是一個引用,它指向實際的對象。json
Java支持面向對象的三大特徵:封裝、繼承和多態。數組
類裏的各成員之間的定義順序沒有任何影響,static修飾的成員不能訪問沒有static修飾的成員(即static修飾的方法不能使用this引用)。jvm
static對應類變量、類方法;不使用static修飾的成員變量對應實例變量、實例方法。函數
static修飾的方法和成員變量,既能夠經過類來調用,也能夠經過實例來調用;沒有static修飾的普通方法和成員變量,只可經過實例來調用。this
普通方法可以使用this調用本類中的普通方法,普通方法(即實例方法)須要經過對象訪問,this即表明對象自己。this能夠省略,可是依然存在。spa
對象可用調用static修飾的成員,可是不推薦!由於static爲類修飾,用類名調用才符合實際。code
2.方法詳解:對象
java裏的方法不能獨立存在,全部的方法都必須定義在類裏。方法在邏輯上,要麼屬於類,要麼屬於對象。
不一樣對象調用static方法,都會獲得相同的結果(由於static方法本質就是類的);非static方法,不一樣對象調用,結果可能不一樣。
java方法的參數傳遞只有一種:值傳遞。包括形參爲類時,也是傳遞引用,即複製一個引用也指向存儲對象的實際地址。
堆內存中保存對象自己,棧內存中保存引用該對象的引用變量。
形參個數可變的方法:
//以可變個數形參來定義方法 ① public static void test(int a,String... books); //以數組形式來定義方法 ② public static void test(int a,String [] books); //調用 test(5,"www","ddd");//①可用。簡潔,可是也限制了個數可變的形參只能處於形參列表的最後 test(5,new String []{"qqq","www"});//①②均可用
遞歸必定要向已知方向遞歸。
方法重載:只和形參列表有關,和返回值、修飾符等都無關。
//重載 public void test(String msg) public void test(String... bookls) //一個參數會自動調用第一種,若一個參數想調用第二種,應傳入數組
3.隱藏和封裝
排序:private<default<protected<public
private:當前類
default(沒有修飾符):當前包
protected:當前包+不一樣包的子類
public:公共訪問權限
不是有了目錄結構,就等於有了包名。java的包機制須要兩個方面的保證:①源文件裏用packge語句指定包名 ②class文件必須放在對應路徑下 。 缺一不可
packge語句必須做文源文件的第一條非註釋性語句。
父包和子包確實存在了某種內在的邏輯關係,可是在用法上不存在任何關係。不論處於何種文件層次,調用一個包(特別是子包)都要使用全名,不能省略父包部分。
import lee.*;只會調用lee包下的全部類,而不包含lee包的子包的類。
import後能夠省略寫包名;而import static後則能夠連類名都省略。(由於import 引入包,static修飾後引入類)
import static java.lang.System.*; //以後使用 out.println();便可
當程序員調用構造器時,系統會先爲對象分配內存,在爲這個對象執行默認初始化。這些操做在構造器執行以前就完成了。
下面代碼實現了在一個構造器中直接使用另外一個構造器來初始化代碼:
public Apple(String name,String color,double weight)//三個形參的構造函數 { this(name,color);//調用含有兩個形參的構造函數 this.weight=weight; }
5:類的繼承:
java是單繼承。java只能有一個直接父類,能夠有無數個間接父類。
java的子類不能得到父類的構造器。可是能夠調用——super(size,name)
方法重寫要遵循「兩同兩小一大」:方法名、形參列表相同;子類方法返回值類型、聲明拋出的異常類應比父類方法更小或相等;子類方法的訪問權限應比父類的更大或相等。
可使用super或父類類名調用父類中被覆蓋的方法。(super訪問實例,父類類名訪問static)(或者向上轉型—((parent)d).tag—)
若是子類定義了一個與父類方法具備相同方法名,但參數列表不一樣的方法,就會造成父類方法和子類方法的重載。
當程序建立有一個子類對象時,系統不只會爲該類中定義的實例變量分配內存,也會爲它從父類繼承獲得的全部實例變量分配內存。
6.多態:
java引用變量有兩個類型:編譯時類型,運行時類型
如圖將子類對象直接賦值給父類引用變量,成爲向上轉換,由系統自動完成。四種狀況
如圖④狀況,由於引用變量只能調用它編譯類型的方法,因此要想調用運行時的方法,須要向下轉型——(type)variable
這種類型轉換注意:①基本類型之間的轉換隻能在數值類型之間進行。②引用類型之間轉換隻能在具備繼承關係的兩個類型才行,這個對象必須是子類實例!不然會classCastException異常
if(objPri instanceof String) //使用instanceof運算符來判斷是否能夠成功轉換 //使用要求:運算符前面操做數的編譯時類型要麼與後面的類相同,要麼與後面的類有父子繼承關係 //判斷要求:運算符前面操做數的運行時類型要麼與後面的類相同,要麼有父子孫關係,其餘所有false { String str=(String)objPri; }
7.繼承和組合:
類複用:繼承(破壞封裝性),組合
繼承:
繼承:鴕鳥類繼承鳥類
組合:胳膊類組合到人的類
8.初始化塊
①變量不管先定義仍是後定義,都是先分配內存,在從頭讀代碼初始化
②先執行初始化塊、聲明變量時指定的值(按代碼順序),後執行構造器
③先從上而下執行全部的靜態初始化塊,再從上而下的執行普通初始化塊和構造器。靜態初始化塊只須要初始化一次!(靜態初始化,即類初始化,只需初始化一次,就會保存在java虛擬機-jvm)