這是蝸牛互聯網的第 105 期原創。
作者 | 白色蝸牛
來源 | 蝸牛互聯網(ID: woniu_internet)
轉載請聯繫授權(微信ID: 919201148)
前言
上一篇文章 手寫的第一個 Java 應用程序,執行的時候發生了什麼,我們用 Java 做了實踐編程,並簡單瞭解了它運行的原理。但這些還只是表象和皮毛,Java 的知識博大而精深,需要慢慢深入理解和領會,蝸牛就帶大家來啃這塊硬骨頭吧!
學習一門新知識,基礎是最重要的。就像起一座大樓,地基打的夠堅實,大樓纔會更穩固。另一個角度講,所有的複雜都是簡單元素的加工和組合,百變不離其宗,基礎就是這種簡單元素。
所以,我們先來學習下 Java 最基礎的部分!本篇文章聊聊 Java 程序的結構,變量以及數據類型。
Java 程序的結構
學習一個新東西,我建議先看它的結構,這樣有了整體的認知之後,再去學習細節,就能更好的認識到每個細節點在整體中的位置和作用,可以更好的理解整體和局部之間的關係。
比如我們現在學的是 Java 程序語言設計,那它的表現形式就是 Java 代碼。寫一個能跑的 Java 程序,那就需要寫個 class,class 裏要有個 main 方法,這樣就構成了一個完整的 Java 程序。
其實我們上篇提到的 HelloWorld 程序就是一個完整的 Java 程序,它由訪問修飾符、類類型、類命名、main 方法、執行語句、花括號和註釋這幾個核心要素構成。
訪問修飾符決定了被修飾對象的可訪問範圍,被修飾對象可以是類、變量和方法,訪問範圍的標識有 public、protected、缺省和 private。
類類型表明當前類的類型,有 class
(普通類)、enum
(枚舉類)、interface
(接口類)和 @interface
(註解類)。
類名是當前類的標識,通過它來區別其它類。命名的時候一般大寫字母開頭,可以是字母數字下劃線的組合,不過最規範的是大寫字母開頭的駝峯式命名。
main 方法是 Java 程序必備的一個東西,它是 Java 程序的執行入口,聲明也是固定的。
執行語句就是我們要編寫的程序邏輯了,每條語句都要用 ;
(分號)結束。
花括號 {}
代表了當前內容的作用域,它總是成對出現。比如 HelloWorld
後邊的 {}
裏的內容,就隻影響到當前這個 class,main(String[] args)
後邊的 {}
裏的內容,就隻影響到當前這個 main 方法。
註釋是對代碼邏輯的解釋,它不是寫一個 Java 程序必備的,也不會被編譯到字節碼文件裏。但在我的經驗裏,有它比沒有它強,因爲代碼雖說是給機器執行的,但卻是給人看的,好的代碼註釋,是能夠提升代碼的可讀性和可維護性的。我這個例子裏寫的註釋有類註釋、方法註釋、行註釋和多行註釋。
變量和數據類型
變量
HelloWorld 程序一般用來輔助我們判斷自己環境有沒有配置好,如果 HelloWorld 能運行,就說明我們 Java 環境是好的,就可以專心編程和調試了。
編程躲不開的一個概念就是變量。
什麼是變量呢?顧名思義,就是變化的量,這個概念起源於初中數學的代數,比如方程式中的 x 和 y 都是變量,x 是自變量,y 是因變量,如果基於一定的規則,只要給定一個 x 的值,就一定能得到 y 的值。
y = x + 1
這就非常契合我們編程的場景了,給一個輸入,跑一下程序,就能得到一個確定的輸出。至於輸出什麼樣的值,取決於這個程序要實現的功能以及給定輸入的值。
我們回過頭來看下剛纔那個方程式 y=x+1
,如果沒有限定的話,x 其實可以是整數,也可以是小數,還可以是字符串。可是如果是個字符串,就無法按數學規則進行運算了。所以即便是方程式的場景,一般也會約定變量的一個類型,比如 x 是個整數。
同樣的,反映到 Java 裏,Java 是一種靜態類型語言,這意味着每個變量和每個表達式在編譯時就需要知道類型。如果我們想定義一個變量 x,就需要指定一下它的類型,以便能夠通過編譯以及進行後續的運算。
這也是 Java 變量的一個原則:先定義後使用,定義必須指定數據類型。
比如較小的整數可以用 byte num;
表示。變量也可以做賦值操作,比如 num = 10;
就把 10 這個整數賦值給了 num 這個變量。另外,變量也支持傳遞,比如 byte num2 = num;
就是把 num 的值傳遞給了 num2。
在計算機上,CPU 負責計算,內存負責存儲待計算的數據。上圖的方塊你可以理解成一塊內存,你會發現它是一塊一塊的,這就是內存的基本單位——byte(字節)。一個字節是 8 bit(位),也就是一個字節能容納二進制 00000000~11111111
所有的數字。
我們的程序也是字節維度使用內存,而內存空間是有限的,就需要有指標能衡量待存儲的數據大小,以避免內存超限而引起程序崩潰。
因此,程序運行的時候,需要告訴內存,我要申請多大的內存空間,也就是圖裏面會用多少個小方塊,其次是我存的值是什麼,也就是圖裏面小方塊裏的值。我們的變量 num 就是申請了一個字節的空間,然後存了數字 10。
那麼如果 num 要用的值超過了一個字節的限度,我們其實就無法使用 byte 這個數據類型了,就需要定義一種新的數據類型來支撐,好在 Java 已經幫我們做好了這件事!
類型的種類和值
那 Java 支持哪些數據類型呢?
在 Java 的世界裏,有基本類型和引用類型兩種。相應地,有兩種數據值可以存儲在變量中,作爲參數傳遞,由方法返回,並對其進行操作: 原始值和引用值。
基本類型
我們先看下基本類型。
基本數據類型在 Java 裏可分爲布爾類型和數字類型兩大類:
大類類型 | 細分類型 | 關鍵字 | 內存佔用 | 取值範圍 |
---|---|---|---|---|
布爾類型 | 布爾類型 | boolean | 1 字節或 4 字節 | true 和 false |
數字類型 | 整型類型 | byte | 1 字節 | ~ |
數字類型 | 整型類型 | short | 2 字節 | ~ |
數字類型 | 整型類型 | int | 4 字節 | ~ |
數字類型 | 整型類型 | long | 8 字節 | ~ |
數字類型 | 整型類型 | char | 2 字節 | 0 ~ |
數字類型 | 浮點類型 | float | 4 字節 | ~ |
數字類型 | 浮點類型 | double | 8 字節 | ~ |
布爾類型表達是或者否,只有 true
和 flase
兩個值,用關鍵字 boolean
表示,但 JVM 沒有針對 boolean
的字節碼指令,因此在虛擬機規範裏,boolean
類型在編譯後會被 int
代替,佔用 4 個字節,如果是 boolean 數組,會被編譯成 byte
數組類型,每個 boolean
數組元素佔 1 個字節。實際情況就取決於各廠商發佈的 JVM 實現了。
數字類型包括了整型類型和浮點類型。
整型類型根據取值範圍的不同,細分成了 byte
、short
、int
、long
和 char
五種,分別是 8 位、16 位、32 位、64 位有符號整數和 16 位無符號整數,分別佔用一個字節、兩個字節、四個字節、八個字節和兩個字節的內存空間。
整型類型的值是以下範圍的整數:
-
byte
: -128 到 127,包括邊界值 -
short
: -32768 到 32767,包括邊界值 -
int
: -2147483648 到 2147483647,包括邊界值 -
long
: -9223372036854775808 到 9223372036854775807,包括邊界值 -
char
: '\u0000' 到 '\uffff',包括邊界值,也就是從 0 到 65535。char
可表示標準的 ASCII 或一個 Unicode 字符。ASCII 字符集佔據 Unicode 字符集中的前 127 個值。
浮點數指小數,科學計數法表示的時候,小數點是可以“浮動”的,所以稱爲浮點數。
浮點類型有 float
和 double
兩種,其值分別爲 32 位 IEEE 754 浮點數和 64 位 IEEE 754浮點數。
float
可選地以後綴 f或F
結尾,double
可選地以後綴 d或D
結尾。表格中的取值範圍僅表示幅度,它可以是正也可以是負,負數場景在前面加個負號即可。
瞭解基本概念後,我們舉個例子看下 Java 中如何使用吧!
package cn.java4u.codebase;
/**
* 基礎類型變量
*
* @author 蝸牛
* @from 公衆號:蝸牛互聯網
*/
public class BaseVar {
/**
* 主函數
*
* @param args args
*/
public static void main(String[] args) {
/*
* 變量定義格式:
* 數據類型 變量名;
* 數據類型 變量名 = 變量值;
*/
/*
布爾類型
*/
// 布爾未賦值
boolean boolNoValue;
// 布爾賦值 true
boolean boolTrue = true;
// 布爾賦值一個計算結果
boolean boolWithResult = 2 > 1;
// 布爾賦值 非 true 或 false 會編譯報錯
// boolean boolCompileError = 123;
/*
整數類型
*/
// 字節賦值 8
byte byteDemo = 8;
// 賦值越界會編譯報錯
// byte byteOutOfBounds = 188;
// 短整型賦值 188
short shortDemo = 188;
// 整型賦值 38888
int intDemo = 38888;
// 整型賦值帶下劃線,提高辨識度
int intDemoWithUnderLine = 1888_888_888;
// 十六進制表示 16711680
int intDemoWithHex = 0xff0000;
// 二進制表示的512
int intDemoWithBinary = 0b1000000000;
// long型的結尾需要加 L
long longWithSuffix = 2147483649L;
/*
浮點數類型
浮點類型的數就是通常意義上的小數,因爲小數用科學計數法表示的時候,小數點是可以“浮動”的,所以稱爲浮點數。
*/
// 單精度浮點數賦值,加 f 後綴
float floatDemo = 9.18f;
// 負的單精度浮點數
float floatNegDemo = -9.18f;
// 科學計數法表示的 3.14x10^38,float 類型可表示的最大數
float floatDemoWithSci = 3.14e38f;
// 科學計數法表示的1.79x10^308,double類型可表示的最大數
double doubleDemo = 1.79e308;
/*
字符類型
Java 的 字符類可表示標準的 ASCII 和一個 Unicode 字符。
*/
// char 用 ascii 字符賦值
char charWithAscii = '.';
// char 用 Unicode 字符賦值
char charWithUnicode = '牛';
// char 多字符會編譯報錯
// char charCompileError = '蝸牛';
}
}
看完示例代碼,你應該能清楚變量定義的格式是 數據類型 變量名;
或者 數據類型 變量名 = 變量值;
,數據類型相當於鎖定了這個變量的一個數據範圍,等號是賦值符號,代表把等號右邊的值賦給左邊的變量,使得這個變量在後邊的運算中就攜帶了這個值的信息。
Java 是強類型語言,所以如果等號右邊給的值不在變量定義的數據類型範圍內,就會編譯報錯,這也一定程度上避免了我們寫錯代碼。
引用類型
上面提到的變量都是基本類型的,表達的都是非常基礎的數值類的信息,那如果想表達更復雜的一些信息,那就要用到引用類型了。
比如最常用的 String
就是引用類型,常常用它來表示字符串。它底層其實就是一個 char[]
,也就是 char
類型的數組。
引用類型相比於基本類型,它的核心差別在於,引用類型的變量它的內部存儲的不是變量值,而是某個對象在內存中的地址。這個我們後邊在介紹類相關概念的時候會深入探討。
小結
本文從 HelloWorld 程序爲例,介紹了 Java 程序的整體結構,幫助大家瞭解了一個完整的 Java 程序需要具備哪些要素。接着介紹了編程實踐的時候躲不開的 Java 變量相關的知識,以及 Java 作爲強類型語言,在 Java 規範裏所涉及的類型。也通過示例代碼的方式,幫助大家加深了認識。
本文分享自微信公衆號 - 程序員書單(CoderBooklist)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。