相比c++,Java在基礎語法的改變

相比c++,Java在基礎語法的改變

作者:coder小碼

此篇給Java初學者的一點參考,算是入門吧,對有c/c++基礎的同學來說,更是幫助他們儘快理解Java更深層次(面向對象,集合,泛型,多線程與併發)的強力劑,如有缺漏敬請補正!(轉載需註明出處!)

文章目錄:
  1. 運行機制
  2. 基本數據與特殊類型
  3. 字符集與數值表達
  4. 文檔註釋
  5. 連字符+與輸出
  6. switch語句
  7. foreach循環
  8. 數組類型

01 Java運行機制

在運行機制上,Java不同於任何一門語言,Java編寫好的源代碼文件並不是經過編譯後就能立馬執行的。不像c/c++一樣,編譯後就是.exe了,雙擊就可以運行,但是Java有它巧妙的地方。先說明一下,任何的編程語言的源碼都需要經過編譯變成二進制代碼,才能被執行,無論c/c++還是Java。在Windows上把c/c++源碼經過gCC/g++編譯後能運行,但在Linux或其他平臺,要有相應的源碼編譯器爲源碼進行編譯,也就是說,想要在其他平臺上運行,得把c/c++源碼在編譯一遍才能運行。看起來也還行的樣子,不就是在編譯一次嘛!有多大麻煩呢?對程序員來說不算是什麼難事,但對用戶來說就是難事,或者說,用起來就是個麻煩事。誰還會辛辛苦苦又編譯一次源碼,然後讓它在機子上跑,萬一出問題還得重來!

起初Java就是爲解決這個問題而設計出來的,最早是被sun公司用於嵌入式的設備開發,理念是“write once,run anywhere!”,設計出來後並不很火,那時候c++本身就可以跨平臺,所以也沒Java什麼事兒了。但是之後發現真的可以做到 “ run anywhere ” , 並且由於網頁端互聯網浪潮的掀起,Java在web上大顯身手,這纔有了今天的Java,然而sun公司在09年被Oracle收購,之後江湖上再也沒了sun公司的身影。那Java又是怎麼解決跨平臺的問題呢?

先要了解Java文件,源碼文件以.java爲後綴,經過編譯後不直接生成可執行文件,而是生成.class字節碼文件(16進制),這個文件不是讓平臺的操作系統讀的,是讓JVM (java virtual machine)java虛擬機讀的,平臺上的虛擬機識別後會相應生成能讓機子跑起來的二進制文件,就能執行了。其中的原理比較複雜,就不過多陳述啦!

那有人就不快樂啦:就這?

當然不是,繼續講。想簡單跑一個"hello 妹紙!"需要咋做啊?

首先上[Oracle的官網],下載jdk1.8版本,就是常說的Java8。jdk(java development kits大概就這樣),顧名思義:Java開發包,有SE(standard environment) , EE (enterprise environment),ME(micro environment),即標準版,企業版,微型版。我們要學的是SE,到了工作崗位,可能就要EE了,ME現在基本少的接觸,就不用學了,畢竟jdk都14了!裏面大致分爲javac編譯器,運行器java.exe,JRE(java runtime environment) java 運行環境,java基礎類庫,和其他支持。其中JRE裏面有JVM(負責解釋字節碼),和其他環境支持。如果在windows上編譯"coder小 碼.java “源文件,就變成"coder小碼.class”,想要在另一臺裝linux的機子上運行,只需要在這臺機子上裝JRE就行了,JVM解釋"coder小碼.class"文件後執行它就行了。


02 基本與特殊數據類型

Java相較於原始的c語言,多出了兩個基本數據類型,byte字節(1個字節),和boolean布爾(true/false)基本類型,總共8種;其他爲引用(reference)類型,多出了String字符串類型,Array數組類型,null類型(唯一值null),等等。原來的char字符類型變成了兩個字節,可以支持中文字符,一個char,一個漢字。

保留字(目前未使用但以後會使用):const ; goto也是關鍵字。

直接量:true,false,null.雖然不是關鍵字,但依然不能用來做標識符。

標識符:增加了$標識開頭(中英字母,下劃線),同樣不能數字打頭,其後才能接任意字符,中日英皆可。


03 字符集與數值表達

上面大家可能就有點疑問了,咋就這麼越來越開放了!中日字符都來了!沒錯,Java換了字符支持,使用unicode字符集,幾乎支持所有字符,改變了以往編程語言只支持英文標識符的情況,現在讀取一個char就相當於讀取了一個漢字了。unicode就是這麼槓!

數值表達:Java在整數上又動手動腳的,增加了對二進制整數的表達,比如。

int binary = 0b10000001;

上面爲一個負數,需要換算成原碼爲-128。另外爲防止程序員出意外看走眼,還可以寫成:

int binary  = 0b1000_0001;

用下劃線可以分隔整型和浮點型。


04 文檔註釋

註釋除了以前常用的單多行註釋,Java還增加了文檔註釋。Java爲開發者提供了大量的基礎類,同時也提供了API幫助文檔,介紹各個API、方法、包、類的使用方法,原型。如果編寫很大的Java程序,可以利用javadoc工具將源碼的文檔註釋提取出來變成API文檔,例:

/**兩個*
*Description
*<h1>javadoc</h1>
*Copyright 2009
*@author coder小碼
*@version 1.0
*/

可以在類,方法,public\protected變量前加註釋。進入目錄,終端輸入:

javadoc -d D://coder/ -windowtitle API文檔 -author -version *.java

上面的命令用於生成Java文檔,-d 存放目錄 ,-windowtitle 窗口標題,-author -version,加上作者和版本信息,從當前目錄下所有Java源文件中提取註釋。之後就生成了和官方一樣專業的API文檔了!


05 連字符‘+’與輸出

和c++一樣,Java也有連字符,可以將字符串拼接到一起,但同時又能做算術運算,這就涉及到了運算符的重載和基本數據類型的裝拆箱了。

String coder = "小碼"+"coder";
String coder2 = "coder小碼"+321;
System.out.println(coder);
System.out.println(coder2);

輸出爲:“小碼coder”,“coder小碼321”。

將+看作是一個方法,既可以把數字作爲參數,又可以把字符做參數,而方法名卻沒有變,算是隱式的重載一個“+”方法。

輸入輸出:

Java裏主要有3種輸出方式,或者說方法吧!上面的算一種:println(變量),即直接輸出變量值,還帶換行!第二種:printf("%s",string),這種再熟悉不過了,需要搭配格式符輸出;第三種:print(變量),同樣直接輸出值,只不過不帶換行!以上都在lang包的System類下的out方法,返回PrintStream輸出流類下的println()方法。


06 switch語句

Java7增強了switch語句,原來從switch(expression),表達式只能是byte , short , int , char四種,後來增加了枚舉類型enum和String類型,但是不能爲true/false布爾型 。相比c/c++的switch語句,多了byte,char(可以是單箇中文字符)。需要注意的是:可以是String類型,而不是StringBuffer或StringBuilder字符串類型,即使都是字符串類型。

String coder = "coder小碼";
switch (coder){
	case "點贊":
		System.out.println(coder);
		break;
	case "收藏":
		System.out.println(coder);
		break;
	case "coder小碼":
		System.out.println(coder);
		break;
	default:
		System.out.println(coder);
}

07 foreach循環

foreach循環是從Java5之後開始加入的,python語法裏也有foreach循環,使用它進行遍歷操作非常方便。那方便在哪呢?

  • 無需獲得要遍歷對象的長度,即不需要知道數組或集合多大
  • 無需根據索引(下標)訪問數組或集合(collection)的元素

foreach語法如下:

for(元素類型 循環變量: 數組或集合){
	//要執行的代碼塊
	System.out.println(循環變量);
}

從上面看出,foreach的循環將數組或集合中的元素臨時賦值給了循環變量,後逐個輸出,並沒有改變數組的元素,即foreach雖好,但不能改變數組或集合的內容 或值。如果在循環內給循環變量進行賦值,同樣不能改變其內容,反而將想要獲得的數組的元素修改替換了。


08 數組類型

在Java裏數組類型有很大變化,以前在c/c++裏,數組名就相當於一個指針,指向數組內存首地址。在Java中不是沒有指針,只是指針這種概念被弱化了,很少提到,反而多出了引用這種類型,而數組就屬於引用類型。

數組的定義有兩種方式:
int[] coder;
或int coder[];

很明顯,在引入引用的概念並支持unicode字符集後,選擇第一種方式才符合Java的語法,不是說第二種就錯了,而是第二種可讀性太差,很容易看成是定義了一個int類型的以“coder[]”爲變量名的數據,而第一種方式,int[]本身就是一種引用類型,而coder就是一個妥妥的引用變量。

數組的初始化的3種方式:
第一種:coder = new int[] {3,2,1};
第二種:coder = new int[3];
第三種:int[] coder = {3,2,1};

經典又常用的三種初始化方式,先說前兩種吧。前兩種都是在已經定義了數組的情況下進行初始化的,我們將第一種稱做靜態初始化,即初始化的時候就把元素值填了進去,這個時候數組就定了,長度不再改變。而第二種則可以稱動態初始化,只是初始化他的長度,並沒有賦值。第三種是第一種的簡化,即把數組定義和靜態初始化兩步合一步。以上就是數組的誕生過程,可能有小夥伴會發牢騷:弄一個數組都這麼麻煩,還沒c/c++效率高呢!的確,c/c++是效率高,但上面之所以要帶一個關鍵字new,其實是爲了給數組分配一個內存並初始化賦值,儘管定義了一個數組變量,但只是引用變量而已,沒有真正的存數據的內存,起到的也只是一個指向內存的作用,真正有內存是new一個給它。


最後附上:
小碼blog
博客園
微信公衆號:小碼之光

小碼之光


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章