1. 程式人生 > >黑馬程式設計師基礎-----基礎加強

黑馬程式設計師基礎-----基礎加強

靜態匯入:

靜態匯入是JDK1.5的新特性,比如Math類中的靜態方法,需要類名呼叫,也就是Math.max(3,6);

但是我們用靜態匯入的方法可以不用類名呼叫,直接寫方法掉用。寫法如下:
在包名的下邊輸入:
import static java.lang.Math.max;

import static java.lang.Math.*;

這樣呼叫max()方法的時候就可以省略類名了。


overload和override

>>overload(通常被翻譯為過載或過載)    
一般語境裡overload是對method(方法)而言的,可以指一個類中多個名字相同而引數型別列表不相同的方法,這個名字代表的方法就是被overload了的。編譯器會根據引數型別列表的不同來決定呼叫叫這個名字的很多方法中具體的哪一個。   
>>override(通常被翻譯為覆蓋)    
 一般語境裡,如果說這個method(方法)是被override來的,就是說在定義這個方法的類的父類中有一個與這個方法同名且引數型別列表相同的方法,在子類中,這個方法被override了。在對這個子類的例項呼叫該方法時,編譯器確切的知道呼叫的是這個子類的方法。

可變引數:

一個方法接受的的引數個數不固定,例如

可變引數的特點:
只能出現在引數列表的最後;
“...”位於變數型別和變數名之間,前後有無空格都可以

掉用可變引數的方法時,編譯器可該變引數隱含建立一個數組,在方法體中以陣列的形式訪問可變引數。

增強for迴圈:

for(type變數名:集合變數名){...}

注意:
迭代變數必須在()中定義;
集合變數可以是陣列或實現iterable介面的集合類


基本資料的自動裝箱和拆箱:

Integer obj = 3;裝箱

System.out.println(obj + 4);
小插曲:
integer i1 = 127;
integer i2 = 127;
System.out.println(i1 == i2);結果為true
當裝箱的數超過127的時候呢,那麼執行的結果就會
返回false。
結論:如果這個數字在一個位元組之內 -128~127之間
那麼都為true,比較小的整數使用的頻率很高,會反覆的出現,浪費記憶體,物件本來不怎麼改變,大家都用它用不去改變他的資料,其實這是一個設計模式,叫享元模式
fiyweight
如果很多很小的物件他們有很多相同的東西,那麼就可以把它變成一個物件。還有些不同的屬性把他變成方法的引數,不同的屬性稱為物件的外部狀態,不同的屬性稱為內部狀態。



列舉:

列舉的構造方法為什麼是私有的

列舉只有一個成員時,就可以作為一種單例的實現方式。

反射:

反射不是JDK1.5的新特性,在JDK1.2的時候出現的特性

概念:java程式中的各個java類屬於同一類事物,描述這類事物的java類名就是Class.Date

Math   每一個類中有會產生一個位元組碼,每一份位元組碼他們就是一個Class的例項物件
Date.class代表Date那個類的位元組碼
pl.getClass()有了物件呼叫getClass()方法,就可以知道他是屬於那個Class
Class.forName("java.lang.String")的作用
得到這個類的位元組碼,

有兩種情況,

1位元組碼已經載入到記憶體裡了,不需要載入了,直接找到位元組碼返回.

2,在虛擬機器裡還沒有位元組碼,於是用類載入,載入完快取起來,同時返回剛才載入進來的位元組碼.

如果得到各個位元組碼對應的實力物件(Class型別)
1,型別.class,例如System.class
2,物件.getClass().例如 new Date().getClass()

3,Class.forName("類名"),例如,Class、forName("java.util.Date");

針對於一個類而言,無論用什麼方式取,取出來的都是一個位元組碼。(==  equals)
9個預定義的Class物件 八個基本資料型別和void
isPrimitive() 檢視是否是基本資料型別的位元組碼
是返回true  不是返回false
基本資料物件型別可以寫成 如:Integer.TYPE 獲取位元組碼
陣列型別的class例項物件
Class.isArray();


總而言之:只要是在源程式中出現的型別,都有各自的Class例項物件,例如 int[],void


反射的概念:

反射就是把Java類中的各種成分對映成相應的java類。

一,構造方法的反射應用:Constructor類
1,得到某個類所有的構造方法:
Constructor[] constructor=
Class.forName("java.lang.String").getConstructors();
2,得到某一個構造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
3,件例項物件:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constuctor.newInstance(new StringBuffer("abc"));



二,成員變數的反射:Field類
ReflectPoint pt1 = new ReflectPoint(3,5);

Field fieldY = pt1.getClass().getField("y");

先得到位元組碼,有了位元組碼就可以得到類中的成員變數。
//fieldY的值是多少?是5,錯!
//fieldY不是物件身上的變數,而是類上的,要用它去取某個物件上對應的值。
sop(fieldY.get(pt1));
如果某個變數是私有的用getFileld()方法是不可以獲取變數的,而且不可以用get()方法獲取變數的值,那麼我們可以用getDeclaredField();方法獲取私有成員變數並且通過暴力反射的方法
來獲取變數的值。
fieldX.setAccessible(true);
sop(fieldX.get(pt1));



成員方法的反射:Method類
用反射的方式得到位元組碼裡面的方法,再拿這個方法去作用某個物件。
Method methodCharAt = String.class.getMethod("charAt",int.class);
SOP(methodCharAt.invoke(str1,1));
invoke(str1,1)表示方法物件身上的方法。
invoke(null,1)如果invoke()方法的第一個引數為null,
說明該Method物件對應的是一個靜態方法.
按照1.4的語法來呼叫:
SOP(methodCharAt.invoke(str1,Object[]{2}));



ArrayList_HashSet的比較:

HashCode的作用?

HashCode把集合分成了若干個區域,每一個要存進來的物件可以算出一個值,根據算出來的值,把它放到相應的區域裡面去。當某個物件要存進來時,先算出它的HashCode值,根據它的雜湊值判斷,把物件放到它所對應的區域,這樣對於查詢某個物件直接算出他的HashCode值,這樣不用挨個去排查,直接找出物件所在的區域即可,提高了效率。

記憶體洩露:
Collection collections = new HashSet();
RefectPoint pt1 = new RefectPoint(3,3);
RefectPoint pt2 = new RefectPoint(5,5);
RefectPoint pt3 = new RefectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
pt1.y = 7;
collections.remove(pt1);
SOP(collections.size());

         沒改變y的值之前呢,集合中存了一個物件,因為判斷了hashcode值和equals,並且移除了pt1物件了。當改變y的值之後呢,hashcode值變化了,變化了再移除pt1,這

時候pt1這個物件已經不在原來的那個區域了。這就叫做記憶體洩露


反射的作用--->實現框架功能
1,當我們類還沒有寫出來,我的源程式就已經寫好了。
2,框架和工具類不同,框架是呼叫者,工具類是被呼叫者

3,HashTable,HashMap,Properties的區別。

HashTable繼承於比較古老的Dictionary,而HashMap是介面Map的實現。
HashMap是HashTable的一個輕量級實現,HashMap不是執行緒安全的,而HashTable是執行緒安全的。
HashMap允許key或者value為null,而HashTable是不允許的。
在效率方面:HashMap的效率略過於HashTable。
而Properties是HashTable的子類,不過Properties添加了兩個方法,load()和store()可以直接匯入或者將對映寫入檔案。另外Properties是的對映。


JavaBean 
什麼是javaBean,符合某種規則的一種特殊的java類。JavaBean的例項物件通常稱之為值物件(value-Object。簡稱VO),對JavaBean進行內省操作。

1.   PropertyDescriptor 對屬性進行描述的類。

2.   採用便利BeanInfo的所有屬性方式來查詢和設定某個RefectPoint物件的X屬性,在程式中吧一個類當作JavaBean來看,就是呼叫IntroSpecto.getBeanInfo方法,得到的BeanInfo物件封裝了吧這個類當作JavaBean看的結果資訊。


泛型:

1、泛型的引數型別只能是類(class)型別,而不能是簡單型別。比如,是不可使用的。

2、可以宣告多個泛型引數型別,比如,同時還可以巢狀泛型,例如:>
3、泛型的引數型別可以使用extends語句,例如。
4、泛型的引數型別可以使用super語句,例如< T super childclass>。
5、泛型還可以使用萬用字元,例如<? extends ArrayList>

類載入器的委託機制:

1,引導類載入器(bootstrap class loader):它用來載入 Java 的核心庫,是用原生程式碼來實現的,並不繼承自java.lang.ClassLoader。
2,擴充套件類載入器(extensions class loader):它用來載入 Java 的擴充套件庫。Java 虛擬機器的實現會提供一個擴充套件庫目錄。該類載入器在此目錄裡面查詢並載入 Java 類。
3,系統類載入器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來載入 Java 類。一般來說,Java 應用的類都是由它來完成載入的。


代理類

AOP  面向方面的程式設計涉及到代理:

A介面有c方法,類B實現A介面,原本應該是執行B類中的c方法,可現在不這樣做;我宣告產生B類的代理類B',由它來冒充B類的“兄弟”並“實現”A介面,對外界來說B'應該也有c方

法,可當真正呼叫它的時候,它會去執行與它關聯InvocationHandler的invoke()方法,在這個方法裡面你可以做很多事情。這樣,這個請求就被“代理”到其它地方去了。



 ------- android培訓java培訓、期待與您交流! -----