---------------------- 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比普通類的方式更友善。