好處:正則的出現,對字符串的複雜操作變得更爲簡單。
特點:將對字符串操作的代碼用一些符號來表示。只要使用了指定符號,就可以調用底層的代碼對字符串進行操作。符號的出現,簡化了代碼的書寫。
弊端:符號的出現雖然簡化了書寫,但是卻降低了閱讀性。
其實更多是用正則解決字符串操作的問題。
組:用小括號標示,每定義一個小括號,就是一個組,而且有自動編號,從1開始。
只要使用組,對應的數字就是使用該組的內容。別忘了,數組要加\\。
(aaa(wwww(ccc))(eee))技巧,從左括號開始數即可。有幾個左括號就是幾組。
2. 常見操作:
1、匹配:其實用的就是String類中的matches方法。
String reg = "[1-9][0-9]{4,14}";
boolean b = qq.matches(reg);//將正則和字符串關聯對字符串進行匹配。
2、切割:其實用的就是String類中的split方法。
3、替換:其實用的就是String類中的replaceAll();
4、獲取:
<1> 先要將正則表達式編譯成正則對象。使用的是Pattern中靜態方法 compile(regex);
<2> 通過Pattern對象獲取Matcher對象。
Pattern用於描述正則表達式,可以對正則表達式進行解析。
而將規則操作字符串,需要從新封裝到匹配器對象Matcher中。
然後使用Matcher對象的方法來操作字符串。
如何獲取匹配器對象呢?
通過Pattern對象中的matcher方法。該方法可以正則規則和字符串想關聯。並返回匹配器對象。
<3> 使用Matcher對象中的方法即可對字符串進行各種正則操作。
3. 靜態:
1、Static 是一個修飾符,用於修飾成員(成員變量 、成員方法)
2、當成員被靜態修飾後,就多了一種調用方式,除了可以被對象調用外,還可以直接被類名調用
格式:類名.靜態成員
3、Static特點:
<1>、隨着類的加載而加載。 也就是說:靜態會隨着類的消失而消失,說明它生命週期最長。
<2>、優先於對象存在 。明確一點:靜態先存在 對象後存在。
<3> 被所有對象共享 ,
<4> 可以被類名所調用
4. 實例變量和類變量的區別:
1、存在位置:
類變量隨着類的加載而存在於方法區中。
實例變量隨着對象的建立而存在於堆內存中。
2、生命週期:
類變量的生命週期最長,隨着類的消失而消失。
實例變量的生命週期隨着對象的消失而消失。
5. 靜態使用注意事項:
1、靜態方法只能訪問靜態成員。
非靜態方法既可以訪問靜態也可以訪問非靜態
2、靜態方法中不可以定義this,super關鍵字。
因爲靜態優先於對象存在。所以靜態方法中不可以出現this。
3、主函數是靜態的。
6. 靜態的利弊端:
利處: 1、對對象的共享數據盡享單獨空間的存儲,節省空間,沒有必要沒一個對象都存儲一份。
2、可以直接被類名調用。
弊端: 1、生命週期過長。
2、訪問出現侷限性。(靜態雖好,但只能訪問靜態)
7. 主函數:
1、定義: 是一個特殊的函數,作爲程序入口,可以被jvm調用。
2、涵義:
public: 代表着該函數的訪問權限是最大的。
static: 代表主函數隨着類的加載就已經存在了。
void: 主函數沒有具體的返回值。
main:不是關鍵字,但是是一個特殊的單詞,可以被jvm識別。
(String[] args):函數的參數,參數類型是一個數組,該數組的元素是字符串。字符串類型數組。
3、主函數是固定格式的 ,被jvm識別。
8. 什麼時候使用靜態:
1、什麼時候定義靜態變量(類變量)呢?
<1> 當對象中出現共享數據時,該數據被靜態所修飾。
<2> 對象中特有的數據要定義成非靜態存在於堆內存中。
2、什麼時候定義靜態函數呢?
當功能內部沒有訪問到非靜態數據(對象特有數據),則可定義成靜態函數。
9. 靜態的應用:
1、每一個應用程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝,以便複用。
2、將方法都靜態後,可以方便於使用,但是該類還是可以被其他程序建立對象。
爲了更嚴謹,強制讓該類不能建立對象,可以通過將構造函數私有化完成(private)
(默認構造函數的權限是隨着類的變化而變化的)
10. 靜態代碼塊:
格式:
static
{
靜態代碼塊中的執行語句
}
特點:隨着類的加載而執行,只執行一次並優先於主函數。 用於給類進行初始化。
11. Persong p = new Person("XX",XX);
這句話執行了:
1、因爲new用到了Person.class,所以會先找到Persong.class文件並加載到內存中
2、執行該類中的static代碼塊,如果有的話,給Person.class類進行初始化
3、在堆內存中開闢空間,分配內存地址
4、在堆內存中建立對象特有屬性,並進行默認初始化
5、對屬性進行初始化
6、對對象進行構造代碼塊初始化
7、對對象進行對應的構造函數初始化
8、將內存地址賦給棧內存中的p變量
12. 構造代碼塊:
作用:給對象進行初始化。
對象一建立就運行,而且優先於構造函數執行。
和構造函數的區別:
構造代碼塊是給所有對象進行統一初始化
構造函數是給對應對象初始化
13. 靜態代碼塊和構造代碼塊:
相同點:都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個,
一般在代碼塊中對一些static變量進行賦值。
不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。
靜態代碼塊只在第一次new執行一次,之後不再執行,而非靜態代碼塊在每new一次就執行一次。
非靜態代碼塊可在普通方法中定義(不過作用不大);而靜態代碼塊不行
14. 想要保證對象唯一:]
餓漢式(先初始化對象,Student類一進內存就創建好了對象)
1、將構造函數私有化
2、在類中創建一個本類對象
3、提供一個方法可以獲取到該對象
private Student() {};
private static Student s=new Student();
public static Student getInstance() {return s};
懶漢式(延時加載 Student類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象
private static Student s = null;
private Student(){}
public static Student getInstance()
{
if(s==null)
s=new Student();
return s;
}
15. 繼承:
1、提高了代碼的複用性。
2、讓類與類之間產生了關係。有了這個關係,纔有了多態的特性。
3、注意:千萬不要爲了獲取其他類的功能,簡化代碼而繼承。必須是類與類之間有所屬的關係纔可以繼承。所屬關係 is a
4、Java語言中,Java只支持單繼承,不支持多繼承。 因爲多繼承容易帶來安全隱患:當多個父類中定義了相同的功能,當功能內容不同時,子類對象不確定要運行哪一個。
但是java保留這種機制,並用另一種體現形式來完成表示(多實現)
5、java支持多層繼承。也就是一個繼承體系
16. 如何使用一個繼承體系中的功能呢?
想要使用體系,先查閱體系父類的描述,,因爲父類中定義的是該體系中共性功能,通過了解共性功能,就可以知道該體系的基本功能。
那麼這個體系已經可以基本使用了。
那麼在具體調用時,要創建最子類的對象,爲什麼呢?
1、因爲有可能父類不能創建對象
2、創建子類對象可以使用更多的功能,包括基本的也包括特有的
簡單一句話:查閱父類功能 ,創建子類對象使用功能。
17. 子父類出現後,類成員的特點:
1、變量
如果子類中出現非私有的同名成員變量時,子類要訪問本類中的變量,用this;訪問父類中的同名變量 用super。super的使用和this的使用幾乎一致。this代表的是本類對象的引用 ;super代表的是父類對象的引用。
2、函數
當子類出現和父類一模一樣的函數時,當子類對象調用該函數,會運行子類函數的內容。如同父類的函數被覆蓋一樣。這種情況是函數的另一個特性: 重寫(覆蓋)
當子類繼承父類,沿襲了父類的功能,到子類中,但是子類雖具備該功能,但是功能的內容卻和父類的不一致這時,沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義 ,並重寫功能的內容。
覆蓋(重寫) 注意事項:
子類覆蓋父類,必須保證子類權限大於等於父類權限,纔可以覆蓋,否則編譯失敗。靜態只能覆蓋靜態。重載:只看同名函數的參數列表。重寫:子父類方法要一模一樣。
3、構造函數
在對子類對象進行初始化時,父類的構造函數也會運行,那是因爲子類的構造函數默認第一行有一條隱式的語句 super()。super():會訪問父類中的空參數構造函數。而且子類 中所有的構造函數默認第一行都是super( )。
爲什麼子類一定要訪問父類中的構造函數?
因爲父類中的數據子類可以直接獲取。所以子類對象在建立時需要先查看父類是如何對這些數據進行初始化的,所以子類在對象初始化時要先訪問一下父類中的構造函數。如果要訪 問父類中指定的構造函數,可以通過手動定義
Super語句的方式來指定。
注意:super語句一定定義第一行。
18. 子類的實例化過程:
結論: 子類的所有構造函數,默認都會訪問父類中的空參數構造函數 ; 因爲子類中每一個構造函數內的第一行都有一個隱式的super();當父類中沒有空參數的構造函數時,子類必須手
動通過super語句的形式來指定要訪問父類中的構造函數。
當然:子類的構造函數第一行也可以手動指定this語句來訪問本類構造函數;子類中至少有一個構造函數會訪問父類中的構造函數。
19. final作爲一個修飾符:
1、可以修飾 類、函數、變量。
2、被final修飾的類不可以被繼承。是爲了避免被繼承,被子類複寫的功能。
3、被final修飾的方法不可以被重寫。
4、被final修飾的變量是一個常量,只能賦值一次,既可以修飾成員變量,也可以修飾局部變量。
當在描述事物時,一些數據的出現值是固定的,那麼這是爲了增強閱讀性,都給這些值起個名字,方便於閱讀。 而這個值不需要改變,所以加上final修飾。作爲常量:常量的書寫 規範所有字母都大寫,如果由多個單詞組成,單詞間通過_連接。
6、內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。
20. 抽象類的特點:
1、抽象方法一定在抽象類中
2、抽象方法和抽象類都必須被abstract關鍵字修飾
3、抽象類不可以用new創建對象,因爲調用抽象方法沒意義
4、抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用; 如果子類只覆蓋了部分的抽象方法,那麼該子類還是一個抽象類。
5、抽象類中可以有抽象方法也可以有非抽象方法
6、抽象類和一般類沒有太大的不同: 該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂得東西。這些不確定的部分,也是該事物的功能,需要明確出現。但是無法定義主體
7、抽象類比一般類多了個抽象函數,就是在類中可以定義抽象方法; 抽象類不可以實例化。
特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓改類建立對象。
模板方法:在定義功能時,功能的一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分,那麼這時就將不確定的部分暴露出去。有該類的子類去實現。
21. 接口:
初期理解:可以認爲是一個特殊的抽象類,當抽象類中的方法都是抽象的,那麼該類可以通過接口的形式來表示 (interface)
接口定義時,格式特點:
1、接口中常見定義:常量,抽象方法。
2、接口中的成員都有固定修飾符。
常量:public static final
方法:public abstract
記住:接口中的成員都是public的。
3、接口是不可以創建對象的,因爲有抽象方法。需要被子類實現,子類對接口中的抽象方法全部覆蓋後,子類纔可以實例化。否則子類是一個抽象類。
接口可以被類多實現,也是對多繼承不支持的轉換形式,Java支持多實現。
22. 多態:
可以理解爲事物存在的多種形態。
1、多態的體現:父類的引用指向了自己的子類對象。父類的引用也可以接受自己的子類對象。
2、多態的前提:必須是類與類之間有關係。要麼繼承;要麼實現。通常還有一個前提:存在覆蓋。
3、多態的好處:多態的出現大大的提高了程序的擴展性。
4、 多態的弊端:提高了擴展性,但是隻能使用父類的引用訪問父類中的成員。
5 、 多態的應用
6、多態的出現代碼中的特點(多態的使用注意事項)
<1> 在多態中成員函數的特點(非靜態):在編譯時期:參閱引用型變量所屬的類中是否有調用的方法。如果有,則編譯通過;沒有,則編譯失敗。在運行時期:參閱對象所 屬的類中是否有調用的方法。
簡單總結就是:多態函數在多態調用時,編譯看左邊,運行看右邊。
<2> 在多態中 成員變量的特點:無論是編譯還是運行,都參考左邊(引用型變量所屬的類)
<3> 在多態中,靜態成員函數的特點:無論編譯和運行,都參考左邊。
23. Object: 是所有對象的直接或者間接父類,傳說中的上帝該類中定義的肯定是所有對象都具備的功能
Object類中已經提供了對對象是否相同的比較方法。如果自定義類中也有比較相同的功能,沒有必要重新定義;只要沿襲父類中的功能,建立自己特有的比較內容即可。這就是覆蓋。
24. 內部類的訪問規則:
1、內部類可以直接訪問外部類中的成員,包括私有。之所以可以直接訪問外部類中的成員,是因爲內部類中持有一個外部類的引用,格式 外部類名.this
2、外部類要訪問內部類,必須要建立內部類對象。
3、訪問格式:
<1> 定義在外部類的成員位置上,而且非私有,可以在外部其他類中直接建立內部類對象。格式:外部類名.內部類名 變量名= 外部類對象.內部類對象Outer.Inner in = new Outer().new Inner() ;
<2> 當內部類在成員位置上時,就可以被成員修飾符所修飾。比如: private:將內部類在外部類中進行封裝static:內部類就具備static特性。當內部類被static修飾後, 只能直接訪問外部類中的static成員。出現了訪問侷限性。
<3> 在外部其他類中,如何直接訪問static內部類的非靜態成員呢?new Outer.Inner().function();在外部其他類中,如何直接訪問static內部類的靜態成員呢? Outer.Inner.function();
注意:當內部類中定義了靜態成員,該內部類必須是static的。當外部類中的靜態方法訪問內部類時,內部類也必須是靜態的
4、在描述事物時,事物的內部還有事物,該事物用內部類來描述。因爲內部類事物在使用外部事物的內容。
5、內部類在定義局部時:
<1> 不可以被成員修飾符修飾。
<2> 可以直接訪問外部類中的成員,因爲還持有外部類中的引用;但是不可以訪問它所在的局部中的變量,只能訪問被final修飾的局部變量。
25. 匿名內部類:
1、匿名內部類其實就是內部類的簡寫格式。
2、定義內部類的前提:內部類必須繼承一個類 或者實現接口。
3、匿名內部類的格式:new 父類或者接口( ) {定義子類的內容}
4、其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖。可以理解爲帶內容的對象。
5、匿名內部類中定義的方法最好不要超過3個。
26.包:
總結:1、包與包之間進行訪問,被訪問的包中的類以及類中的成員,需要public修飾。
2、不同包中的子類還可以直接訪問父類中被protected權限修飾的成員。 包與包之間可以使用的權限只有兩種:public protected
3、爲了簡化類名的書寫,使用一個關鍵字 import;Import導入的是包中的類。建議:不要使用通配符*,需要用到包中的哪個類,就導入哪個類
4、建議定義包名不要重複,可以使用url來完成定義,url是唯一的。