我本來只是想要要記錄一下我個人Java 學習過程,
不過我在學習 Java 的過程中碰到了很多問題
看了三本書覺得寫的非常的好所以也想推薦給各位準考生,
看過了這些書後我覺得按照程度這樣看下來是最循序漸進的,
可以依照你們的程度來看看剛開始因為感受到了自己基礎不足,
而且考 SCWCD 前也必須先考過 SCJP…..
點擊下載:Java認證考試書單
SUN
我本來只是想要要記錄一下我個人Java 學習過程,
不過我在學習 Java 的過程中碰到了很多問題
看了三本書覺得寫的非常的好所以也想推薦給各位準考生,
看過了這些書後我覺得按照程度這樣看下來是最循序漸進的,
可以依照你們的程度來看看剛開始因為感受到了自己基礎不足,
而且考 SCWCD 前也必須先考過 SCJP…..
點擊下載:Java認證考試書單
準備參加SCJP考試該如何準備呢?分享一篇關於一位考生考試心得,寫的很詳細現在分享給大家!

SCJP考試全名是Sun Certified Programmer for Java,
也就是昇陽公司對Java語言的認證考試。
其實我很早以前就想要考這個認證考試了,
畢竟工作的環境主要就是以Java為主。
不過由於這個考試純粹是個人興趣,
再加上人類特有的拖性,
所以去年買的考試券,
拖到今年快過期沒辦法了,
我才去參加考試。
(不過去年是有準備考TOEIC啦,詳見此篇。這是藉口嗎XP)
就在準備好一陣子之後,
我終於在鳳凰颱風來臨的前夕,
前去SCJP考試中心看看能不能過關。
雖然我買的考試券有允許失敗一次的機會,
也就是萬一第一次沒考過,
還可以考第二次,
但是我還是希望能一次過關啊。
幸好,努力是有代價的。
因為SCJP是上機考試,
所以當考完後,
馬上就可以知道結果。
| There are 72 questions in this exam. You answered 68 questions correctly which gives you a score of 94%.PASSING SCORE:59% YOUR SCORE:94% TEST STATUS: Pass |
看了上面的成績報告書的資料,
真的是太高興了。
點擊閱讀全文….
世界上並沒有成為高手的捷徑,但一些基本原則是可以遵循的。
1、紮實的基礎
數據結構、離散數學、編譯原理,這些是所有計算機科學的基礎,如果不掌握它們,很難寫出高水平的程序。程序人人都會寫,但當你發現寫到一定程度很難再提高的時候,就應該想想是不是要回過頭來學學這些最基本的理論。不要一開始就去學OOP,即使你再精通OOP,遇到一些基本算法的時候可能也會束手無策。因此多讀一些計算機基礎理論方面的書籍是非常有必要的。
2、豐富的想像力
不要拘泥於固定的思維方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想像力是建立在豐富的知識的基礎上,除計算機以外,多涉獵其他的學科,比如天文、物理、數學等等。開闊的思維對程序員來說很重要。
3、最簡單的是最好的
…..
Oracle已經佔據了應用程序和數據庫的大部分市場。為了保持在這一領域的主要地位,他們想要擴展並深入到硬件業務中。
收購是一項長期的防禦舉動以回應微軟收購SAP的謠言。
雖然收購的原因對很多人來說是很重要的,但是對於我來說最重要的是會在Sun這15年中所創建和服務的Java技術上發生什麼事情。我經常會寫到”Java is COBOL” ,因為今天幾乎所有的商業都有一些Java要做的事情。謠言在應用程序開發行業中漫天飛,但是我們早知道塵埃會落定,故事將會結束。這不意味著我們不能用歷史來引導我們預測未來。 Ruby能否成為第二個Java?
從純粹的Java角度來看一看Oracle所得到的,這三個關鍵問題是:
Java Community Process (JCP)會繼續存在嗎?
Apache Software Foundation (ASF)和Sun之間的爭端會解決嗎?
Oracle會通過為JDK扣交TCKs而取得Java IP嗎?
JCP會繼續存在嗎?
Oracle是JCP的高級成員,而且他們已經提交了80多個Java Specification Requests (JSRs)。儘管有這個長期的參與承諾,Oracle表示——和其他的供應商和參與者一起——JCP過程需要變得更開放,透明並且廠商中立。特別是在2007年12月12日的時候,Oracle提出了這個:Resolution 1 (由Oracle提議,第二個是由BEA提出) .
“Executive Committee感覺到JCP變成一個開放獨立並且是廠商中立的標準組織,那裡所有的成員都參與公平競爭,具體有以下特點:
成員基金開發和管理費用
一個法人實體,有法律,理事會和董事成員等等。
一個新的,簡單的IPR Policy(知識產權政策)允許更大範圍的執行。
嚴格的兼容性要求
致力於促進Java編程模式
此外,EC將在對Java Community干預最小的情況下,盡快實施這個計劃以確保這樣的過渡盡快的實施。 “
所以我們希望Oracle能繼續JCP,但是它可能變成一個完全不同的JCP.如果Oracle成功的實施了所期望的轉變,結果會是非常有趣的而且具有廣泛的影響。特別有趣的是看到Oracle如何實施這些變革。那將是第一個跡象表明Oracle將如何同Java工作。
Apache Software Foundation (ASF)和Sun之間的爭端會解決嗎?客戶端Java的革命性飛躍圍繞Apache和Sun爭論的主要問題是多種多樣的,但是這裡有一個對這些事件的簡短總結:
Apache Harmony Project目的是創建一個ASF授權的模塊化虛擬機(VM)和基於Java SE 5.0版本的JDK.
Sun的JDK開源和OpenJDK項目。
要成為一個認證的JDK,Harmony需要通過Sun的Technology Compatibility Kits(TCKs)。
Sun說到Harmony是基於舊的JDK5.0而且不是在最新的JDK6.0上,所以認證過程停滯了,Harmony Project也懸而未決。
到今天,OpenJDK管理委員會也沒有解決這個爭端。 Oracle如何處理這個情況是他們如何管理Java程序的第二個晴雨表。
Oracle會通過為JDK扣交TCKs而取得Java IP嗎?
在JDK認證中涉及了很多法律問題會成為Java的大量蠕蟲。例如,除非你為OpenJDK通過TCK,否則你不獲得Java Intellectual Property (IP)的權力——即你沒有認證的JDK.
由於你沒有Java SE7的一套規範,而且Sun也沒有購買一個,所有沒有辦法擁有一個官方的OpenJDK 7.Oracle會採取同樣的辦法,而且不會發布一個規範或是TCKs,這樣將IP在內部保持。
總結
如你所見,這三個問題都有所關聯,每個答案本身有不同的水平和層次,例如:
JCP肯能會繼續存在,但是它可能在指定技術方向上承擔不同的作用。
管理上的這種差異為ASF問題提供一個簡單的解決方案,讓它們成為泛黃的記憶。
Oracle可能會推出一個新的JDK規範連同TCKs一起,完全實現一個開放的JDK承諾。
如何發揮這些因素將讓Java developmer community清楚的知道Oracle如何運行Java.
異常應當僅用於有錯誤發生時,而不要控制流。
2.不要兩次初始化變量
Java通過調用獨特的類構造器默認地初始化變量為一個已知的值。所有的對像被設置成null,integers (byte, short, int, long)被設置成0,float和double設置成0.0,Boolean變量設置成false。這對那些擴展自其它類的類尤其重要,這跟使用一個新的關鍵詞創建一個對象時所有一連串的構造器被自動調用一樣。
3.在任何可能的地方讓類為Final
標記為final的類不能被擴展。在《核心Java API》中有大量這個技術的例子,諸如java.lang.String。將String類標記為final阻止了開發者創建他們自己實現的長度方法。
更深入點說,如果類是final的,所有類的方法也是final的。 Java編譯器可能會內聯所有的方法(這依賴於編譯器的實現)。在我的測試裡,我已經看到性能平均增加了50%。
4.在任何可能的地方使用局部變量
屬於方法調用部分的自變量和聲明為此調用一部分的臨時變量存儲在棧中,這比較快。諸如static,實例(instance)變量和新的對象創建在堆中,這比較慢。局部變量的更深入優化依賴於你正在使用的編譯器或虛擬機。
5.停止小聰明
很多開發人員在腦子中編寫可複用和靈活的代碼,而有時候在他們的程序中就產生額外的開銷。曾經或者另外的時候他們編寫了類似這樣的代碼:
public void doSomething(File file) {
FileInputStream fileIn = new FileInputStream(file);
// do something
他夠靈活,但是同時他們也產生了更多的開銷。這個主意背後做的事情是操縱一個InputStream,而不是一個文件,因此它應該重寫如下:
public void doSomething(InputStream inputStream){
// do something
6.乘法和除法
我有太多的東東適用於摩爾法則——它聲明CPU功率每年成倍增長。 “摩爾法則”表明每年由開發者所寫的差勁的代碼數量三倍增加,劃去了摩爾法則的任何好處。
考慮下面的代碼:
for (val = 0; val < 100000; val +=5) { shiftX = val 8; myRaise = val 2; }
如果我們狡猾的利用位移(bit),性能將會六倍增加。這是重寫的代碼:
for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }
代替了乘以8,我們使用同等效果的左移3位。每一個移動相當於乘以2,變量myRaise對此做了證明。同樣向右移位相當於除以2,當然這會使執行速度加快,但可能會使你的東東以後難於理解;所以這只是個建議
7.用代碼有效處理內存溢出
OutOfMemoryError是由於內存不夠後普遍會遇到的問題,下面一段代碼能有效判斷內存溢出錯誤,並在內存溢出發生時有效回收內存
通過該方法可以聯想到有效管理連接池溢出,道理等同。
import Java.util.*;
public class DataServer
{
private Hashtable data = new Hashtable();
public Object get (String key)
{
Object obj = data.get (key);
if (obj == null)
{
System.out.print (key + “ ”);
try
{
// simulate getting lots of data
obj = new Double[1000000];
data.put (key, obj);
}
catch (OutOfMemoryError e)
{
System.out.print (“No Memory! ”);
flushCache();
obj = get (key);// try again
}
}
return (obj);
}
public void flushCache()
{
System.out.println (“Clearing cache”);
data.clear();
}
public static void main (String[] args)
{
DataServer ds = new DataServer();
int count = 0;
while (true) // infinite loop for test
ds.get (“” count+);
}
}
8. Lazy Loading (Lazy evaluation)在需要裝入的時候才裝入
static public long
factorial( int n ) throws IllegalArgumentException
{
IllegalArgumentException illegalArgumentException =
new IllegalArgumentException( “must be >= 0” );
if( n < 0 ) {
throw illegalArgumentException ;
} else if( ( n 0 ) || ( n 1 ) ) {
return( 1 );
} else (
return( n * factorial( n – 1 ) ) ;
}
優化後代碼
static public long
factorial( int n ) throws IllegalArgumentException
{
if( n < 0 ) {
throw new IllegalArgumentException( “must be >= 0” );
} else if( ( n 0 ) || ( n 1 ) ) {
return( 1 );
} else (
return( n * factorial( n – 1 ) ) ;
}
9.異常在需要拋出的地方拋出,try catch能整合就整合
try {
some.method1(); // Difficult for Javac
} catch( method1Exception e ) { // and the JVM runtime
// Handle exception 1 // to optimize this
} // code
try {
some.method2();
} catch( method2Exception e ) {
// Handle exception 2
}
try {
some.method3();
} catch( method3Exception e ) {
// Handle exception 3
}
已下代碼更容易被編譯器優化
try {
some.method1(); // Easier to optimize
some.method2();
some.method3();
} catch( method1Exception e ) {
// Handle exception 1
} catch( method2Exception e ) {
// Handle exception 2
} catch( method3Exception e ) {
// Handle exception 3
}
10. For循環的優化
Replace…
for( int i = 0; i < collection.size(); i++ ) {
…
}
with…
for( int i = 0, n = collection.size(); i < n; i++ ) {
…
}
11.字符串操作優化
在對字符串實行+操作時,最好用一條語句
// Your source code looks like…
String str = “profit = revenue( ” revenue
“ – cost( ” cost ““;
//編譯方法
String str = new StringBuffer( ).append( “profit = revenue( “ ).
append( revenue ).append( “ – cost( “ ).
append( cost ).append( ““ ).toString( );
在循環中對字符串操作時改用StringBuffer.append()方法
String sentence = “”;
for( int i = 0; i < wordArray.length; i++ ) {
sentence += wordArray[ i ];
}
優化為
StringBuffer buffer = new StringBuffer( 500 );
for( int i = 0; i < wordArray.length; i++ ) {
buffer.append( wordArray[ i ] );
}
String sentence = buffer.toString( );
12.對象重用(特別對於大對象來說)
public
class Point
{
public int x;
public int y;
public Point( )
{
this( 0, 0 );
}
}
優化為:
public class Component
{
private int x;
private int y;
public Point getPosition( )
{
Point rv = new Point( ); // Create a new Point
rv.x = x; // Update its state
rv.y = y;
return rv;
}
}
// Process an array of Component positions…
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( );
// Process position value…
// Note: A Point object is created for each iteration
// of the loop…
}
可再次優化,僅使用一個類對象:)
public
class Component
{
private int x;
private int y;
public Point getPosition( Point rv )
{
if( rv == null) rv = new Point( );
rv.x = x; // Update its state
rv.y = y;
return rv;
}
// Create a single point object and reuse it…
Point p = new Point( );
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( p );
// Process position value…
// Note: Only one Point object is ever created.
}
13. J2EE相關
a)盡量不要將大對象放到HttpSession或其他須序列化的對像中,並註意及時清空Session
b)使用預編譯語句prepareStatement代替createStatement
c)盡可能使用連接池
d)能使用Cache就使用Cache,具體實現可參考jive(CacheCacheableCacheObjectCacheSizesDefaultCacheLinkdListLinkdListNode)或ofbiz(org.ofbiz.core.util. UtilCache.Java)
提起Java內部類(Inner Class)可能很多人不太熟悉,實際上類似的概念在C++裡也有,那就是嵌套類(Nested Class),關於這兩者的區別與聯繫,在下文中會有對比。內部類從表面上看,就是在類中又定義了一個類(下文會看到,內部類可以在很多地方定義),而實際上並沒有那麼簡單,乍看上去內部類似乎有些多餘,它的用處對於初學者來說可能並不是那麼顯著,但是隨著對它的深入了解,你會發現Java的設計者在內部類身上的確是用心良苦。學會使用內部類,是掌握Java高級編程的一部分,它可以讓你更優雅地設計你的程序結構。下面從以下幾個方面來介紹:
第一次見面
public interface Contents {
int value();
}
public interface Destination {
String readLabel();
}
public class Goods {
private class Content implements Contents {
private int i = 11;
public int value() {
return i;
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}
}
class TestGoods {
public static void main(String[] args) {
Goods p = new Goods();
Contents c = p.cont();
Destination d = p.dest(“Beijing”);
}
}
在這個例子裡類Content和GDestination被定義在了類Goods內部,並且分別有著protected和private修飾符來控制訪問級別。 Content代表著Goods的內容,而GDestination代表著Goods的目的地。它們分別實現了兩個接口Content和Destination。在後面的main方法裡,直接用Contents c和Destination d進行操作,你甚至連這兩個內部類的名字都沒有看見!這樣,內部類的第一個好處就體現出來了??隱藏你不想讓別人知道的操作,也即封裝性。
同時,我們也發現了在外部類作用範圍之外得到內部類對象的第一個方法,那就是利用其外部類的方法創建並返回。上例中的cont()和dest()方法就是這麼做的。那麼還有沒有別的方法呢?當然有,其語法格式如下:
outerObject=new outerClass(Constructor Parameters);
outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);
注意在創建非靜態內部類對象時,一定要先創建起相應的外部類對象。至於原因,也就引出了我們下一個話題??非靜態內部類對像有著指向其外部類對象的引用,對剛才的例子稍作修改:
public class Goods {
private valueRate=2;
private class Content implements Contents {
private int i = 11*valueRate;
public int value() {
return i;
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}
}
修改的部分用藍色顯示了。在這裡我們給Goods類增加了一個private成員變量valueRate,意義是貨物的價值係數,在內部類Content的方法value()計算價值時把它乘上。我們發現,value()可以訪問valueRate,這也是內部類的第二個好處??一個內部類對象可以訪問創建它的外部類對象的內容,甚至包括私有變量!這是一個非常有用的特性,為我們在設計時提供了更多的思路和捷徑。要想實現這個功能,內部類對象就必須有指向外部類對象的引用。 Java編譯器在創建內部類對象時,隱式的把其外部類對象的引用也傳了進去並一直保存著。這樣就使得內部類對象始終可以訪問其外部類對象,同時這也是為什麼在外部類作用範圍之外向要創建內部類對象必須先創建其外部類對象的原因。
有人會問,如果內部類裡的一個成員變量與外部類的一個成員變量同名,也即外部類的同名成員變量被屏蔽了,怎麼辦?沒事,Java裡用如下格式表達外部類的引用:
outerClass.this
有了它,我們就不怕這種屏蔽的情況了。
靜態內部類
和普通的類一樣,內部類也可以有靜態的。不過和非靜態內部類相比,區別就在於靜態內部類沒有了指向外部的引用。這實際上和C++中的嵌套類很相像了,Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用這一點上,當然從設計的角度以及以它一些細節來講還有區別。
除此之外,在任何非靜態內部類中,都不能有靜態數據,靜態方法或者又一個靜態內部類(內部類的嵌套可以不止一層)。不過靜態內部類中卻可以擁有這一切。這也算是兩者的第二個區別吧。
局部內部類
是的,Java內部類也可以是局部的,它可以定義在一個方法甚至一個代碼塊之內。
public class Goods1 {
public Destination dest(String s) {
class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
return new GDestination(s);
}
public static void main(String[] args) {
Goods1 g= new Goods1();
Destination d = g.dest(“Beijing”);
}
}
上面就是這樣一個例子。在方法dest中我們定義了一個內部類,最後由這個方法返回這個內部類的對象。如果我們在用一個內部類的時候僅需要創建它的一個對象並創給外部,就可以這樣做。當然,定義在方法中的內部類可以使設計多樣化,用途絕不僅僅在這一點。
下面有一個更怪的例子:
public class Goods2{
private void internalTracking(boolean b) {
if(b) {
class TrackingSlip {
private String id;
TrackingSlip(String s) {
id = s;
}
String getSlip() { return id; }
}
TrackingSlip ts = new TrackingSlip(“slip”);
String s = ts.getSlip();
}
}
public void track() { internalTracking(true); }
public static void main(String[] args) {
Goods2 g= new Goods2();
g.track();
}
}
你不能在if之外創建這個內部類的對象,因為這已經超出了它的作用域。不過在編譯的時候,內部類TrackingSlip和其他類一樣同時被編譯,只不過它由它自己的作用域,超出了這個範圍就無效,除此之外它和其他內部類並沒有區別。
匿名內部類
java的匿名內部類的語法規則看上去有些古怪,不過如同匿名數組一樣,當你只需要創建一個類的對象而且用不上它的名字時,使用內部類可以使代碼看上去簡潔清楚。它的語法規則是這樣的:
new interfacename(){……};或new superclassname(){……};
下面接著前面繼續舉例子:
public class Goods3 {
public Contents cont(){
return new Contents(){
private int i = 11;
public int value() {
return i;
}
};
}
}
這裡方法cont()使用匿名內部類直接返回了一個實現了接口Contents的類的對象,看上去的確十分簡潔。
在java的事件處理的匿名適配器中,匿名內部類被大量的使用。例如在想關閉窗口時加上這樣一句代碼:
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
有一點需要注意的是,匿名內部類由於沒有名字,所以它沒有構造函數(但是如果這個匿名內部類繼承了一個只含有帶參數構造函數的父類,創建它的時候必須帶上這些參數,並在實現的過程中使用super關鍵字調用相應的內容)。如果你想要初始化它的成員變量,有下面幾種方法:
如果是在一個方法的匿名內部類,可以利用這個方法傳進你想要的參數,不過記住,這些參數必須被聲明為final。
將匿名內部類改造成有名字的局部內部類,這樣它就可以擁有構造函數了。
在這個匿名內部類中使用初始化代碼塊。
為什麼需要內部類?
java內部類有什麼好處?為什麼需要內部類?
首先舉一個簡單的例子,如果你想實現一個接口,但是這個接口中的一個方法和你構想的這個類中的一個方法的名稱,參數相同,你應該怎麼辦?這時候,你可以建一個內部類實現這個接口。由於內部類對外部類的所有內容都是可訪問的,所以這樣做可以完成所有你直接實現這個接口的功能。
不過你可能要質疑,更改一下方法的不就行了嗎?
的確,以此作為設計內部類的理由,實在沒有說服力。
真正的原因是這樣的,java中的內部類和接口加在一起,可以的解決常被C++程序員抱怨java中存在的一個問題??沒有多繼承。實際上,C++的多繼承設計起來很複雜,而java通過內部類加上接口,可以很好的實現多繼承的效果。
Java發展到現在,按應用來分主要分為三大塊:J2SE,J2ME和J2EE。
這三塊相互補充,應用範圍不同。
J2SE就是Java2的標準版,主要用於桌面應用軟件的編程;
J2ME主要應用於嵌入是系統開發,如手機和PDA的編程;
J2EE是Java2的企業版,主要用於分佈式的網絡程序的開發,如電子商務網站和ERP系統。
先學習j2se
要學習j2ee就要先學習j2se,剛開始學習j2se先建議不要使用IDE,然後漸漸的過渡到使用IDE開發,畢竟用它方便嘛。學習j2se推薦兩本書,《java2核心技術一二卷》,《java編程思想》,《java模式》。其中《java編程思想》要研讀,精讀。這一段時間是基本功學習,時間會很長,也可能很短,這要看學習者自身水平而定。
不要被IDE糾纏
在學習java和j2ee過程中,你會遇到五花八門的IDE,不要被他們迷惑,學JAVA的時候,要學語言本身的東西,不要太在意IDE的附加功能,JAVA編程在不同IDE之間的轉換是很容易的,過於的在意IDE的功能反而容易耽誤對語言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加強版WSAD。用好其中一個就可以了,推薦從eclipse入手j2ee。因為Jbuilder更適合於寫j2se程序。
選擇和學習服務器使用配置
當你有了j2se和IDE的經驗時,可以開始j2ee的學習了,web服務器:tomcat,勿庸置疑,tomcat為學習web服務首選。而應用服務器目前主要有三個:jboss、weblogic、websphere。有很多項目開始採用jboss,並且有大量的公司開始做websphere或weblogic向jboss應用服務器的移植(節省成本),這裡要說的是,學習tomcat和jboss我認為是首選,也是最容易上手的。學習服務器使用配置最好去詢問有經驗的人(有條件的話),因為他們或許一句話就能解決問題,你自己上網摸索可能要一兩天(我就乾過這種傻事),我們應該把主要時間放在學習原理和理論上,一項特定技術的使用永遠代替不了一個人的知識和學問。
學習web知識
如果你是在做電子商務網站等時,你可能要充當幾個角色,這是你還要學習:
html,可能要用到dreamwave等IDE。
Javascript,學會簡單的數據校驗,數據聯動顯示等等。
J2eeAPI學習
學習j2eeAPI和學習服務器應該是一個迭代的過程。
先學習jsp和servlet編程,這方面的書很多,我建立看oreilly公司的兩本《jsp設計》和《java servlet編程》,oreilly出的書總是那本優秀,不得不佩服。
學習jdbc數據庫編程,j2ee項目大多都是MIS系統,訪問數據庫是核心。這本應屬於j2se學習中,這裡拿出來強調一下。
學習jndi api,它和學習ejb可以結合起來。
學習ejb api,推薦書《精通ejb》
經過上面的這些的學習,大概可以對付一般的應用了。
有人說跟著sun公司的《j2ee tutorial》一路學下來,當然也可以。
學習ejb設計模式和看代碼(最重要)
設計模式是練內功,其重要性可以這麼說吧,如果你不會用設計模式的話,你將寫出一堆使用了ejb的垃圾,有慢又是一堆bug,其結果不如不用ejb實現( ejb不等於j2ee)
無論學習什麼語言,都應該看大量代碼,你看的代碼量不到一定數量,是學不好j2ee的。
目前有很多開源的工程可以作為教材:
jive論壇
petstore sun公司
dune sun公司
等等,研讀一個,並把它用到自己的工程中來。
J2ee其他學習
當你漸漸對j2ee了解到一定深度時,你要開始關注當前領域中的一些技術變化,J2ee是一塊百家爭鳴的領域,大家都在這裡提出自己的解決方案,例如structs,hiberate,ofbiz等等,學習這些東西要你的項目和目標而定,預先補充一下未嘗不可,但不用涉及太深,畢竟學習原理和理論是最最重要的事。
目前常見j2eeAPI
JavaServer Pages(JSP)技術1.2
Java Servlet技術2.3
JDBC API 2.0
Java XML處理API(JAXP)1.1
Enterprise JavaBeans技術2.0
Java消息服務(JMS)1.0
Java命名目錄接口(JNDI)1.2
Java事務API(JTA) 1.0
JavaMail API 1.2
JavaBeans激活架構(JAF)1.0
J2EE連接器體系結構(JCA)1.0
Java認證和授權服務(JAAS)1.0
學習上面的某些API要以你的項目而定,了解所有他們總之是有好處的。
上面印證了大家說的一句話,java語言本身不難學,但是技術太多,所以學java很費勁。回想一下,基本上每個初學者,在剛學習java的時候可能都會問別人這麼一句話,你怎麼知道的哪個方法(api)在哪個包裡的?呵呵,無他,唯手熟爾。
1基礎是王道。我們的基礎要紮實紮實再紮實。
以上面的整個流程來看java的技術分支很多,要想完全掌握是絕對不可能的。我們只有從中精通1到2個部分。但是java也是有通性的,所謂萬變不離其宗。 java的所有編程思路都是“面向對象”的編程。所以大家在往更高境界發展以前一定要打好基礎,這樣不管以後是jree還是j3d都有應刃而解的感覺。在這裡強烈推薦“java編程思想”.
2所謂打好基礎並不是說要熟悉所有的java代碼。我說的意思是要了解java的結構。 class,methode,object,各種套用import,extend讓自己在結構上對java有個立體而且整體的了解即刻。其實java的學習不用固執於對代碼的熟悉,1來java本身帶有很多demo,java2d的所有問題幾乎都有demo的樣例。 2來java是開放代碼,即使沒有demo網絡上也有很多高手把自己的代碼分享。所以不要怕沒有參考,參考是到處都有的。
3最後還有1點經驗和大家分享,對sun的api一定要學會活用,不論是學習還是作為參考api都有很大的幫助,在完全了解java的結構的基礎上,不論什麼方法都是可以通過api來找到的.所以不要怕找不到方法,了解結構,了解api就能找到方法。
首先看書,我覺得《Java2認證學習指南》也就是《Complete Java 2 Certification Study Guide 》這個應該看。上面根據考綱,對每個知識點做了詳細講解,文字淺顯,容易理解。而且,它不是像其他書,僅僅羅列出考點,上面講了很多原理上的東西。這樣更易於理解。我想,即便是不考SCJP,如果想學Java,這本書也值得推薦。不過,我不知道是否有中文版的。我看的英文電子版。另外為了能成功地通過SCJP的考試,最好為自己準備一份最新的SCJP考古題,達到保險的效果。
二、預約考試:
帶上身份證到各考試中心預約。預約時,一定要確定考試種類,是310-035還是其他的,因為他們的考綱是不一樣的。我就是預約時,才曉得只考310-065.所以浪費了很多時間。幸好預約到了下一個週,而且那個周老板正好出差,所以有時間看310-065多出來的東西。
三、總結:
雖然以前做過也些Java項目,但是感覺做寫Java程序和考SCJP是兩碼事。能寫Java程序,不一定過得了SCJP.但是能過SCJP,卻能說明擁有寫Java程序的基礎。這次過SCJP,對我Java基礎又是一次鞏固,我覺得這是我收穫最大的。那個證反而意義不大。不過,對於非計算機專業的兄弟,如果想找個程序員的工作,相信SCJP是個很好的跳板。總之,只要有一定Java基礎,通過一段時間的複習,過肯定沒問題。 SCJP並難,一定要有信心。總算過了,也算對公司有了交待,不過不知道花在上面的時間值不值。 Anyway,現在終於可以看點自己想看的東西了!