完整的java源程序應該包括下列部分:
1.package語句
l java編譯器為每個類生成一個字節碼文件,且文件名與類名相同,這就會帶來一個問題:同名的類會發生沖突。
l 所以package的兩個主要作用就呼之欲出了:管理類,解決命名沖突。
例如:package com;public class Test{}
package cn;public class Test{}
雖然以上兩個類同名,但是並不會出現命名沖突;也可以理解為其實包名就相當於一個人的姓氏,而類名就相當於一個人的名;而一個人的姓名是姓+名;所以以上兩個類
的全稱分別是:com.Test、cn.Test;當然就不會出現命名沖突了;
l 一般地,我們將具有相同功能的類放在一個package中。
2.import語句
l import 代表此類中需要引入和封裝的包,一般置頂。
1,加載已定義好的類或包
2,導入支持類(可以是JDK基礎類或者自己編寫的類),可以供本類調用方法和屬性。
l import導入聲明可分為兩種:
1,單類型導入(single-type-import) 例:import java.util.ArrayList;
2,按需類型導入(type-import-on-demand) 例:import java.util.*;
l Import的使用主要是為了偷懶。Java為了解決命名沖突使用了package來管理類,那么問題就來了,如果在寫代碼的時候都使用類的全稱,例如一下這樣:
java.io.InputStream is = java.lang.System.in; java.io.InputStreamReader isr= new java.io.InputStreamReader(is); java.io.BufferedReader br = new java.io.BufferedReader(isr);
這樣的代碼看起來確實不是那么舒服,寫起來更不舒服;所以我們使用了import,只需要在類聲明前導入相關包:
import java.lang.System; import java.io.InputStream; import java.io.InputStreamReader; import java.io.BufferedReader
代碼就清爽多了:
InputStream = System.in; InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);
所以有人說import的使用就是一種偷懶的做法,這一點,我並不否認;
l Import后出現命名沖突,在使用Import偷懶的時候也會出一些問題;例如:有人在同時import java.awt.*;import java.util.*后,在代碼里面使用List,這個時候就炸鍋了,因為這兩個下面都有List,編譯器就蒙圈了,它不知道,你要使用哪一個List;所以這個時候就要指定清楚,你具體使用哪一個。比如Java.util.List;這樣編譯器就知道了。
l import可以使用通配符*,*代表某package下所有的class,不包括子目錄。看到了吧,就是說*只能導入類不能導入子目錄,比如 import java.awt.*之后,你還是不能使用 java.awt.event下面的類,因為event是個子包啊,這個子包下面的類,*就無能為力了。現在知道為什么不能,直接import Java.*了吧。
總之,在使用import的時候,最好還是使用單類型導入,總結起來好處有兩個:(1)編譯速度:雖然無論是哪種導入都不影響Java代碼執行效率,但是在一個很大的項目中,它們會極大的影響編譯速度. (2)命名沖突:解決避免命名沖突問題的答案就是使用全名.而按需導入恰恰就是使用導入聲明初衷的否定.
3.類/接口定義部分
類或者定義部分就是Java源程序的主體了:
l 類定義
[修飾符]class 類名[extends 父類] [implements 接口名]{[各種屬性][各種方法]}
例如:
public class SearchDaoImpl extends BaseSearchDaoImpl implements SearchDao { protected final Log LOGGER = LogFactory.getLog(getClass()); SearchConfigService searchConfigService; public SearchPage findPage(SearchPageable searchPageable) { return null; }
l 接口定義
[修飾符] interface 接口名 [ extends 父接口] {[各種常量][各種方法的聲明]}
例如:
public interface TipDao extends BaseDao<Tip, Long> {
boolean termExists(String term);
}
注:
一個java源程序至多只能有一個公共類的定義。
若java源程序有一個公共類的定義,則該源文件名字必須與該公共類的名字完全相同。
若源程序中不包含公共類的定義,則該文件名可以任意取名。
若一個源程序中有多個類定義,則在編譯時將為每個類生成一個。class文件。