很清晰!帶你圖解 Java 程序的結構,變量和類型

這是蝸牛互聯網的第 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 字節 ~  

布爾類型表達是或者否,只有 trueflase 兩個值,用關鍵字 boolean 表示,但 JVM 沒有針對 boolean 的字節碼指令,因此在虛擬機規範裏,boolean 類型在編譯後會被 int 代替,佔用 4 個字節,如果是 boolean 數組,會被編譯成 byte 數組類型,每個 boolean 數組元素佔 1 個字節。實際情況就取決於各廠商發佈的 JVM 實現了。

數字類型包括了整型類型和浮點類型。

整型類型根據取值範圍的不同,細分成了 byteshortintlongchar五種,分別是 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 個值。

浮點數指小數,科學計數法表示的時候,小數點是可以“浮動”的,所以稱爲浮點數。

浮點類型有 floatdouble 兩種,其值分別爲 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源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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