天天看點

黑馬程式員_高新技術(1)知識點

---------------------- ASP.Net+Android+IO開發S、.Net教育訓練、期待與您交流流! ----------------------

高新技術(1)知識點

1,Eclipse使用技巧:

1),MyEclipse和Eclipse的關系:

插件的關系。擴充Eclipse的功能.

Eclipse是用Java開發出來的,啟動時實際上運作的是Java.exe,Java.exe啟動一個Java類,

Java類運作效果是一個界面。

小知識:假如Eclipse關不掉,可以進入程序管理,将javaw.exe結束 就可以關掉。

Eclipse是一種IDE開發工具。

2),Java ee的簡寫:Java 2 Platform Enterprise Edition

ide(內建開發環境)的簡寫:Integrated Development Environment的英文縮寫

jms的簡寫:Java Message Service,Java消息服務

jmx的簡寫:(Java Management Extensions,即Java管理擴充)

jndi的簡寫:(Java Naming and Directory Interface,Java命名和目錄接口)

3),NetBeansIDE:

NetBeans 由Sun公司(2009年被甲骨文收購)在2000年創立,它是開放源運動以及開發人員和

客戶社群的家園,旨在建構世界級的Java IDE。NetBeans目前可以在Solaris、Windows、Linux

和Macintosh OS X平台上進行開發,并在SPL(Sun公用許可)範圍内使用。

4),JBuilder(收費的用的人不多):

Jbuilder是一個可視化JAVA開發工具。它是在Java2平台上開發商業應用程式、資料庫、

釋出程式的優秀工具。它支援J2EE,是以程式員可以快速的轉換企業版Java應用程式。

第三方的類以jar包的形式存。

5),工程:

一般來說一個相對獨立的項目就是一個工程,一個項目中涉及的多個Java檔案,資源檔案等用

一個工程進行管理。在不使用工程管理的情況下,如果一個項目中包括多個Java源檔案,程式設計

人員需要精心維護這些源檔案之間,以及源檔案與其他檔案的目錄關系,需要逐一編譯這些源

檔案,需要手工啟動運作編譯後的結果,如果每一個程式的所有源檔案用一個工程來組織,開

發工具能對所有源檔案集中管理,記住每個源檔案的位置和互相關系,工程中有那幾個源檔案

,啟動類是那個,啟動參數設定等配置資訊在工程中都有記錄。

2,靜态導入:

import語句可以導入一個類或某個包中的所有類。

import static 語句導入一個類中的某個靜态方法或所有靜态方法。

3,可變參數:

overload和Override的差別:

可變參數的特:

隻能出現在參數清單的最後。

...位于變量類型和變量名之間。前後有無空格都可以;

調用可變參數的方法時候,編譯器為該可變參數隐含建立一個數組,

在方法體上以數組的形式通路可變參數。

public class VarableParameter {

public static void main(String[] args) {

System.out.println(add(2,3));

System.out.println(add(2,3,5));

}

public static int add(int x,int ... args){

int sum = x;

for (int i = 0; i < args.length; i++) {

sum+=args[i];

return sum;

4,增強for循環:

文法: for(type 變量名:集合變量名){...}

注意事項:

1,疊代變量必須在()中定義。

2,集合變量可以是數組或實作了Iterable接口的集合類。

舉例:

public static int add(int x,int...args){

int sum= x;

for(int arg:args){

sum+=arg;

5,基本資料類型的自動裝箱與拆箱:

享元設計模式:

由來:當對象數量太多時,将導緻運作代價過高,帶來性能下降等問題,享元模式為解決這一類

問題而誕生的。享元模式通過共享技術實作相同或相似對象的重用。

優點:提高程式效率和性能的模式,會大大的增加程式的運作速度。極大的減少了記憶體中,對象

的數量,使得相同對象在記憶體中隻儲存一份。

6,枚舉:

JDK1.5引入了新的類型——枚舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了"大"友善。

1),常量:

在JDK1.5 之前,我們定義常量都是: public static final.... 現在好了,有了枚舉,

可以把相關的常量分組到一個枚舉類型裡,而且枚舉提供了比常量更多的方法。

Java代碼 :

public enum Color {

RED, GREEN, BLANK, YELLOW

2),定義一個枚舉類:

public enum WeekDay{

SUN(1),MON(),TUR,WED,THI,FRI,SAT;

private WeekDay(){

System.out.println("frist");

private WeekDay(int Day){

System.out.println("sencod");

3),枚舉中的抽象方法的應用

public enum TracfficLamp{

RED(30){

public TracfficLamp nextLamp() {

return GREEN;

},

GREEN(45){

public TracfficLamp nextLamp(){

return YELLOW;

YELLOW(10){

return RED;

};

public abstract TracfficLamp nextLamp();

private int time;

private TracfficLamp (int time ){

this.time = time;

7,反射:

反射的基石是Class類。

1),class類:Java程式中的各個Java類屬于同一個事物,描述這類事物的Java類名就是Class。

例如:衆多的人用Person類來描述,而衆多的Java類則用Class來描述。

2),位元組碼:當我們在源程式中用到Person類的時候,首先要從硬碟上把這個類的二進制的代碼(位元組碼),

加載到記憶體中,接着才可以用它建立出對象。當我們程式中用到了很多的Java類,我們的記憶體

中就應該有與之對應的位元組碼。

3),Class類的靜态方法 forName的作用

得到一個類的位元組碼有兩種情況:

第一種:這個類的位元組碼已經加載到記憶體中來了,不需要加載了,直接找到位元組碼傳回即可。

第二種:這個類的位元組碼在虛拟機中還沒有位元組碼,于是用類加載器加載,加載以後就把那份位元組碼緩

存起來,同時這個方法傳回剛才加載那份位元組碼。

4),得到位元組碼的方法有三種:

1,)類名.class 例如:System.class

2,)對象.getClass(),例如:new Date().getClass()

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

反射中主要使用的是第三種。

5),九個預定義Class執行個體對象:

(boolean,byte,char,short,int,long,float,double,void)

參看Class.isPrimitive方法的幫助

基本資料類型使用的Class執行個體對象是 int class = Integer.TYPE.

數組類型的Class示例對象使用的是Class.isArray()

總之隻要是在源程式中出現的類型,都有各自的Class執行個體對象。

6),反射的概念:

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

7),Constructor類:

Constructor類代表某個類中的一個構造方法。

Constructor中的newInstance 和Class類中的newInstance方法有什麼關系?

關系是:提供便利。

例如可樂的例子:你每天要喝可樂,我每天都要去買可樂給你喝,那還不如 我把可樂

買回來,直接給你喝一樣了。提供了便捷

反射比較占用性能。

8),Field類:

比較位元組碼 一定要用 == 号 不要用equals方法。

set方法暴力通路;

9),Method類:

JDK1.4和JDK1.5中的方法invoke差別:

JDK1.5是有可變參數的,而JDK1.4不支援可變參數

ReflectPoint pt1 = new ReflectPoint (3,5);

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

//filed Y的值是多少?是5就是錯的。filed Y 不是對象身上的變量,而是類上的,要用它去取某個對象上對應的值

System.out.println(filed.get(pt1));

Field filed1 = pt1.getClass().getDeclaredField("x");

filed1.setAccessible(true);//暴力通路

System.out.println(filed1.get(pt1));

1),Method charAt=String.getMethod("charAt",int.class);//方法名為charAt參數為int

調用方法:

通常方式:String.charAt(int);

反射方式:charAt.invoke(String,1);當invoke()的第一個參數為null,說明該Method對象對應的是一個靜态方法。

//invoke執行方法

2),用反射方式執行某個類中的main方法

啟動Java程式的main方法的參數是一個字元串數組,

即public static void main(String[] args),通過反射方式來調用這個main方法

jdk1.5,整個數組是一個參數,jdk1.4 數組中的每個元素對應一個參數,為了向下相容,還是采用jdk1.4的方式。

mainMethod.invoke(null,new Object[](new String[]{}));

或mainMethod.invoke(null,(object)new String[]{});

編譯器會作特殊處理,編譯時不把參數當作數組看待。

10),數組的反射:

基本類型的一維數組可以被當作Object類型使用,不能當作Object[]類型使用;

具有相同維數和元素類型的數組屬于同一個類型,即具有相同的Class執行個體對象

非基本類型的一維數組,即可以當作Object類型使用也可以當作Object[]類型使用。

Arrays.asList()處理int類型數組和String類型數組的差異。

int用System.out.print()列印的還是位址。而String可以列印對象的屬性值。

Array工具類用于完成對數組的反射操作

11),ArrayList和HashSet的 比較以及Hashcode的分析:

Hashcode方法的作用:提高性能。

記憶體洩露的問題:

當一個對象被存儲進hashset集合以後,就不能再修改對象中的那些參與計算雜湊演算法的那些字段,

否則會造成記憶體洩露。表面上程式代碼在不斷增加對象,删除對象,但實際記憶體中并沒有删除,

該對象以後不再用了,可是記憶體中卻一直存在,造成浪費,最終導緻記憶體洩露。

例子:

Set<Person> set = newHashSet<Person>();

Person p1 = new Person("小強",25);

Person p2 = new Person("旺财",26);

Person p3 = new Person("豬豬",27);

set.add(p1);

set.add(p2);

set.add(p3);

System.out.println("總共有:"+set.size()+" 個元素!"); //結果:總共有:3個元素!

p3.setAge(2); //修改p3的年齡,此時p3元素對應的hashcode值發生改變

set.remove(p3); //此時remove不掉,造成記憶體洩漏

set.add(p3); //重新添加,居然添加成功

System.out.println("總共有:"+set.size()+" 個元素!"); //結果:總共有:4個元素!

for (Person person : set)

{

System.out.println(person);

12),反射的作用——>實作架構功能:

工具類和架構的差別:工具類是被使用者所調用,而架構則是調用使用者提供的類。

示例示範:

public static void main(String[] args) throws IOException,InstantiationException, IllegalAccessException,ClassNotFoundException {

//模拟一個架構

//定義一個檔案位元組流來讀取檔案

FileInputStream ips = newFileInputStream("config.properties");

//定義一個properties對象。

Properties props = new Properties();

//将Properties對象和流想關聯

props.load(ips);

//關閉資源

ips.close();

//反射

String className = props.getProperty("className");

Collection coll =(Collection)Class.forName(className).newInstance();

//建立ReflectPoint類對象

ReflectPoint pt1 = new ReflectPoint(3,3);

ReflectPoint pt2 = new ReflectPoint(5,5);

ReflectPoint pt3 = new ReflectPoint(3,3);

//将ReflectPoint類對象添加到Collection集合中

coll.add(pt1);

coll.add(pt2);

coll.add(pt3);

// System.out.println(pt1 ==pt1);

// System.out.println(pt1.equals(pt1));

// System.out.println(coll.size());

// pt1.y =1;

// coll.remove(pt1);

// coll.add(pt1);

System.out.println(coll.size());

8,JavaBean(内省):

1,什麼是JavaBean:

JavaBean是一種特殊類,主要用于傳遞資訊,這種Java類中的方法主要用于通路私有的字段,

且方法名符合某種命名規則。

2,JavaBean的屬性:

JavaBean的屬性是根據其中的setter和getter方法來确定的,而不是根據其中的成員變量,如果方法名

為setId,中文意思即為設定id,至于你把它存儲到那個變量上,不用管,如果方法名為getId。中文意思

即為擷取id,至于你從那個變量上取,也不用管,去掉set字首,剩餘部分就是屬性名,如果剩餘部分的

第二個字母是小寫,則把剩餘部分的首字母改成小寫。

例子: setId()的屬性名->id

isLast()的的屬性名->list

setCPU()->的屬性名->CPU

getGPU()->的屬性名->GPU

總之:一個類被當作JavaBean使用時,JavaBean的屬性是根據方法名判斷出來的,它根本看不到Java類

内部的成員變量。

一個符合JavaBean的特點的類可以當作普通類一樣進行使用,但把它當JavaBean用肯定需要帶來一些額外的

好處,我們才會去了解和應用JavaBean。

3,JavaBean的好處:

在JavaEE開發中經常要使用到JavaBean。很多環境要求按JavaBean方式進行操作,别人都這麼用和要求

這麼做,那你就沒什麼挑選的餘地!

JDK中提供了對JavaBean進行操作的一些API,這套API就稱為内省,如果你自己通過getX方法來通路私有

的x,怎麼做,有一定難度,用内省這套API操作JavaBean比普通類的方式更友善。