程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 我學習使用java的一點體會

我學習使用java的一點體會

編輯:關於JAVA

2002年初,因為公司的業務需要而學習java,並應用java開發項目。由於項目時間緊,沒有充裕的時間系統學習java,對java的學習只能是項目需要用什麼,就學什麼,這種學習方法的上手快,但不扎實,在以後的工作中,因為java學的不扎實,吃了不少苦頭。現在我學習應用java已經有一年半的時間,對java已經有了一定的體會,把自己的體會寫出來,供網友分享。

以我個人的經驗,學習java應分以下幾個階段:

java的語法學習 面向對象觀念的建立 java基本類庫的學習 學習設計模式 應用設計模式 經過大量的實踐,可以設計模式

以上六個階段,其中前三個階段是針對java的,但java中,在很多設計模式的應用,同時有很多功能都支持設計模式,所以不懂設計模式的人是不會很好的應用java做開發的。第4、5個階段的學習在前三個階段的基礎上,學習、應用成功的經驗。從而進入第六個階段,在軟件設計這個領域盡情發揮。本人受能力所限,還處在第4個階段的學習過程,所以會對前四個階段說明。第五、六個階段只是我根據我自己的知識做的推斷,還沒有經驗無法說明。

在對這些學習階段進行闡述之前,我先說一下我的學習方法。在學習新的知識時我通常是按以下三個階段學的

理論學習。通過對理論的學習,盡量了解新知識的概念;學習之後只是粗略的了解概念,不能和實際很好的結合。 演繹階段。根據理論學習的知識,考慮在什麼場合下可以應用這個新知識,哪些地方已經應用了這個概念,建立對新知識的感性認識。 歸納階段。從一個更深的層次理解理論。

以下根據java的六個學習階段闡述我的體會,而每個階段將按照理論學習、演繹和歸納三個小階段討論。

java語法的學習

語法學習的理論學習階段是最容易的階段,70%以上的java書主要介紹的就是java語法,隨意買來一本,通讀一下就可以,主要理解以下內容:(1)數據類型,(2)操作符,(3)控制流程,(4)類和類再生,(5)包和接口,(6)異常操作。

在理論學習階段,不必過於注重細節,只要對java的基本語法有一個整體認識,能讀懂示例的源代碼就可以了。

下一步就是演繹階段,應用所學的語法知識,編寫簡單的程序。最好憑自己的記憶,將各語法要點都用一遍(編寫代碼最好用notepad),對自己不熟悉的語法要重新閱讀,用編譯器去檢查語法錯誤。這個階段的目標是脫離書本以及java API能編寫簡單的程序,閱讀一個java源代碼能說出執行結果。

完成這個階段的學習,參加scjp的考試,應該獲得較高的成績。

在演繹階段的基礎上,根據自己犯過的錯誤,總結一下java的難點。重新閱讀語法書,將一些自己不是很清楚的概念重新整理一下,這時你對java語法的理解比第一次閱讀時更深了。

我在剛開始學java時,只是粗略的看看語法書,就開始編程序了,遇到不懂的就重新閱讀語法書,這樣,完全可以成為一個合格程序員,但是當我成為team leader時,為了培訓組員java編程,卻發現自己脫離了java語法書和Java API,竟然會的不多(java集成開發工具有提示功能),為了培訓,我又重新學了一遍java語法,很有收獲。

其實一個優秀的程序員,不但要能寫出好的程序,更重要的是,對所寫的程序能說的清楚:(1)說清楚程序的功能(2)說清楚程序的結構。而說清楚程序的結構的基礎是對java的語法要熟悉。想成為優秀的程序員,一定要在學習語法的基礎上,不斷實踐,不斷總結,最終能脫離語法書,將java語法系統的講解清楚。

面向對象觀念的建立

Java是面向對象的開發工具,使用java開發應用時,一定要懂面向對象編程的概念。在學過了java語法之後,應該建立OOP的概念。

理論學習階段,首先應當理解class和object,了解class、interface、abstract class,理解OOP的繼承性,封裝性(public, protected,private)和多態性。然後應當熟悉UML,可以閱讀一些UML的簡單資料,基本上了解類圖、狀態圖和時序圖就可以了。 演繹階段,對OOP的實踐。而OOP的成功范例應該是常見的23種設計模式。這個階段需要閱讀並體會設計模式UML圖和示例代碼,我推薦《java與模式》這本書,也可以訪問http://www.jdon.com/designpatterns/index.htm 。不必讀懂模式,只需要讀懂每個模式的UML和代碼。 歸納階段,通過演繹階段的學習,體會OOP帶來的好處——對擴展開放,對修改關閉。同時學會如何在java中使用OOP的概念設計。

我在使用Java編程初期,一直使用面向過程的思想編程,對class、interface、abstract class以及public、protect、private的存在並沒有理解,直到我閱讀了Gof的設計模式,才理解OOP的優點。但是Gof的設計模式太晦澀了,我第一次讀時,僅僅是有了面向對象的概念,而對設計模式並沒有理解。相反《java與模式》容易讀一些,但《java與模式》一書的廢話多一些,有很多內容可以不讀。

java基本類庫的學習

曾經面試過一些java程序員,我出的題目是在使用java時,經常用到哪些類,在哪個包裡。很少有人能答好,甚至有人做了2年java程序都沒有回答出,他們會用java,但必須依賴工具(指java集成開工具),我覺得他們可以編寫出程序,但不能編寫出特別好得程序。

我認為作為java程序員必須掌握java類庫的兩個包:java.lang和java.util這兩個包。java.lang包提供的是java編程要用到的基本類包,java程序員天天在用,無非是看別人如何用,自己就如何用,但很少有人去總結一下,比如String 和StringBuffer這兩個類有什麼差別,應該有很多java程序員說不出來。另外Vector和HashMap這兩個類大家都在用,有多少人能說清楚Vector和HashMap繼承了哪些類,實現了哪些接口呢。

理論學習。認真閱讀java API的以下內容:java.lang包中的String,StringBuffer,Number,Double,Float,Byte,Short,Integer,Long,Character,Boolean,Process,Runtime,System,Object,Cloneable,Class,ClassLoader,Thread,ThreadGroup,Runnable,Package類或接口。java.util包中的Collection,list,Set,ArrayList,LinkedList,Hashset,TreeSet,Iterator,Map,SortedMap,HashMap,TreeMap,Comparator,Arrays,Enumeration,Vector,Stack,Dictionary,Hashtable,Properties,StringTokenizer,BitSet,Date,Calendar,Locale,Random,Observer,Observable類和接口。主要理清楚這些類或接口的繼承關系、主要功能。 演繹階段。通過閱讀代碼,練習編程,學習並應用這些類和接口。其實這些類的大部分是經常用的,無非對這些類和接口說不清楚。在這些類中,對java.lang和java.util包中的類,最好將各個方法練習使用一次。而對java.util包中Collections framework中的類,最好理清楚各個類和接口之間的關系。常用的類的方法我就不具體介紹了,我舉一個使用Observer和Obserable 的例子(摘自《The Complete Reference Java 2 》)。在Observer和Obserable中,java實現了對設計模式Observer的支持。

Watcher.java代碼

import java.util.*;
   class Watcher implements Observer
{
public void update(Observable obj, Object arg )
{
  System.out.println("Update() called, count is " +
  ((Integer) arg).intValue());
}
}

BeingWatched.java代碼

import java.util.*;
   class BeingWatched extends Observable
{
void counter( int period )
{
  for(;period >=0; period-- )
  {
  setChanged();
  notifyObservers( new Integer ( period ) );
  try
  {
   Thread.sleep(100);
  }
  catch( InterruptedException e)
  {
   System.out.println("Sleep interrupeted" );
  }
  }
}
};

ObserverDemo.java代碼

public class ObserverDemo
{
public static void main( String[] args )
{
  BeingWatched observed = new BeingWatched();
  Watcher observing = new Watcher();
  observed.addObserver( observing);
  observed.counter(10);
}
};

執行結果

Update() called, count is 10

Update() called, count is 9

Update() called, count is 8

Update() called, count is 7

Update() called, count is 6

Update() called, count is 5

Update() called, count is 4

Update() called, count is 3

Update() called, count is 2

Update() called, count is 1

Update() called, count is 0

歸納階段。總結使用經驗,體會這兩個包中類的繼承關系,對設計模式的支持(如Iterator本身就是設計模式,同時也是工廠方法模式的應用),了解這些類提供的所有功能,比較功能相近類的異同。將這些類的api記在心中。

雖然集成開發環境支持方法提示功能,但我個人認為,對於java.lang和java.util這兩個包的api應當熟記於心,java的其他類庫在使用時可以查找api。當然如果從事不同的開發,對其他類庫應當有相應的了解,如開發swing,就應當對javax.swing包了如執掌,開發b/s結構的程序,就要了解javax.servlet,依個人的應用來開發了。

本文的上一篇發表之後,承蒙各位網友關注,發表了很多評論,我感覺很多人對我寫得文章有誤解,大概是我表述不清楚的原因吧。這篇文章是對上一篇的補充,以一個示例闡述了解collection框架的重要性。

我在半年以前寫過一個函數printAll(Vector vector),具體代碼如下

import java.util.*;
   public class UtilTool
{
public static void printAll ( Vector vector )
{
  System.out.println( "the Collection is vector" );
  System.out.println( vector.getClass().toString() );
  Iterator iterator = vector.iterator();
  while ( iterator.hasNext() )
  {
  System.out.println(iterator.next().toString());
  }
}
   public static void main( String[] arg )
{
Vector vector = new Vector();
  vector.add( new Integer(1));
  vector.add( new Integer(2));
  vector.add( new Integer(3));
  UtilTool.printAll(vector);
}
   }

printAll這個函數設計的很不好——不夠通用,假如,還想打印HashSet類型的數據,你就必須重載printAll函數,代碼如下

public static void printAll ( HashSet hashSet )
{
  System.out.println( "the Collection is hashSet" );
  System.out.println( hashSet.getClass().toString() );
  Iterator iterator = hashSet.iterator();
  while ( iterator.hasNext() )
  {
  System.out.println(iterator.next().toString());
  }
}

printAll函數的代碼重用率低。其實Vector和 HashSet都是Collection的實現,可以將printAll的參數類型改為Collection,而不必重載。代碼如下

public static void printAll ( Collection collection )
{
  System.out.println( "the Collection is collection" );
  System.out.println( collection.getClass().toString() );
  Iterator iterator = collection.iterator();
  while ( iterator.hasNext() )
  {
  System.out.println(iterator.next().toString());
  }
}

這樣就可以刪除printAll(Vector vector)和printAll(HashSet hashSet)函數了。

在設計函數時,應優先使用接口,而不是類。當然必須了解Vector 是Collection的實現。

如果對Collection的繼承關系不清楚,很容易濫用重載,以下代碼是一個有問題的代碼(摘自Effective Java Programming Language Guide)

public class CollectionClassifier{
   public static String classify(Set s){
   return "Set";
   }
   public static String classify(List l){
   return "List";
   }
   public static String classify(Collection c){
   return "Unknow Collection";
   }
   public static void main( String[] args )
   Collection[] tests = new Collection[]{
   new HashSet(),
   new ArrayList(),
   new HashMap().values()
   }
   for(int i=0;i<tests.length;i++)
   System.out.println(classify(test[i]));
   }
   }

程序輸出的是三次"Unknown Collection",而不是你期望的打印"Set","List"以及"Unknown Collection"。這個程序錯誤的根源是對Collection層次結構不熟悉,而濫用重載導致。

這篇文章仍然是對《我學習使用java的一點體會(3)》的補充。

我使用java開發一年多,使用的應該還算熟練,最近在閱讀《設計模式》和《Effective Java》時,又重新學了一下java的基本類庫,對編程思想有了新的認識。java的基本類庫是由專家設計的,理解基本類庫一方面可以增加自己的開發效率,另外一方面可以學學專家的設計思路。在java的基本類庫中,使用了很多的設計模式,在很多方面提供擴展機制,方便的支持設計模式。可以說java的基礎類庫,將面向對象設計的Open-Close principle (Software entities should be open for extension,but closed for modification)發揮到了極致。

在java的基礎類庫中,有些類設計的是為了給java開發者提供工具,直接讓開發者使用的,有些類是專門為繼承而設計的。對於第一種類型的類,使用集成開發工具很容易就能上手使用,而對於第二種類型的類,不主動去學它的API,很難掌握它的使用。我舉一個例子。java 2 提供了對Proxy模式的支持,在以下示例中,演示了如何使用代理模式(摘自《java與模式》)。主要體會java.lang.reflect.InvocationHandler的用法

package com.javapatterns.proxy.reflect;
   import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import java.util.Vector;
import java.util.List;
   public class VectorProxy implements InvocationHandler
{
   private Object proxyobj;
   /** @link dependency */
   /*#Proxy lnkProxy;*/
   public VectorProxy(Object obj)
   {
     proxyobj = obj;
   }
   public static Object factory(Object obj)
   {
  Class cls = obj.getClass();
   return Proxy.newProxyInstance( cls.getClassLoader(),
       cls.getInterfaces(),
       new VectorProxy(obj) );
   }
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
   {
  System.out.println("before calling " + method);
   if (args != null)
     {
  for (int i=0; i<args.length; i++)
       {
         System.out.println(args[i] + "");
       }
  }
   Object o = method.invoke(proxyobj, args);
   System.out.println("after calling " + method);
   return o;
   }
   public static void main(String[] args)
   {
  List v = null;
   v = (List) factory(new Vector(10));
   v.add("New");
     v.add("York");
   }
}

現在應該說一說設計模式的學習了。設計模式是一個高度抽象的概念,每一種模式都是被抽象化了的解決某一問題的成功經驗,理解設計模式需要洞察力,因而學習設計模式前,最好有一定的經驗,不然很難體會設計模式的精髓。

寫設計模式方面的文章對我來說困難重重,首先由於經驗、水平的限制,對設計模式的理解還沒有達到那個高度,其次設計模式文章很多,從簡單介紹,到深入討論都有,很難再有新的視角討論。我今天就簡單介紹一下我讀過的兩本設計模式的書,從我對這兩本書的理解來介紹一下設計模式。

設計模式方面的書、資料很多,我讀過兩本,《設計模式》和《java與模式》,下面分別介紹。

《設計模式》就是常提及的Gof寫的那本,是使用模式化方法研究的開創性著作《Design Patterns Elements of Reusable Object-Oriented Software》的中譯本。無論如何這本書都稱得上是經典,值得收藏,可以隔一段時間拿出來品味一番。全書共6章,第一章引言,介紹了關於設計模式的基本概念,以及如何閱讀這本書。第二章介紹了一個應用了多個設計模式的實例。第三章討論了5個創建型模式,第四章討論了7個結構型模式,第五章討論了11個行為模式。第六章是結論。本書提及的23個設計模式,也是模式中的經典,在新創建的設計模式中,很大部分是這23個模式中的變體。但這本書晦澀難懂也同樣出名:

這本書介紹設計模式的對象描述語言,不是我們現在通用的UML,學習時,需要理解這種對象描述語言。 這本書示例實現語言是smalltalk和C++,學習這本書時要熟悉這兩種語言,而C++本身就是一個非常難的語言。

我認為這本書不適合初學設計模式的人,尤其對於java開發人員。

《java與模式》是對《設計模式》在java這方面做的簡單演繹。全書共55章,前兩章介紹一些基礎知識,包括UML的基本知識,接下來9章介紹面向對象的編程原則,剩余44章,討論了26個設計模式,18個主題。這18個主題是設計模式在應用中的一些示例,有些是作者的經驗,有些是廣泛應用的成功示例。

《java與模式》是針對java語言的,因而示例都是用java實現的。本書提供大量的簡單示例,簡單的示例易於理解,便於以後使用模式時模仿。而在主題部分討論的問題又很深刻,體現了作者對軟件設計的深刻理解,是作者對設計模式的一個演繹。雖然這門書相對簡單,我也是讀了3遍之後,才體會出這本書的味道。以下是我閱讀這本書的一點心得,我閱讀了三遍,就將每一遍我理解了什麼說一說。

第一次閱讀:本書的前兩章是基礎的概念,自然要先了解;而面向對象的原則部分,需要一定的體會之後才能深刻理解,因而第一次讀時,能理解多少就理解多少,不必深究;對於設計模式的閱讀,至少要熟悉每個模式的uml圖以及這個模式的示例代碼;主題是第一次閱讀的重點,這些主題是應用設計模式的范例,應該主要理解。 第二次閱讀,要明白面向對象的原則說的是什麼;重點研究每一個設計模式,理解適用范圍,理解優缺點,以及模式和模式的比較,在每個設計模式中如何體現面向對象的設計原則。 第三次閱讀,重點是體會面向對象的原則。

設計模式的學習不是一個簡單的過程,需要反復學習,不斷實踐。

前面的系列文章,只是我個人的體會,文章有些教條,僅希望能給還在java門外的人一點意見。學習、應用java的方向,我推薦看一下《談java的學習方向?》,這篇文章寫的不錯(見http://www.csdn.net/develop/Read_Article.asp?Id=21393),我學習、應用java的經歷和這篇文章介紹的大同小異,所推薦的書籍和資料我也大部分都讀過了(差別是我沒有讀Oreilly公司的書,java 入門我讀的是《java編程思想》和《the Complete Reference Java 2》兩本java的經典教材,另外我也沒有仔細研究過Specification)。如果將自己定位於j2ee方向,那麼作者推薦的資料無疑相當不錯,同時也比較全面。但我覺得也有一點缺憾:應該在某一個階段學習一下設計模式和重構,畢竟設計模式和重構是面向對象開發的兩本經典,而java是一個純粹的面向對象的語言,在這裡我只想再推薦幾本書。

《java編程思想》是一本經典的java入門教程,在介紹語言的同時,也介紹了面向對象編程的一些思想。這本書是我學習java看的第一本書,我直到現在還經常翻開這本書,從中仍能找到一些以前沒有深刻理解的內容,值得去品味。 《the Complete Reference Java 2》既是一本java的入門書籍,又是java的參考書籍,現在coding時,我仍然要經常參考這本書。 《java與模式》是向java開發人員介紹設計模式的書,在閱讀這本書時,讓我去回味以前做過得項目,體會以前做過的項目設計的成功與失敗的地方,同時也促使我重新去閱讀《java編程思想》和《the Complete Reference Java 2》兩本書,閱讀3遍之後,加深了對oop的理解。 《重構——改善既有代碼的設計》,曾經有一個讓我非常佩服的項目經理,指點我說一個項目結束後,將這個項目的源代碼,重新閱讀、清理、總結一下,是提高編程水平的一個手段,而我在以後的工作中,經常清理自己以及別人的一些垃圾代碼,確實對編程水平的提高有很大的好處。而《重構》這本書,講解了70多種清理、重構代碼的方法,依照重構的方法去做,既能提高代碼質量,又能提高編程水平,也是體會設計模式的一種手段。

到此,我對java的體會系列文章就結束了。感謝各位網友對我寫文章的關注。

在我這個系列文章寫完之後,我突然發現我漏掉了面向對象設計應該掌握的重要內容——UML,雖然我在前面的文章中提起過UML,但UML對於java的重要程度,是應當單獨列文說明的。

UML的重要性,我是沒有辦法用自己的語言表述清楚的,因而引用《UML設計核心技術》的前言來表述UML的重要性,分外在原因和內在原因。

外在原因:

UML是國際統一的標准,用它表示的產品符合國際標准,產品能夠得到廣泛的認可,這將提高產品在市場上的競爭力; 作為國際標准,國際軟件業和商業屆對UML的支持時普遍的,因而采用它,將得到最廣泛的技術支持和工具支持。

內在原因:

UML采用圖來描述系統的視圖,圖形化易於理解的特點有利於不同知識背景的客戶、領域專家、系統分析、開發、設計人員之間的交流,促使他們的互相理解; UML是一種標准的表示方法,任何方法或過程都可以采用UML,它與具體的方法和過程無關,具有通用性; UML具有很好的擴展性,提供了加標簽值、約束、版類等機制來進行自我擴展,可使用到不同的領域,在具有通用性的同時,還具有使自己專用化的能力; UML與最好的軟件實踐經驗集成。它雖然沒有描述任何方法或過程,但卻要求使用它的過程具有以下特征:以架構為中心、用例驅動、支持迭代和遞增的開發,這些特征體現了軟件開發的成功經驗; UML對軟件設計和分析實踐中湧現出的新思想和新方法提供了很好的支持,它支持模式、框架和組件等概念,提供從“概念模式到實現代碼”的可跟蹤性。

以上引用文字,說明了UML在OOA和OOD中的重要作用,我想在以下幾點做一些說明:

UML是進行系統分析、系統設計和系統表示的圖形語言,在系統開發中,不同角色的人應重點掌握相應的視圖,而非掌握全部。UML有9種視圖,我都曾經學過,可是我由於系統設計做的多一些,因而對系統設計這部分的視圖熟悉一些如類圖、序列圖、協作圖以及對象圖,但對其他的視圖,這由於較少使用而有些淡忘。但對於自己經常用的圖,要可以白板上熟練繪制相應的UML圖。 UML與白板。在系統分析和系統設計階段,要經常在一起討論,討論的時候,白板是UML工具的一個較好選擇,這要求熟練掌握UML語言。 UML與UML工具軟件。大多數UML工具軟件都有將UML的類圖和相應的代碼相互轉換的功能,UML類圖——>代碼,是代碼生成,代碼——>UML類圖的過程是反向工程。我推薦在進行系統設計時使用UML工具軟件。 常用的UML工具有rose、togetherJ和visio 2002,我用過rose和togetherJ,rose由於在很多方面做了增強,因而已經不是標准的UML語言,我不是很贊成使用rose。我比較喜歡使用togetherJ,在項目中,我比較喜歡用togetherJ做設計,設計好之後,自動生成代碼框架,再用jbuilder對實現具體方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved