Java是由SUN公司開發成功的新一代編程語言,它最大的特點就是:使用它可在各式各樣不同的機器,不同的操作平台的網絡環境中開發軟件,具有可移植性,高度的安全性,簡單,與體系結構無關,動態執行等一系列特點,Java正逐步成為Internet應用的主要的開發語言。
今天我們來討論一下Java語言當中的對象的概念
萬事萬物皆對象:
Java在程序語言設計上,徹底假設使用者僅以面向對象模式來進行程序設計,在Java中,有一個十分重要的觀念:萬事萬物皆對象,即使Java程序本身,也是一個對象。
1.操控對象的reference:
reference和對象之間的關系,好比電視和遙控器,你可以擁有某referenc,但不見得要連接至某個對象,如果你想產生一個string reference:
例如:string s;
這樣話你就產生了一個reference,但不會產生實際對象,這時,你多半想將它連接到某個新產生的對象去,可以通過new來完成。
例如:string s = new string ("asdf")
2.class:
實際上Java裡你需要做的事情無非就是:定義class,產生對象,將消息發送給對象。如果一切都是對象,為了解決某一類對象的特征,我們需要對其進行定義,這就是class.
例如:class atypename{/*class body*/}
atypename a = new atypename ();
若要指定其數據成語的值,可以用句號來指定,再接成員的名稱:
例如:
class dateonly
{
int i;
float f;
boolean b;
}
dateonly d = new dateonly ( ) ;
d.i = 47;
d.f = 1.1f;
d.b = false;
不同於C++的是,在Java中,當變量是class內的基本類型(primitive type) 時,Java將保證它100%有一個省缺值,但若變量只是某個函數定義區內的局域變量時,變量將不會被初始化,你需要給他一個適當值,如果你忘了,Java編譯器將在編譯時,認定其為錯誤,而C++編譯器只會對未初始化的變量給予警告。
3.引用組件(import):
例如:import java.until.arraylist表示你想使用arraylist class,你還可以用*來代替arraylist,以避免逐一聲明(雖然方便,但影響編譯時間)
4."牧羊人"函數 static:
在Java裡,一般情況下,你需要產生某個對象,再通過該對象取用其數據和
函數,但若將某個函數或數據聲明為static.它將不在局限與所需的class object,即使沒有任何object,外界還是可以調用其static函數。
例如:
class statictest { static int i = 47; }
statictest st = new statictest ( );
這裡st.i和statictest.i作用相同,他們共同指向一塊內存。
class staticfun
{
static void incr( ) { stitictest.i++ }
}
staticfun sf = new staticfun ( );
無論是通過對象----sf.incr()還是直接通過class---staticfun,incr ( )調用都是一樣的 。
Java相對C/C++的一些特性:
Java和C++都是混合型程序語言(hybird language),且Java奠基與C++之上,
但Java在OOP上卻更“純粹”一些,C++為了相容與C,包含了許多不適合出現在C++中的特性,這使得C++在某些方面顯得過於復雜。
1.數組(array):
在C/C++中,數組其實就是一快內存,如果在程序中訪問了數組區塊之外的地域或者在初始化之前便使用,會導致許多錯誤的發生。與C/C++不同的是,Java更注重安全性,它保證數組一定會被初始化(當產生references的數組時,其中每個references皆會被設定為null這一特殊值,Java將其視為“不指向任何對象”。在使用任何reference前,你必須先將某個對象指派給它),並使每個數組額外多出一點空間,並在執行時期對對數組索引值進行檢查,從而使程序員無法超越范圍。
2.生存空間(Scoping):
C/C++具備將較大的生存空間中的變量遮蔽起來的能力:
例如:
{
int x = 1;
{
int x = 2;
}
}
即使上面這段程序在C/C++中合法,在Java總不能這樣做,編譯器會認為X已經被定義過了,Java認為這樣容易導致對程序的誤解和混淆。在C++中,用完對象後,必須將其摧毀,否則其可能滋生臭蟲,可什麼時候才是最佳時機呢?圍繞在變量壽命上的種種疑問,Java提供了解決方案,Java中有一種所謂的(垃圾回收器)garbage collector,機制,它會逐一檢視所有通過new產生的對象,當不在有任何reference指向它們的時,將釋放這些對象的內存,使程序員不必操心內存回收的問題,因為所有的對象,在你不需要他們的時候,將自動消失。
3.名稱的可視性(Name visibility):
所有程序語言都存在名稱管理的問題,如何區分相同名稱的模塊呢?C裡頭這個問題格外嚴重,為了避免名稱沖突的問題,C++ classes將函數包裝於內,使其他classes內的同名函數隔離,不過由於全局數據和全局函數(global function)的存在,還是有可能發生命名的沖突。於是,C++中引入"命名空間(namesapces)"的概念來解決了這一問題。
為了解決這一問題,Java采用和Internet域名相似的指定詞。事實上,Java的設計者希望你將Internet域名反寫過來。在Java1.0和1.1中,域名最末的com. edu. org. net等等,按照慣例都應該大寫,在Java2時,發現了一些問題,就又變回了小寫。
例如:com.bruceeckel.utility.foibles便置於com/bruceeckel/utility/foibles
這樣使得每個package都成為一個獨一無二的命名空間。每個class也都得到了一個獨一無二的識別名稱。