1。斷言
a)???assert <boolean_expression>;
b)???assert <boolean_expression>:<detail_expression>;
如果 <boolean_expression>值為false,程序會異常終止。
使用b)形式時,<detail_expression>被轉(zhuǎn)換為String,并且補(bǔ)充報告斷言時打印的消息。
斷言的使用場合:
用于驗證某一方法或某一小組緊密耦合方法的內(nèi)部邏輯。
2。異常

分類:Error和RuntimeException是未受查異常,其余未受查異常。
應(yīng)該由編程者來負(fù)責(zé)的異常:RuntimeException和未受查異常。
1。static關(guān)鍵字
static方法可以訪問的變量:局部變量、static屬性及其參數(shù)。
注:最好使用類名來訪問靜態(tài)方法,不要用對象。
2。final關(guān)鍵字
a)final類:final類不能被繼承
b)final方法:final方法不能被覆蓋
c)final變量:final變量一旦賦值就不能再改變。
注:1)如果將一個引用類型的變量標(biāo)記為final,則該變量不能引用任何其他對象。但是,可以改變對象
????????????的內(nèi)容,因為只有引用本身是final。
?????????2)空final變量:一個空final變量應(yīng)該在構(gòu)造器種賦值,空final局部變量可以隨時在方法體內(nèi)設(shè)置。
3。抽象和接口
a)抽象類:abstract類不能實例化。但是可以創(chuàng)建抽象類引用,但是這個引用只能指向非抽象子類
b)抽象方法:abstract方法沒有具體的方法體
注:具有一個或多個抽象方法的類本身必須定義為abstract。
c)接口:
注:1)在接口中聲明的所有方法都是public和abstract的
??????? 。。。。。。。所有屬性都是public、static和final--即你只能聲明常數(shù)屬性。
??????? 2)因為接口的抽象方法其訪問控制符都已指定是public,所以類在實現(xiàn)這些方法時,必須顯示地使用??
?????????? ?public修飾符。
多態(tài)
eg :
class A{method();}
class B extends A{method();}
A a=new B();
a.method()調(diào)用的是B的method()方法。//a.method()執(zhí)行是,應(yīng)該看引用a具體指向的內(nèi)存空間實際存在的是什么對象。從這里來看,引用a所指向的實際內(nèi)存空間是B的實例。
方法的調(diào)用具體決定于運(yùn)行時,編譯器只是檢查java語法的正誤。
通過? 對象.屬性?? 的形式來獲得屬性值時,具體返回的屬性值是依賴于對象引用的類型的。
而通過方法來獲得對象的屬性時,方法調(diào)用所返回的屬性則決定于具體內(nèi)存中存在的真正對象
。
(attention: 靜態(tài)的方法這一條不適用)
Eg:
public class TestPoly {
?public static void main(String[] args) {
?
?Father1 f=new Child1();
??????? System.out.println(f.age);//在編譯階段就已經(jīng)可以確定f.age的值是:45,因為在編譯時不會生成對象,
??????????????????????????????????????????????//直接看引用類型即可,所以下面的((Child1)f).age之間看f的類型即可。
??????? System.out.println(((Child1)f).age);
??????? f.printAge();//這個需要在運(yùn)行是通過方法來決定結(jié)果,此時,f引用指向的是Child1類型的對象空間,所以調(diào)用的是Child類的pringAge()方法,從而得出結(jié)果是:90
??????((Child1)f).printAge();
????????}
}
class Father1{
?int age=45;
?public void printAge(){
??System.out.println(age);
?}
}
class Child1 extends Father1{
?int age=90;
?public void printAge(){
??System.out.println(age);
?}
}
1。四種訪問控制符
public?? protected??? default???? private
2。方法覆蓋
注意:覆蓋方法的可訪問性不能比其要覆蓋的方法弱。
3。super關(guān)鍵字的用法:
eg:
class B extends A{
??????super.println();
??????public void println(){}
}
class A{
public void println(){}}
(new B()).println;//此句話會調(diào)用super.println(),這個時候調(diào)用這個方法的對象是new B()對象。
4。instanceof運(yùn)算符
5。對象類型轉(zhuǎn)換
#? 始終允許類層次中向上轉(zhuǎn)換,事實上,這種轉(zhuǎn)換不需要轉(zhuǎn)換運(yùn)算符。可以由簡單的賦值完成。
eg:class B extends A
轉(zhuǎn)換示例:A a=new B();// 將類B轉(zhuǎn)換成類A;如果這樣轉(zhuǎn)換將產(chǎn)生錯誤:B b=new A();
#對于向下轉(zhuǎn)換,編譯器要求轉(zhuǎn)換至少必須是可能的。
#如果編譯器允許轉(zhuǎn)換,則在運(yùn)行時檢查對象類型。
6。構(gòu)造器
子類從父類可以繼承所有的變量和方法,但它不能繼承構(gòu)造器。
調(diào)用構(gòu)造器時,總是先遞歸調(diào)用父類的構(gòu)造器。
在構(gòu)造器中使用super和this關(guān)鍵字時,必須放在構(gòu)造器的第一行。
7。Object類的幾個方法
注:如果覆蓋Object的equals方法,都應(yīng)該覆蓋hashCode方法來保證相同對象的hashCode值相同。
8.Wrapper類
8種基本類型對應(yīng)8種包裝類
J2SE5.0的自動裝箱基本類型:
eg:
int pInt=420;
Integer wInt=pInt;//不需要使用這樣的語句:Integer wInt=new Integer(pInt);
intp2=wInt;
9。varargs
eg:public void sum(int...nums)<===>public void sum(int[] nums)
?
scjp:
1)子類不能繼承父類的構(gòu)造器
2)構(gòu)造器中調(diào)用this和super語句,則必須放在構(gòu)造器中的第一句
1。使用增強(qiáng)的for循環(huán)(jdk1.5)
int[] list=new int[3];//此時list數(shù)組已經(jīng)初始化,每個元素為0;
for(int element:list)
{
???System.out.println(element);
}
Console:
0
0
0
上述的for語句等價于:
for(int i=0;i<list.length;i++)
{
???????System.out.println(list[i]);
}
2。數(shù)組的復(fù)制
使用System.arraycopy(...)函數(shù);
1。變量及其初始化
兩種變量:基本變量和引用類型變量。
變量的聲明位置:方法內(nèi)或者方法外。
變量的初始化:
使用變量前必須初始化。
如果代碼給一個堆棧變量賦值,編譯器就很容易檢查此變量;當(dāng)開始執(zhí)行方法時,已經(jīng)為this引用和方法參數(shù)賦了值。
對于堆的對象屬性,為了保證這一原則,要求編程人員為構(gòu)造器賦一個初值,如果沒有的話,編譯器會為其賦缺省值。
2。移位運(yùn)算符
>>???? >>>:>> 帶符號
<<<:a<<<b運(yùn)算過程:a<<<(b%32(int)或者b%64(long)),?所以a<<<32=a;即a<<<0。
3。用+運(yùn)算符進(jìn)行字符串連接
注:非String對象要轉(zhuǎn)換為等價的字符串時使用它的toString()成員函數(shù)。
4 。switch語句
switch語句的表達(dá)式必須是和int類型相容的表達(dá)式,byte、short和char類型會升級。(包括枚舉類型)
而對浮點(diǎn)和long表達(dá)式或?qū)ο笠茫òㄗ址┦遣辉试S的。
注:可以使用rutrun代替break語句
???????? 如果switch語句是在循環(huán)中,continue語句會使執(zhí)行跳出switch結(jié)構(gòu)
關(guān)于Logon例子的學(xué)習(xí)
Welcome頁面:
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
(在struts1.2中要寫成? <%@ taglib uri="
http://struts.apache.org/tags-html
" prefix="html" %>? 其他兩個相似
作用:使得輸入的擴(kuò)展標(biāo)簽庫可以被頁面的其他部分使用)
<HTML>
<HEAD>
<TITLE>Welcome!</TITLE>
<html:base/>
(使得對于圖像等資源的引用與原始jsp頁面位置相關(guān))
</HEAD>
<BODY>?<logic:presentname="user">????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
<H3>Welcome<bean:write name="user" property="username"/>!</H3>??????????????????????????????????????????????????????
</logic:present>???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
(檢查用戶是否在session中存儲了userbean.如果存儲了該bean,則在歡迎頁面中顯示username)?????????
?
??????????
<logic:notPresentscope="session" name="user">
<H3>Welcome World!</H3>
</logic:notPresent>
(如果不存在userbean則顯示"Welcome World!")
注:在Struts中的邏輯標(biāo)簽都是使用"this"和"notThis"這樣的表單,但可以通過擴(kuò)展標(biāo)簽庫來實現(xiàn)if/then/else等語法
<html:errors/>
(用來顯示錯誤信息:)
<UL>
<LI><html:linkforward="logon">Sign in</html:link></LI>
<logic:presentname="user">
<LI><html:linkforward="logoff">Sign out</html:link></LI>
</logic:present>
</UL>
<IMG src='struts-power.gif' alt='Powered by Struts'>
</BODY>
</HTML>
上述的jsp頁面在瀏覽器中的代碼:
<HTML>
<HEAD>
<TITLE>Welcome!</TITLE>
<base href="
http://localhost:8080/logon/pages/Welcome.jsp
">
</HEAD>
<BODY>
<H3>Welcome World!</H3>
<UL>
<LI><a href="/logon/logon.do">Sign in</a></LI>
</UL>
<IMG src='struts-power.gif' alt='Powered by Struts'>
</BODY>
</HTML>
--------------------------------------------------------------------------------------------------------------------------
<%@ taglib uri="/tags/struts-html" prefix="html" %>
(參看Welcome.jsp部分)
<HTML>
<HEAD>
<TITLE>Sign in, Please!</TITLE>
</HEAD>
<BODY>
<html:errors/>
<html:formaction="/LogonSubmit" focus="username">
(<html:form> 標(biāo)簽會生成一個HTML表單來使用戶輸入數(shù)據(jù)。其action屬性指向Struts配置中的某個ActionMapping對象,該對象決定了使用哪個javabean來填充HTML控件,同時該javabean也是Srtuts框架結(jié)構(gòu)的一個ActionForm類)
<TABLE border="0" width="100%">
<TR>
<TH align="right">Username:</TH>
<TD align="left"><html:textproperty="username"/></TD>
(<html:text>標(biāo)簽創(chuàng)建一個HTML文本域來輸入框,同時,它還使用該表格對應(yīng)的JavaBean中屬性名為username的屬性值來進(jìn)行自我填充。)
</TR>
<TR>
<TH align="right">Password:</TH>
<TD align="left"><html:passwordproperty="password"/></TD>
</TR>
<TR>
<TD align="right"><html:submit/></TD>
<TD align="left"><html:reset/></TD>
</TR>
</TABLE>
</html:form>
</BODY>
</HTML>
---------------------------------------------------------------------------------------------------------
Struts中的 ?struts-config.xml的配置
ActionMapping的配置元素
?path -?????? 該ActionMapping的唯一標(biāo)識符,它包括對應(yīng)的Web地址 (不包括擴(kuò)展名.do)
?type?-?????? 當(dāng)請求該路徑時,調(diào)用的Action對象
?name?-? ?? HTML表單對應(yīng)的JavaBean(ActionForm)
?scope?-???? 定義了存儲該JavaBean在請求中(request)還是在會話中(session)
?validate?- 定義了在調(diào)用Action對象前是否調(diào)用JavaBean上的validate方法
?input -????? 定義了當(dāng)validate方法返回false時要轉(zhuǎn)移到的地址
(Struts中的很多命名都是很含糊的;比如ActionMapping中的name屬性并不是指該ActionMapping對象的名字,而是指該ActionMapping使用的JavaBean的名字;)?
1。構(gòu)造和初始化對象
eg:MyDate my_birth=new MyDate(28,9,2006);
???????????????????????????????????????
my_birth?|??? ? 0x01abcdef|----------|
???????????????????????????????????????????????????? ??|?????????
?day????????|???????????????????28|<-? -------|
month?????|?????????????????????9|
year??????? |?????????????? 2006|
MyDate my_birth只是聲明一個引用,未分配任何內(nèi)存空間
new MyDate(28,9,2006)聲明一塊內(nèi)存空間并進(jìn)行數(shù)據(jù)初始化
my_birth=new MyDate(28,9,2006);將引用指向已分配的內(nèi)存空間,建立兩者之間的關(guān)系
2。Java語言總是使用傳值調(diào)用
即:java編程語言支持按值傳遞 參數(shù)的指針。
eg:public static void chV(double x)//無法工作的
?????? {
????????????x=x*3;
?????????}
然后我們調(diào)用方法:
double y=10;
chV(y);
結(jié)果之中y還是10;
這樣來理解執(zhí)行過程:
public static void chV(y)
?????? {double x;
????????????x=y=10;
????????????x=x*3;
?????????}//方法結(jié)束,局部變量x銷毀;
注意:當(dāng)用對象的引用作為參數(shù)傳遞時可以改變對象的狀態(tài),因為傳遞進(jìn)來的引用參數(shù)和臨時引用指向了
????????????同一個對象(即同一片內(nèi)存空間)。
scjp:
幾個容易忘記的關(guān)鍵字:const、enum、native、synchronized、transient、volatile
注意:true和false是Boolean字符,null也是字符,都不是關(guān)鍵字。
3。關(guān)于String
java中一個對象的地址用如此方法返回:?System.identifyHashCode(Object??a);?
1。java類、方法、屬性的聲明
2。
信息隱藏:對于一個對象的屬性應(yīng)該對外進(jìn)行隱藏,通過提供getXyz()和setXyz()的存取方法來訪問。
???
好處:
可以更改類內(nèi)部的結(jié)構(gòu),而客戶端代碼卻不用改變。并且可以在方法中對數(shù)據(jù)進(jìn)行驗證處理。
eg:public class MyDate{
????????private int limitDays=30;
//當(dāng)limitDays更改為40或者其他天數(shù)時,客戶端依舊使用的時getLimitDays(),不用修改。
?????????public int getLimitDays()
??????{return? limitDays;}
//在方法中對數(shù)據(jù)進(jìn)行驗證處理。
?????????public boolean setLimitDays(int days)
{limitDays=days;}
}????
3。缺省構(gòu)造器
注意:
??????每個類都有一個默認(rèn)的構(gòu)造器。如果不編寫構(gòu)造器,Java編程語言將提供一個缺省的構(gòu)造器。這個構(gòu)造器不帶參數(shù)并且為空。
??????但是如果自己在這個類中添加了任何構(gòu)造器,那么原來提供的構(gòu)造器將不在起作用。
eg:1)Class A{}//new A()----正確
Class A{
public Class(){int a;}
}//此時再調(diào)用new A()就會產(chǎn)生編譯器錯誤。
4。源文件布局
??????任何導(dǎo)入語句必須位于所有類聲明之前。如果使用包聲明,則必須位于類聲明和導(dǎo)入語句前。
??????源文件的名稱必須與該文件的公有類聲明和名稱相同。原文件可以包含多個類聲明,但是只有一個類可以被聲明為公有的。如果源文件不包含公有類聲明,那么源文件的名稱不受限制。
5。import語句
注意:import語句不會導(dǎo)致編譯器將任何附加內(nèi)容加載到工作內(nèi)存中(與C和C++的include 語句有很大不同)。并且無論是否使用通配符(*),import語句都對輸出類文件及運(yùn)行時性能都沒有任何影響。
1。什么是JVM?
JVM:在真是機(jī)器中
用軟件來模擬實現(xiàn)的一種虛擬的機(jī)器。 //貌似和虛擬機(jī)差不多。
????????????JVM運(yùn)行的代碼存儲在
.class文件中。
????????????
字節(jié)碼是JVM的機(jī)器代碼指令。
????????????不管是Java技術(shù)開發(fā)工具還是能運(yùn)行Applet的Web瀏覽器,
都有一個JVM的實現(xiàn)。
2。java程序是如何運(yùn)行起來的?
不實用jit:
編譯:?原文件(編譯:javac)----->字節(jié)碼(存儲在.class文件中)
運(yùn)行:java(將字節(jié)碼裝在進(jìn)類裝載器)------>字節(jié)碼校驗------->解釋器執(zhí)行----->運(yùn)行時--->硬件
使用JIT:???編譯與直接用jre相同,運(yùn)行時:會將解釋器與運(yùn)行時合并用JIT代碼生成器來完成--->硬件