『壹』 java語言一般應用在哪些方面呢
1)安卓應用
如果你想弄清楚Java用在什麼地方,你離這個目標不是太遠。打開你的安卓手機和任何一款App,它們是使用Java語言、基於Google Android API(和JDK類似)開發的。數年的安卓支持已經有了很大提高,並且很多Java程序員已經成為了安卓app開發者。順便提一下,像我們之前在how Android app works這篇文章中說到的那樣,安卓使用不同的java虛擬機、不同的包,但是代碼仍是用Java寫的。
2)金融業伺服器的應用
在金融服務中Java有很重要的應用。很多全球投資銀行像高盛、花旗、巴克萊、標准渣打銀行等其他銀行使用Java來開發前台和後台電子交易系統,提供解決方案和確認系統以及數據處理項目等等。Java大多數用在開發伺服器端的應用,幾乎不用來開發前端,前端是從一個伺服器接受數據,然後處理它並把它發送給其他進程。Java Swing對交易員來說在開發胖客戶端的GUI方面還是很受歡迎的,但是現在C#很快地在這個領域獲得了市場佔有率,Java Swing在這方面被擠壓喘不過氣來。
3)Java Web應用
Java在電子商務和Web應用領域也是有很多的應用。現在有很多使用Spring MVC、Structs2.0和類似框架開發的RESTful風格的服務。甚至件一個簡單的依賴Servlet、JSP和Structs開發的web應用在各種各樣的政府項目中很受歡迎。政府的很多部門如衛生局、保險部門、國防部等部門都有他們使用Java開發的web應用。
4)軟體工具
很多有用的軟體和開發工具是用Java開發的,例如Eclipse、InetelliJ、Netbeans IDE。我認為大多數使用的桌面應用也是用Java開發的。所以有一段時間,Swing在開發胖客戶端方面非常流行,尤其是在金融行業和投資銀行。現在,Java FX正逐漸受到歡迎,但是仍不能成為Swing的替代品,而C#在金融領域內已經幾乎代替了Swing。
5)交易應用
第三方應用交易應用,作為更大的金融服務業的一部分也使用Java開發。流行的交易應用像Murex也是用Java開發的,很多銀行都使用它們來連接前後端。
6)J2ME應用
雖然iOS和Android的出現幾乎抹殺了J2ME的市場,但是在低終端Nokia和使用J2ME的三星手機方面還是有很大的市場。有一段時間,安卓上可用的游戲、軟體幾乎全都是用MIDP、CLDC ,他們是J2ME平台的一部分。J2ME在一些產品如藍光光碟、機頂盒等等。WhatsApp很受歡迎的一個原因是因為對所有Nokia手機的J2ME平台來說是可用的。
7)嵌入式領域
在嵌入式領域,Java也是有很大應用的。它展示了平台是多麼的強大,你僅需130Kb就能使用Java技術(在智能卡或者感測器上)。起初,Java是為嵌入式設備而設計的。實際上,這是Java最初「一次編寫,到處運行」初衷的一個部分,現在看起來獲得了成功。
8)大數據技術
Hadoop和其他大數據技術以這樣或那樣的方式使用著Java,例如Apache依賴Java的HBse和Accumulo(開源)以及ElasticSearch。但是Java在該領域並不佔統治地位,因為有其他技術如MongoDB是用C++開發的。如果Hadoop或者ElasticSearch發展壯大的話,Java在這個發展的領域有可能獲得主要的佔有率
9)高頻率的交易領域
Java平台在現代JIT技術的幫助下,它的性能特性已經有了很大提升,傳送性能已經到了C++水平。由於這個原因,Java在開發高性能系統方面還是很受歡迎的,因為性能與機器語言相比稍差一些,但是你可以安全地折衷——輕便、可維護帶來更快地速度。對一個缺乏經驗的C++程序員來說,只能使應用變得更慢和不可靠。
10)科學應用
現在,對於科學應用來說Java經常作為一個默認的選擇,包括自然語言處理。這種現象的主要原因是Java更安全、輕便、易維護,並且與C++和其他語言相比有更好的高級並發工具。
在九十年代,Java由於Applet在網際網路領域佔有重要地位,但是幾年後,由於Applet沙箱模式的各種安全問題,Applet失去了風頭。現在,桌面Java和Applet幾乎滅亡。Java作為軟體開發公司默認的開發語言,在金融服務行業、投資銀行和電子商務web應用領域獲得了很大應用,任何學習Java的人員都會為自己贏得光明的未來。Java 8更加強了一個信念——在未來的幾年,Java在軟體開發領域繼續佔有重要地位。
『貳』 JAVA的主要應用領域是什麼
1、大型網站,主要使用JAVA EE,最有名例子就是電子商務交易平台阿里巴巴、淘寶、京東。
2、大型企業級應用,主要使用JAVA EE,比如大型企業管理系統,CRM系統,ERP系統2.1有關通信及網路的大型企業:移動、聯通、電信、網通主要的信息化都是JAVA2.2有關金融行的大型企業,所有的銀行、證券公司,互聯網金融; 2.3大型管理系統,如:供應鏈,客戶管理系統,物流系統。
3、電子政務,主要使用JAVA EE,相關的政府部門絕大多數的信息化系統是JAVA開發的。
4、游戲,很多手機游戲都是用JAVA開發的。包括大型網游的後台數據統計都是java。
5、嵌入式設備及消費類電子產品,主要用 JAVA ME,無線手持設備、通信終端、醫療設備、信息家電(如數字電視、機頂盒、電冰箱)、汽車電子設備等是比較熱門的Java應用領域,這方面的應用例子有中國聯通CDMA 1X網路中基於Java技術的無線。
6、各大旅遊網站基本都是使用java做的開發。
7、出行的交通工具的訂票系統絕大部分也是使用java開發的。
8、流行的大數據,最主流的大數據框架Hadoop的應用主要用Java開發。Java最大的優勢之一就是它在大數據領域的地位,目前很多的大數據架構都是通過Java來完成的。
『叄』 JAVA主要是用來干什麼的呢
其實,Java的內容很豐富,可以實現的功能也有很多。
我們常常說的Java,首先它是一種計算機編程語言,程序員用它來和計算機交流,把要求和設想用Java語言表達出來,這個過程就是我們所說的使用Java編程,所以我們說Java是一種計算機編程語言。為了讓計算機看懂,Java會有一系列的規則和約定,這些就是Java的語法。
其次,Java是一種軟體開發平台。所謂軟體開發簡單地理解為:編程的結果是軟體或者程序,而編程的過程就是軟體開發。
JAVA可以用來干什麼,下面是為大家總結的主要的六點:
一、Java可以用來做網站
很多大型網站都是用JSP寫的,JSP全名Java Server Pages。這是一種動態網頁技術,比如我們熟悉的B站,很多政府網站都是用這個寫的所以想學習Java的同學還可以負責網站方面的製作,這方面的崗位也比較多,比如:網站開發,當然就是JSP+Servlet+JavaBean,一直以來都相當流行。
二、Java可以做安卓軟體
安卓是一個手機系統基於Linux的操作系統,其中源代碼Java,市面上所有的安卓手機,包括小米,oppo,華為手機系統都是修改Java運行的,Java做安卓也不只是只能做系統,對於更多的程序開發人員來說,更多的時間是花在APP上,也就是手機上的各種軟體都是用Java寫的,Java做安卓不單單是指系統,還有APP對於更多的開發人員來說,他們更多的時間是花在開發APP上面。如果你還在尋找Java在哪運用,你不用東奔西走的尋找,你的身邊就是。Android手機,隨便打開一個App應用,他們就是用Java語言,從Google上搜索Android的API文檔,你就會發現它和Java的JDK文檔驚人的相似。
三、Java可以用來做游戲
以前諾基亞手機風靡天下的時候,上面的很多小游戲都是用Java寫的,只是現在都多去開發安卓了,電腦上的大多數也是用Java來開發的,最經典的就是《我的世界》,當今世界最具影響力的游戲英雄聯盟,吃雞就是用Java寫的
四、Java可以用來寫軟體
很多編程語言都是可以來寫軟體的,但Java是現在最適用最廣泛的,比如企業級應用開發,這里是JAVA的天地。還有OA、郵箱、投票、金融、考試、物流、醫療、礦山等信息方面的系統,Java都佔有極為重要的地位。現在國內的最熱門的就是手機應用,學習Java去做手機應用還是比較吃香的,比如:企業級應用開發,這里是JAVA的天地,大到全國聯網的系統,小到中小企業的應用解決方案,Java都佔有極為重要的地位,另外還有移動領域,典型的應用是手機游戲(國內主要是這方面),這里是J2ME的天地,其實應用范圍是很廣的。
五、Java伺服器程序
Java在金融服務業的應用非常廣泛,許多跨國投資銀行例如:Goldman Sachs(高盛投資),Citigroup(花旗集團),Barclays(巴克萊銀行)以及其他銀行,都用Java來編寫前台和後台的電子交易系統,結算和確認系統,數據處理項目以及其他項目。
大多數情況下,Java被用在伺服器端開發,但多數沒有任何前端,它們通常是從一個伺服器(上一級)接收數據,處理後發向另一個處理系統(下一級處理)。
六、Java大數據技術
Hadoop以及其他大數據處理技術都是用Java或者其他,例如Apache的基於Java 的 HBase和Accumulo以及ElasticSearchas。
但是Java在此領域並未占太大空間,但只要Hadoop和ElasticSearchas能夠成長壯大,Java 依舊還有潛力去在這個市場占據一部分。
『肆』 關於java的應用領域
問題1就這種具體的應用~都有哪些?
答:Java 主分 三大塊 J2EE\J2SE\J2ME
J2ME主要應用於嵌入是系統開發,如手機和PDA的編程(小型電子設備的系統);J2EE主要用於分布式的網路程序的開發,如電子商務網站和ERP系統。J2SE開發桌面應用軟體(單機軟體)。
問題2初學java,應該選哪本書?
答:「良葛格」的書入門比較不錯(很通俗^-^,不過數據量少一些)。入門以後<thinking in java>是比較能獲得思想上的提高的書。另外還需要一本全面的工具書方便查資料,推薦<Java2核心技術卷一,二>(也叫<Core Java>).
『伍』 如何操作java中的IO流的典型應用
IO操作是java中比較重要的內容。僅靠三言兩語無法解釋,具體例子請參考java學習手冊。
例子來自java學習手冊,應用寶裡面下載,它包含排序動畫執行過程、java運行時堆棧內存結構圖,J2SE基礎、面試題、編程題以及二千多道選擇題等。大部分代碼都可以直接在手機上運行、調試,觀察運行時變數狀態以及變數值。j2se基礎包含30章,260節內容,每一章內容都經過了精挑細選,深度加工,涵蓋了java的所有內容。java學習手冊代碼部分採用了Eclipse的目錄結構,代碼全部高亮顯示,多種主題供讀者選擇,文檔中的圖片均可以放大。文檔樣式、字體大小都可以控制.
『陸』 java io流的典型使用方式有幾種
Java中IO流分成兩大類,
一種是輸入流,所有的輸入流都直接或間接繼承自InputStream抽象類,輸入流作為數據的來源,我們可以通過輸入流的read方法讀取位元組數據;
另一種是輸出流,所有的輸出流都直接或間接繼承自OutputStream抽象類,輸出流接收數據,可以通過write方法寫入位元組數據。
Java的IO流類中,大部分的輸入流和輸出流都是成對存在的,即如果存在XXXInputStream,那麼就存在XXXOutputStream,反之亦然。SequenceInputStream和StringBufferInputStream是特例,沒有對應的SequenceOutputStream類和StringBufferOutputStream類,許多IO操作都可能會拋出IOException異常,比如read、write、close操作。
以下是Java的IO流中常見的輸入流,由於每個輸入流都有其對應的輸出流,所以此處就不再列出輸出流的繼承結構圖。
1、ByteArrayInputStream & ByteArrayOutputStream:
ByteArrayInputStream構造函數中需要傳入一個byte數組作為數據源,當執行read操作時,就會從該數組中讀取數據,正如其名,是一種基於位元組數組實現的一種簡單輸入流,顯而易見的是,如果在構造函數中傳入了null作為位元組數據,那麼在執行read操作時就會出現NullPointerException異常,但是在構造函數初始化階段不會拋出異常;與之相對應的是ByteArrayOutputStream,其內部也有一個位元組數組用於存儲write操作時寫入的數據,在構造函數中可以傳入一個size指定其內部的byte數組的大小,如果不指定,那麼默認它會將byte數組初始化為32位元組,當持續通過write向ByteArrayOutputStream中寫入數據時,如果其內部的byte數組的剩餘空間不能夠存儲需要寫入的數據,那麼那麼它會通過調用內部的ensureCapacity
方法對其內部維護的byte數組進行擴容以存儲所有要寫入的數據,所以不必擔心其內部的byte數組太小導致的IndexOutOfBoundsException之類的異常。
2、FileInputStream & FileOutputStream
FileInputStream 能夠將文件作為數據源,讀取文件中的流,通過File對象或文件路徑等初始化,在其構造函數中,如果傳入的File對象(或與其相對應的文件路徑所表示的File對象)不存在或是一個目錄而不是文件或者由於其他原因無法打開讀取數據,都會導致在初始化階段導致拋出FileNotFoundException異常;與FileInputStream 相對應的是FileOutputStream,可以通過FileOutputStream向文件中寫入數據,也需要通過File對象或文件路徑對其初始化,如同FileInputStream ,如果傳入的File對象(或與其相對應的文件路徑所表示的File對象)是一個目錄而不是文件或者由於其他原因無法創建該文件寫入數據,都會導致在初始化階段拋出FileNotFoundException異常。
3、PipedInputStream & PipedOutputStream
PipedInputStream和PipedOutputStream一般是結合使用的,這兩個類用於在兩個線程間進行管道通信,一般在一個線程中執行PipedOutputStream 的write操作,而在另一個線程中執行PipedInputStream的read操作。可以在構造函數中傳入相關的流將PipedInputStream 和PipedOutputStream 綁定起來,也可以通過二者的connect方法將二者綁定起來,一旦二者進進行了綁定,那麼PipedInputStream的read方法就會自動讀取PipedOutputStream寫入的數據。PipedInputStream的read操作是阻塞式的,當執行PipedOutputStream的write操作時,PipedInputStream會在另一個線程中自動讀取PipedOutputStream寫入的內容,如果PipedOutputStream一直沒有執行write操作寫入數據,那麼PipedInputStream的read方法會一直阻塞PipedInputStream的read方法所運行的線程直至讀到數據。單獨使用PipedInputStream或單獨使用PipedOutputStream時沒有任何意義的,必須將二者通過connect方法(或在構造函數中傳入對應的流)進行連接綁定,如果單獨使用其中的某一個類,就會觸發IOException: Pipe Not Connected.
4、ObjectInputStream & ObjectOutputStream
ObjectOutputStream具有一系列writeXXX方法,在其構造函數中可以摻入一個OutputStream,可以方便的向指定的輸出流中寫入基本類型數據以及String,比如writeBoolean、writeChar、writeInt、writeLong、writeFloat、writeDouble、writeCharts、writeUTF等,除此之外,ObjectOutputStream還具有writeObject方法。writeObject方法中傳入的類型必須實現了Serializable介面,從而在執行writeObject操作時將對象進行序列化成流,並將其寫入指定的輸出流中。與ObjectOutputStream相對應的是ObjectInputStream,ObjectInputStream有與OutputStream中的writeXXX系列方法完全對應的readXXX系列方法,專門用於讀取OutputStream通過writeXXX寫入的數據。
5、SequenceInputStream
SequenceInputStream 主要是將兩個(或多個)InputStream在邏輯上合並為一個InputStream,比如在構造函數中傳入兩個InputStream,分別為in1和in2,那麼SequenceInputStream在讀取操作時會先讀取in1,如果in1讀取完畢,就會接著讀取in2。在我們理解了SequenceInputStream 的作用是將兩個輸入流合並為一個輸入流之後,我們就能理解為什麼不存在對應的SequenceOutputStream 類了,因為將一個輸出流拆分為多個輸出流是沒有意義的。
6、StringBufferInputStream
StringBufferInputStream允許通過在構造函數中傳入字元串以讀取位元組,在讀取時內部主要調用了String的charAt方法。與SequenceInputStream類似,StringBufferInputStream也沒有對應的OutputStream,即不存在StringBufferOutputStream類。Java沒有設計StringBufferOutputStream類的理由也很簡單,我們假設StringBufferOutputStream存在,那麼StringBufferOutputStream應該是內部通過執行write操作寫入數據更新其內部的String對象,比如有可能是通過StringBuilder來實現,但是這樣做毫無意義,因為一旦我們String的構造函數中可以直接傳入位元組數組構建字元串,簡單明了,所以設計StringBufferOutputStream就沒有太大的必要了。StringBufferInputStream這個類本身存在一點問題,它不能很好地將字元數組轉換為位元組數組,所以該類被Java標記為廢棄的(Deprecated),其官方推薦使用StringReader作為代替。
7、FilterInputStream & FilterOutputStream
FilterInputStream包含了其他的輸入流,說具體點就是在其構造函數中需要傳入一個InputStream並將其保存在其名為in的欄位中,FilterInputStream只是簡單的覆蓋了所有的方法,之所說是簡單覆蓋是因為在每個覆蓋函數中,它只是調用內部的保存在in欄位中的InputStream所對應的方法,比如在其覆蓋read方法時,內部只是簡單調用了in.read()方法。FilterInputStream的子類可以進一步覆蓋某些方法以保持介面不變的情況下實現某一特性(比如其子類有的可以通過使用緩存優化讀取的效率)或者提供一些其他額外的實用方法。所以在使用時FilterInputStream可以讓傳入的InputStream具有一些額外的特性,即對構造函數傳入的InputStream進行了一層包裹,使用了典型的裝飾著模式,如果只看FilterInputStream本身這一個類的話,則該類自己本身意義不大,因為其只是通過內部的欄位in簡單覆寫某些方法。但是如果將FilterInputStream 和其子類結合起來使用話,那麼就很有用了。比如FilterInputStream 有兩個子類BufferedInputStream和DataInputStream,這兩個類在下面還會詳細介紹。BufferedInputStream對read操作做了優化,每次讀操作時都讀取一大塊數據,然後將其放入內部維護的一個位元組數組緩沖區中。當外面調用BufferedInputStream的read方法時,首先去該緩沖區中讀取數據,這樣就避免了頻繁的實際的讀操作,BufferedInputStream對外沒有暴露額外的其他方法,但是其內部的read方法已經經過優化了,所以在執行讀操作的時候效率更高。DataInputStream與ObjectInputStream有點類似,可以通過一些readXXX方法讀取基本類型的數據,這是非常有用的一些方法。
8、BufferedInputStream & BufferedOutputStream
如上面所介紹的那樣,在BufferedInputStream的構造函數中需要傳入一個InputStream, BufferedInputStream內部有一個位元組數組緩沖區,每次執行read操作的時候就從這buf中讀取數據,從buf中讀取數據沒有多大的開銷。如果buf中已經沒有了要讀取的數據,那麼就去執行其內部綁定的InputStream的read方法,而且是一次性讀取很大一塊數據,以便填充滿buf緩沖區。緩沖區buf的默認大小是8192位元組,也就是8K,在構造函數中我們也可以自己傳入一個size指定緩沖區的大小。由於我們在執行BufferedInputStream的read操作的時候,很多時候都是從緩沖區中讀取的數據,這樣就大大減少了實際執行其指定的InputStream的read操作的次數,也就提高了讀取的效率。與BufferedInputStream 相對的是BufferedOutputStream。在BufferedOutputStream的構造函數中我們需要傳入一個OutputStream,這樣就將BufferedOutputStream與該OutputStream綁定在了一起。BufferedOutputStream內部有一個位元組緩沖區buf,在執行write操作時,將要寫入的數據先一起緩存在一起,將其存入位元組緩沖區buf中,buf是有限定大小的,默認的大小是8192位元組,即8KB,當然也可以在構造函數中傳入size指定buf的大小。該buf只要被指定了大小之後就不會自動擴容,所以其是有限定大小的,既然有限定大小,就會有被填充完的時刻,當buf被填充完畢的時候會調用BufferedOutputStream的flushBuffer方法,該方法會通過調用其綁定的OutputStream的write方法將buf中的數據進行實際的寫入操作並將buf的指向歸零(可以看做是將buf中的數據清空)。如果想讓緩存區buf中的數據理解真的被寫入OutputStream中,可以調用flush方法,flush方法內部會調用flushBuffer方法。由於buf的存在,會大大減少實際執行OutputStream的write操作的次數,優化了寫的效率。
『柒』 Java可以應用到哪些領域
一.大型企業級應用,主要使用JAVAEE,比如大型企業管理系統,最典型的就是:
1、有關金融行的大型企業,所有的證券公司、銀行,比如建設銀行、工商銀行;
2、有關通信及網路的大型企業:電信、移動、聯通、網通;
3、大型管理系統,如:客戶管理系統、供應鏈等。
二.大型網站,主要使用JAVAEE,最典型的例子就是電子商務交易平台阿里巴巴以及淘寶。
三.電子政務/商務,主要使用JAVAEE,相關的政府部門,絕大多數的信息化系統都是由JAVA開發的。
四.游戲,很多手機游戲都是用JAVA開發的。
五.嵌入式設備及消費類電子產品,主要使用JAVAME:
無線手持設備、醫療設備、通信終端、信息家電(如數字電視、電冰箱、機頂盒)、汽車電子設備等是比較熱門的Java應用領域,這方面的應用例子有中國聯通CDMA1X網路中基於Java技術的無線數據增值服務——UniJa。
『捌』 java經典編程案例有哪些
java編程的記事本:
import java.util.*;
public class JieChengExample
{
public static void main(String args[])
{
Scanner input=new Scanner(System.in);
int n,sum;
Jiecheng jie=new Jiecheng();
System.out.print("輸入n的值:");//輸入有幾個階乘相加
n=input.nextInt();
sum=0;
for(int i=1;i<=n;i++)
{
sum=sum+jie.jiecheng(i);//這是n個階乘相加
}
System.out.println("1!+2!+3!+....+n!的和是:"+sum);
}
}
class Jiecheng
{
public int jiecheng(int temp)//算階乘的方法
{
int sum=1;
for(int i=1;i<=temp;i++)
{
sum=sum*i; //計算階乘
}
return sum;//將一個階乘返回
}
}
2.java賽馬游戲:
import java.util.Random;
public class Test {
public static void main(String[] args) {
Competition c = new Competition();
Thread T = new Thread(c);
T.start();
}
}
class Competition implements Runnable{
int red = 0;
int green = 0;
int Speed [] = new int [2];
Competition(){
}
public void run(){
Random r = new Random();
for(int a= 0;a<500;a++){
for(int j = 0;j<2;j++){
Speed[j] = r.nextInt(2);
red = red + Speed[j];
Speed[j] = r.nextInt(2);
green = green + Speed[j];
}
System.out.println("red的速度為"+red);
System.out.println("green的速度為"+green);
while(red >=500 || green>=500){
if(red >=500){
System.out.println("red先抵達終點線");
}
if(green >= 500){
System.out.println("green先抵達終點線");
}
if(green ==500 && red ==500 ){
System.out.println("兩個同時到達");
}
return;
}
}
/* if(red >green){
System.out.println("Redwin"+red);
}
if(red<green){
S...import java.util.Random;
public class Test {
public static void main(String[] args) {
Competition c = new Competition();
Thread T = new Thread(c);
T.start();
}
}
class Competition implements Runnable{
int red = 0;
int green = 0;
int Speed [] = new int [2];
Competition(){
}
public void run(){
Random r = new Random();
for(int a= 0;a<500;a++){
for(int j = 0;j<2;j++){
Speed[j] = r.nextInt(2);
red = red + Speed[j];
Speed[j] = r.nextInt(2);
green = green + Speed[j];
}
System.out.println("red的速度為"+red);
System.out.println("green的速度為"+green);
while(red >=500 || green>=500){
if(red >=500){
System.out.println("red先抵達終點線");
}
if(green >= 500){
System.out.println("green先抵達終點線");
}
if(green ==500 && red ==500 ){
System.out.println("兩個同時到達");
}
return;
}
}
/* if(red >green){
System.out.println("Redwin"+red);
}
if(red<green){
System.out.println("Greenwin"+green);
}
if(red == green){
System.out.println("equal");*/
JAVA的介紹:
Java是一種可以撰寫跨平台應用程序的面向對象的程序設計語言。Java技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於PC、數據中心、游戲控制台、科學超級計算機、行動電話和互聯網,同時擁有全球最大的開發者專業社群。
『玖』 經典java
Private 語句 在模塊級別中使用,用於聲明私有變數及分配存儲空間。語法Private [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . .Private 語句的語法包含下面部分:部分描述WithEvents可選的。關鍵字,說明 varname 是用來響應由 ActiveX 對象所觸發的事件的對象變數。只有在類模塊中才是合法的。使用 WithEvents,可以定義任意個所需的單變數,但不能用 WithEvents 創建數組。New 和 WithEvents 不能一起使用。varname必需的。變數的名稱;遵循標準的變數命名約定。subscripts可選的。數組變數的維數;最多可以定義 60 維的多維數組。subscripts 參數的使用語法如下: [lower To] upper [,[lower To] upper] . . . 如果不顯式指定 lower,則數組的下界由 Option Base 語句控制。如果沒有 Option Base 語句則下界為 0。New可選的。使其可以隱式地創建對象的關鍵字。如果使用 New 聲明對象變數,則在第一次引用該變數時創建該對象的新實例,因此不必使用 Set 語句來對該對象引用賦值。New 關鍵字不能聲明任何內部數據類型的變數以及從屬對象的實例,也不能與 WithEvents 一起使用。type可選的。變數的數據類型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(對可變長的字元串)、String * length(對定長的字元串)、Object、Variant、用戶定義類型或對象類型。所聲明的每個變數都要一個單獨的 As type 子句。說明Private 變數只能在包含其聲明的模塊中使用。可以使用 Private 語句聲明變數的數據類型。例如,下面的語句聲明了一個 Integer 類型的變數。Private NumberOfEmployees As Integer也可以使用 Private 語句來聲明變數的對象類型。下面的語句為工作表的新實例聲明了一個變數。Private X As New Worksheet如果在定義對象變數時沒有使用 New 關鍵字,則在使用該變數之前,必須使用 Set 語句將一個已有的對象賦給該引用對象的變數。在賦值之前,所聲明的這個對象變數有一個特定值 Nothing,這個值表示該變數沒有指向任何對象的實例。如果不指定數據類型或對象類型,且在模塊中沒有使用 Deftype 語句,則按預設情況該變數為 Variant 類型。可以用帶空圓括弧的 Private 語句來聲明動態數組,然後可以在過程內用 ReDim 語句來定義該數組的維數和元素。如果試圖在 Private,Public 或 Dim 語句中重新定義一個已顯式定義了大小的數組的維數,就會發生錯誤。當初始化變數時,數值變數被初始化為 0,變長的字元串被初始化為一個零長度的字元串 (""),而定長的字元串則用 0 填充。Variant 變數被初始化為 Empty。用戶自定義類型的變數的每個元素作為各自獨立的變數進行初始化。注意 當在過程中使用 Private 語句時,通常將 Private 語句放在過程的開始。
private,空,protected,public 許可權
使用private修飾符可以完全隱藏類的成員,使得不能從類外直接訪問它們。
不使用修飾符允許同一個包里的任何類直接訪問類的成員,但是其他包中的類不可以。
使用protected修飾符允許任何包中的子類或同一包的類的成員。
使用public修飾符允許任何類訪問類的成員。
public在程序語言中基本都表示全局變數或者全局函數,他的本意是「公共的」的意思,他表示某個變數或者函數是全局函數,例如:public int a 表示a這個整形變數是全局變數,再例如,聲明一個全局函數:public function checked()
........
end function
表示checked這個函數是全局函數
static C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變數和函數,不涉及類;後者主要說明static在類中的作用。
一、面向過程設計中的static
1、靜態全局變數
在全局變數前,加上關鍵字static,該變數就被定義成為一個靜態全局變數。我們先舉一個靜態全局變數的例子,如下:
//Example 1#include <iostream.h>void fn();static int n; //定義靜態全局變數void main(){ n=20; cout<<n<<endl; fn();}void fn(){ n++; cout<<n<<endl;}
靜態全局變數有以下特點:
該變數在全局數據區分配內存;
未經初始化的靜態全局變數會被程序自動初始化為0(自動變數的值是隨機的,除非它被顯式初始化);
靜態全局變數在聲明它的整個文件都是可見的,而在文件之外是不可見的;
靜態變數都在全局數據區分配內存,包括後面將要提到的靜態局部變數。對於一個完整的程序,在內存中的分布情況如下圖:
代碼區
全局數據區
堆區
棧區
一般程序的由new產生的動態數據存放在堆區,函數內部的自動變數存放在棧區。自動變數一般會隨著函數的退出而釋放空間,靜態數據(即使是函數內部的靜 態局部變數)也存放在全局數據區。全局數據區的數據並不會因為函數的退出而釋放空間。細心的讀者可能會發現,Example 1中的代碼中將
static int n; //定義靜態全局變數
改為
int n; //定義全局變數
程序照樣正常運行。
的確,定義全局變數就可以實現變數在文件中的共享,但定義靜態全局變數還有以下好處:
靜態全局變數不能被其它文件所用;
其它文件中可以定義相同名字的變數,不會發生沖突;
您可以將上述示例代碼改為如下:
//Example 2//File1#include <iostream.h>void fn();static int n; //定義靜態全局變數void main(){ n=20; cout<<n<<endl; fn();}//File2#include <iostream.h>extern int n;void fn(){ n++; cout<<n<<endl;}
編譯並運行Example 2,您就會發現上述代碼可以分別通過編譯,但運行時出現錯誤。 試著將
static int n; //定義靜態全局變數
改為
int n; //定義全局變數
再次編譯運行程序,細心體會全局變數和靜態全局變數的區別。
2、靜態局部變數
在局部變數前,加上關鍵字static,該變數就被定義成為一個靜態局部變數。
我們先舉一個靜態局部變數的例子,如下:
//Example 3#include <iostream.h>void fn();void main(){ fn(); fn(); fn();}void fn(){ static n=10; cout<<n<<endl; n++;}
通常,在函數體內定義了一個變數,每當程序運行到該語句時都會給該局部變數分配棧內存。但隨著程序退出函數體,系統就會收回棧內存,局部變數也相應失效。
但有時候我們需要在兩次調用之間對變數的值進行保存。通常的想法是定義一個全局變數來實現。但這樣一來,變數已經不再屬於函數本身了,不再僅受函數的控制,給程序的維護帶來不便。
靜態局部變數正好可以解決這個問題。靜態局部變數保存在全局數據區,而不是保存在棧中,每次的值保持到下一次調用,直到下次賦新值。
靜態局部變數有以下特點:
該變數在全局數據區分配內存;
靜態局部變數在程序執行到該對象的聲明處時被首次初始化,即以後的函數調用不再進行初始化;
靜態局部變數一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0;
它始終駐留在全局數據區,直到程序運行結束。但其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束;
3、靜態函數
在函數的返回類型前加上static關鍵字,函數即被定義為靜態函數。靜態函數與普通函數不同,它只能在聲明它的文件當中可見,不能被其它文件使用。
靜態函數的例子:
//Example 4#include <iostream.h>static void fn();//聲明靜態函數void main(){ fn();}void fn()//定義靜態函數{ int n=10; cout<<n<<endl;}
定義靜態函數的好處:
靜態函數不能被其它文件所用;
其它文件中可以定義相同名字的函數,不會發生沖突;
二、面向對象的static關鍵字(類中的static關鍵字)
1、靜態數據成員
在類內數據成員的聲明前加上關鍵字static,該數據成員就是類內的靜態數據成員。先舉一個靜態數據成員的例子。
//Example 5#include <iostream.h>class Myclass{public: Myclass(int a,int b,int c); void GetSum();private: int a,b,c; static int Sum;//聲明靜態數據成員};int Myclass::Sum=0;//定義並初始化靜態數據成員Myclass::Myclass(int a,int b,int c){ this->a=a; this->b=b; this->c=c; Sum+=a+b+c;}void Myclass::GetSum(){ cout<<"Sum="<<Sum<<endl;}void main(){ Myclass M(1,2,3); M.GetSum(); Myclass N(4,5,6); N.GetSum(); M.GetSum();}
可以看出,靜態數據成員有以下特點:
對於非靜態數據成員,每個類對象都有自己的拷貝。而靜態數據成員被當作是類的成員。無論這個類的對象被定義了多少個,靜態數據成員在程序中也只有一份拷 貝,由該類型的所有對象共享訪問。也就是說,靜態數據成員是該類的所有對象所共有的。對該類的多個對象來說,靜態數據成員只分配一次內存,供所有對象共 用。所以,靜態數據成員的值對每個對象都是一樣的,它的值可以更新;
靜態數據成員存儲在全局數據區。靜態數據成員定義時要分配空間,所以不能在類聲明中定義。在Example 5中,語句int Myclass::Sum=0;是定義靜態數據成員;
靜態數據成員和普通數據成員一樣遵從public,protected,private訪問規則;
因為靜態數據成員在全局數據區分配內存,屬於本類的所有對象共享,所以,它不屬於特定的類對象,在沒有產生類對象時其作用域就可見,即在沒有產生類的實例時,我們就可以操作它;
靜態數據成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式為:
<數據類型><類名>::<靜態數據成員名>=<值>
類的靜態數據成員有兩種訪問形式:
<類對象名>.<靜態數據成員名> 或 <類類型名>::<靜態數據成員名>
如果靜態數據成員的訪問許可權允許的話(即public的成員),可在程序中,按上述格式來引用靜態數據成員 ;
靜態數據成員主要用在各個對象都有相同的某項屬性的時候。比如對於一個存款類,每個實例的利息都是相同的。所以,應該把利息設為存款類的靜態數據成員。這 有兩個好處,第一,不管定義多少個存款類對象,利息數據成員都共享分配在全局數據區的內存,所以節省存儲空間。第二,一旦利息需要改變時,只要改變一次, 則所有存款類對象的利息全改變過來了;
同全局變數相比,使用靜態數據成員有兩個優勢:
靜態數據成員沒有進入程序的全局名字空間,因此不存在與程序中其它全局名字沖突的可能性;
可以實現信息隱藏。靜態數據成員可以是private成員,而全局變數不能;
2、靜態成員函數
與靜態數據成員一樣,我們也可以創建一個靜態成員函數,它為類的全部服務而不是為某一個類的具體對象服務。靜態成員函數與靜態數據成員一樣,都是類的內部 實現,屬於類定義的一部分。 普通的成員函數一般都隱含了一個this指針,this指針指向類的對象本身,因為普通成員函數總是具體的屬於某個類的具體對象的。通常情況下,this 是預設的。如函數fn()實際上是this->fn()。但是與普通函數相比,靜態成員函數由於不是與任何的對象相聯系,因此它不具有this指 針。從這個意義上講,它無法訪問屬於類對象的非靜態數據成員,也無法訪問非靜態成員函數,它只能調用其餘的靜態成員函數。 下面舉個靜態成員函數的例子。
//Example 6#include <iostream.h>class Myclass{public: Myclass(int a,int b,int c); static void GetSum();/聲明靜態成員函數private: int a,b,c; static int Sum;//聲明靜態數據成員};int Myclass::Sum=0;//定義並初始化靜態數據成員Myclass::Myclass(int a,int b,int c){ this->a=a; this->b=b; this->c=c; Sum+=a+b+c; //非靜態成員函數可以訪問靜態數據成員}void Myclass::GetSum() //靜態成員函數的實現{// cout<<a<<endl; //錯誤代碼,a是非靜態數據成員 cout<<"Sum="<<Sum<<endl;}void main(){ Myclass M(1,2,3); M.GetSum(); Myclass N(4,5,6); N.GetSum(); Myclass::GetSum();}
關於靜態成員函數,可以總結為以下幾點:
出現在類體外的函數定義不能指定關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;
非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;
靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
由於沒有this指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長;
調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,也可以直接使用如下格式:
<類名>::<靜態成員函數名>(<參數表>)
調用類的靜態成員函數。
===============================================================================================
static靜態變數聲明符。 在聲明它的程序塊,子程序塊或函數內部有效,值保持,在整個程序期間分配存儲器空間,編譯器默認值0。
是C++中很常用的修飾符,它被用來控制變數的存儲方式和可見性。
2、為什麼要引入static?
函數內部定義的變數,在程序執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題: 如果想將函數中此變數的值保存至下一次調用時,如何實現? 最容易想到的方法是定義一個全局的變數,但定義為一個全局變數有許多缺點,最明顯的缺點是破壞了此變數的訪問范圍(使得在此函數中定義的變數,不僅僅受此函數控制)。
3、什麼時候用static?
需要一個數據對象為整個類而非某個對象服務,同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見。
4、static的內部機制:
靜態數據成員要在程序一開始運行時就必須存在。因為函數在程序運行中被調用,所以靜態數據成員不能在任何函數內分配空間和初始化。
這樣,它的空間分配有三個可能的地方,一是作為類的外部介面的頭文件,那裡有類聲明;二是類定義的內部實現,那裡有類的成員函數定義;三是應用程序的main()函數前的全局數據聲明和定義處。
靜態數據成員要實際地分配空間,故不能在類的聲明中定義(只能聲明數據成員)。類聲明只聲明一個類的「尺寸和規格」,並不進行實際的內存分配,所以在類聲明中寫成定義是錯誤的。它也不能在頭文件中類聲明的外部定義,因為那會造成在多個使用該類的源文件中,對其重復定義。
static被引入以告知編譯器,將變數存儲在程序的靜態存儲區而非棧上空間,靜態
數據成員按定義出現的先後順序依次初始化,注意靜態成員嵌套時,要保證所嵌套的成員已經初始化了。消除時的順序是初始化的反順序。
5、static的優勢:
可以節省內存,因為它是所有對象所公有的,因此,對多個對象來說,靜態數據成員只存儲一處,供所有對象共用。靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態數據成員的值更新一次,保證所有對象存取更新後的相同的值,這樣可以提高時間效率。
6、引用靜態數據成員時,採用如下格式:
<類名>::<靜態成員名>
如果靜態數據成員的訪問許可權允許的話(即public的成員),可在程序中,按上述格式
來引用靜態數據成員。
7、注意事項:
(1)類的靜態成員函數是屬於整個類而非類的對象,所以它沒有this指針,這就導致
了它僅能訪問類的靜態數據和靜態成員函數。
(2)不能將靜態成員函數定義為虛函數。
(3)由於靜態成員聲明於類中,操作於其外,所以對其取地址操作,就多少有些特殊
,變數地址是指向其數據類型的指針 ,函數地址類型是一個「nonmember函數指針」。
(4)由於靜態成員函數沒有this指針,所以就差不多等同於nonmember函數,結果就
產生了一個意想不到的好處:成為一個callback函數,使得我們得以將C++和C-based X W
indow系統結合,同時也成功的應用於線程函數身上。
(5)static並沒有增加程序的時空開銷,相反她還縮短了子類對父類靜態成員的訪問
時間,節省了子類的內存空間。
(6)靜態數據成員在<定義或說明>時前面加關鍵字static。
(7)靜態數據成員是靜態存儲的,所以必須對它進行初始化。
(8)靜態成員初始化與一般數據成員初始化不同:
初始化在類體外進行,而前面不加static,以免與一般靜態變數或對象相混淆;
初始化時不加該成員的訪問許可權控制符private,public等;
初始化時使用作用域運算符來標明它所屬類;
所以我們得出靜態數據成員初始化的格式:
<數據類型><類名>::<靜態數據成員名>=<值>
(9)為了防止父類的影響,可以在子類定義一個與父類相同的靜態變數,以屏蔽父類的影響。這里有一點需要注意:我們說靜態成員為父類和子類共享,但我們有重復定義了靜態成員,這會不會引起錯誤呢?不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標志。
[編輯本段]static 函數
內部函數和外部函數
當一個源程序由多個源文件組成時,C語言根據函數能否被其它源文件中的函數調用,將函數分為內部函數和外部函數。
1 內部函數(又稱靜態函數)
如果在一個源文件中定義的函數,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用,這種函數稱為內部函數。
定義一個內部函數,只需在函數類型前再加一個「static」關鍵字即可,如下所示:
static 函數類型 函數名(函數參數表)
{……}
關鍵字「static」,譯成中文就是「靜態的」,所以內部函數又稱靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件。
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名,因為同名也沒有關系。
2 外部函數
外部函數的定義:在定義函數時,如果沒有加關鍵字「static」,或冠以關鍵字「extern」,表示此函數是外部函數:
[extern] 函數類型 函數名(函數參數表)
{……}
調用外部函數時,需要對其進行說明:
[extern] 函數類型 函數名(參數類型表)[,函數名2(參數類型表2)……];
[案例]外部函數應用。
(1)文件mainf.c
main()
{ extern void input(…),process(…),output(…);
input(…); process(…); output(…);
}
(2)文件subf1.c
……
extern void input(……) /*定義外部函數*/
{……}
(3)文件subf2.c
……
extern void process(……) /*定義外部 函數*/
{……}
(4)文件subf3.c
……
extern void output(……) /*定義外部函數*/
{……}
final類 假如說整個類都是final,就表明自己不希望從這個類繼續,或者不答應其他任何人採取這種操作。換言之,出於這樣或那樣的原因,我們的類肯定不需要進行任何改變;或者出於安全方面的理由,我們不希望進行子類化(子類處理)。
除此以外,我們或許還考慮到執行效率的問題,並想確保涉及這個類各對象的所有行動都要盡可能地有效。如下所示:
class SmallBrain {}
final class Dinosaur
{
int i = 7;
int j = 1;
SmallBrain x = new SmallBrain();
void f() {}
}
public class Jurassic
{
public static void main(String[] args)
{
Dinosaur n = new Dinosaur();
n.f();
n.i = 40;
n.j++;
}
}
注意數據成員既可以是final,也可以不是,取決於我們具體選擇。應用於final的規則同樣適用於數據成員,無論類是否被定義成final。將類定義成final後,結果只是禁止被繼承——沒有更多的限制。然而,由於它禁止被繼承,所以一個final類中的所有方法都默認為final。因為此時再也無法覆蓋它們。所以這與我們將一個方法明確聲明為final一樣。
可為final類內的一個方法添加final指示符,但這樣做沒有任何意義。