1. 程式人生 > >5.資料型別

5.資料型別

一.註釋

  接下來我們將的內容可能比較瑣碎。但是都是基礎,就如同蓋房子我們需要的磚塊一樣,之後講控制語句,控制語句就像黏土一樣,講磚塊連線起來。

  為了方便程式的閱讀,Java語言允許程式設計師在程式中寫上一些說明性的文字,用來提高程式的可讀性,這些文字性的說明就稱為註釋。寫註釋提高我們程式設計師之間相互協作的效率,所以我們要在每一個類,每一個方法上面寫上註釋, 註釋不會出現在位元組碼檔案中,即Java編譯器編譯時會跳過註釋語句。 在Java中根據註釋的功能不同,主要分為單行註釋、多行註釋和文件註釋。

  • 單行註釋: 使用“//”開頭,“//”後面的單行內容均為註釋。
  • 多行註釋: 以“/”開頭以“
    /”結尾,在“/”和“/”之間的內容為註釋,我們也可以使用多行註釋作為行內註釋。但是在使用時要注意,多行註釋不能巢狀使用。有個小技巧,我們可以用多行註釋來做行內註釋。
  • 文件註釋: 以“/**”開頭以“*/”結尾,註釋中包含一些說明性的文字及一些JavaDoc標籤(後期寫專案時,可以生成專案的API)

例子:

/**
 * Welcome類(我是文件註釋)
 * @author 趙
 * @version 1.0
 */
public class Welcome {
    //我是單行註釋
    public static void main(String[] args/*我是行內註釋 */) {
        System.out.println("Hello World!");
    }
    /*
       我是多行註釋!
       我是多行註釋!
     */
}

二.識別符號

識別符號的作用:識別符號是用來給變數、類、方法以及包進行命名的,如Welcome、main、System、age、name、gender等。 識別符號需要遵守一定的規則:

  • 識別符號必須以字母、下劃線_、美元符號$開頭。
  • 識別符號其它部分可以是字母、下劃線“_”、美元符“$”和數字的任意組合。
  • Java 識別符號大小寫敏感,且長度無限制。
  • 識別符號不可以是Java的關鍵字。

識別符號的使用規範:

  • 表示類名的識別符號:每個單詞的首字母大寫,如Man, GoodMan
  • 表示方法和變數的識別符號:第一個單詞小寫,從第二個單詞開始首字母大寫,我們稱之為“駝峰原則”,如eat(), eatFood()

  【注意】:Java不採用通常語言使用的ASCII字符集,而是採用Unicode這樣標準的國際字符集。因此,這裡字母的含義不僅僅是英文,還包括漢字等等。但是不建議大家使用漢字來定義識別符號!

題外篇:   1.ASCII字符集   我們知道,計算機內部,所有資訊最終都是一個二進位制值。每一個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,這被稱為一個位元組(byte)。也就是說,一個位元組一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從00000000到11111111。   上個世紀60年代,美國製定了一套字元編碼,對英語字元與二進位制位之間的關係,做了統一規定。這被稱為 ASCII 碼,一直沿用至今。   ASCII 碼一共規定了128個字元的編碼,比如空格SPACE是32(二進位制00100000),大寫的字母A是65(二進位制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個位元組的後面7位,最前面的一位統一規定為0。

  2.非ASCII編碼   英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。於是,一些歐洲國家就決定,利用位元組中閒置的最高位編入新的符號。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號。至於亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個位元組只能表示256種符號,肯定是不夠的,就必須使用多個位元組表達一個符號。比如,簡體中文常見的編碼方式是 GB2312,使用兩個位元組表示一個漢字,所以理論上最多可以表示 256 x 256 = 65536 個符號。

  3.Unicode   世界上存在著多種編碼方式,同一個二進位制數字可以被解釋成不同的符號。因此,要想開啟一個文字檔案,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現亂碼。為什麼電子郵件常常出現亂碼?就是因為發信人和收信人使用的編碼方式不一樣。   可以想象,如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是 Unicode,就像它的名字都表示的,這是一種所有符號的編碼。UTF-8 就是在網際網路上使用最廣的一種 Unicode 的實現方式。其他實現方式還包括 UTF-16(字元用兩個位元組或四個位元組表示)和 UTF-32(字元用四個位元組表示),不過在網際網路上基本不用。重複一遍,這裡的關係是,UTF-8 是 Unicode 的實現方式之一。 題外話結束。

合法的識別符號 int a = 3; int _123 = 3; int $12aa = 3; int 變數1 = 55; //合法,但是不建議使用中文命名的識別符號

三.Java關鍵字/保留字

關鍵字這塊大家只需要看一遍就行,不用背。

abstract assert boolean break byte case catch char class
const continue default do double else extends final finally
float for default goto if import instanceof int interface
long native new null package private protected public return
short static strictfp super switch synchronized this throw throws
transient try void volatile while

四.變數

初識變數:   變數本質上就是代表一個”可操作的儲存空間”,空間位置是確定的,但是裡面放置什麼值不確定。我們可通過變數名來訪問“對應的儲存空間”,從而操縱這個“儲存空間”儲存的值。   Java是一種強型別語言,每個變數都必須宣告其資料型別。變數的資料型別決定了變數佔據儲存空間的大小。 比如,int a=3; 表示a變數的空間大小為4個位元組。   變數作為程式中最基本的儲存單元,其要素包括變數名,變數型別和作用域。變數在使用前必須對其宣告, 只有在變數宣告以後,才能為其分配相應長度的儲存空間。

格式為:

type  varName [=value][,varName[=value]...]; 
//[]中的內容為可選項,即可有可無
資料型別  變數名  [=初始值] [,變數名  [=初始值]…];

double  salary;
long  earthPopulation;
int  age;

在這裡插入圖片描述

變數分類: 區域性變數(local variable)/例項變數   方法或語句塊內部定義的變數。生命週期是從宣告位置開始到到方法或語句塊執行完畢為止。區域性變數在使用前必須先宣告、初始化(賦初值)再使用。

public void test() {
	{/ / 語句塊 開始
		int a=1;
		System.out.print(a);
	} // 語句塊 結束

   int i;
   int j = i+5 ; // 編譯出錯,變數i還未被初始化 
} 
  
public void test() {
   int i;
   i=10;
   int j = i+5 ; // 編譯正確
}

成員變數(也叫例項變數 member variable)   方法外部、類的內部定義的變數。從屬於物件,生命週期伴隨物件始終。如果不自行初始化,它會自動初始化成該型別的預設初始值。(而區域性變數需要初始化)

資料型別 初始值
int 0
double 0.0
boolean false

靜態變數(類變數 static variable)   使用static定義。 從屬於類,生命週期伴隨類始終,從類載入到解除安裝。 (注:講完記憶體分析後我們再深入!先放一放這個概念!)如果不自行初始化,與成員變數相同會自動初始化成該型別的預設初始值。

/**
 * 測試變數
 * 
 * @author 趙
 *
 */
public class TestVariable {
    int a;                    //成員變數, 從屬於物件; 成員變數會自動被初始化
    static  int  size;   //靜態變數,從屬於類
     
    public static void main(String[] args) {
        {
            int age;        //區域性變數,從屬於語句塊;
            age = 18;
        }
         
        int salary = 3000;    //區域性變數,從屬於方法
 
        int gao = 13;
        System.out.println(gao);
 
        int i;
        // int j = i + 5; // 編譯出錯,變數i還未被初始化
    }
}

五.常量(Constant)

  常量通常指的是一個固定的值,在Java語言中,主要是利用關鍵字final來定義一個常量。 常量一旦被初始化後不能再更改其值。 宣告格式為:

final  type  varName = value;

變數和常量命名規範(不規範會直接損害你的個人形象)

  1. 所有變數、方法、類名:見名知意
  2. 類成員變數:首字母小寫和駝峰原則: monthSalary
  3. 區域性變數:首字母小寫和駝峰原則
  4. 常量:大寫字母和下劃線:MAX_VALUE
  5. 類名:首字母大寫和駝峰原則: Man, GoodMan
  6. 方法名:首字母小寫和駝峰原則: run(), runRun()

六.基本資料型別

  Java是一種強型別語言,每個變數都必須宣告其資料型別。 Java的資料型別可分為兩大類:基本資料型別(primitive data type)和引用資料型別(reference data type)。 在這裡插入圖片描述

引用資料型別的大小統一為4個位元組,記錄的是其引用物件的地址!

6.1整數型別:

型別 佔用儲存空間 表數範圍
byte 1位元組 -2^7 ~ 2^7-1(-128~127)
short 2位元組 -2^15 ~ 2^15-1 (-32768~32767)約3萬
int 4位元組 -2^31 ~ 2^31-1 (-2147483648~2147483647) 約21億
long 8位元組 -2^63 ~ 2^63-1

Java 語言整型常量的四種表示形式

  1. 十進位制整數,如:99, -500, 0(預設)
  2. 八進位制整數,要求以 0 開頭,如:015
  3. 十六進位制數,要求 0x 或 0X 開頭,如:0x15
  4. 二進位制數,要求0b或0B開頭,如:0b01110011 Java語言的整型常數預設為int型,宣告long型常量可以後加‘ l ’或‘ L ’ 。
long a = 55555555;  //編譯成功,在int表示的範圍內(21億內)。
long b = 55555555555;//不加L編譯錯誤,已經超過int表示的範圍。

6.2浮點型別:   帶小數的資料在Java中稱為浮點型。浮點型可分為float型別和double型別。   float型別又被稱作單精度型別,尾數可以精確到7位有效數字,在很多情況下,float型別的精度很難滿足需求。而double表示這種型別的數值精度約是float型別的兩倍,又被稱作雙精度型別,絕大部分應用程式都採用double型別。浮點型常量預設型別也是double。   float型別的數值有一個字尾F或者f ,沒有後綴F/f的浮點數值預設為double型別。也可以在浮點數值後新增字尾D或者d, 以明確其為double型別。   浮點型別float,double的資料不適合在不容許舍入誤差的金融計算領域。如果需要進行不產生舍入誤差的精確數字計算,需要使用BigDecimal, BigInteger類。

 float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);//結果為false

float d1 = 423432423f;
float d2 = d1+1;
if(d1==d2){
   System.out.println("d1==d2");//輸出結果為d1==d2
}else{
    System.out.println("d1!=d2");
}

6.3字元型別:   字元型在記憶體中佔2個位元組,在Java中使用單引號來表示字元常量。例如’A’是一個字元,它與”A”是不同的,”A”表示含有一個字元的字串。   char 型別用來表示在Unicode編碼表中的字元。Unicode編碼被設計用來處理各種語言的文字,它佔2個位元組,可允許有65536個字元。

char eChar = 'a'; 
char cChar ='中';

Unicode具有從0到65535之間的編碼,他們通常用從’\u0000’到’\uFFFF’之間的十六進位制值來表示(字首為u表示Unicode)

char c = '\u0061';

Java 語言中還允許使用轉義字元 ‘\’ 來將其後的字元轉變為其它的含義。常用的轉義字元及其含義和Unicode值如表2-6所示。

轉義符 含義 Unicode值
\b 退格(backspace) \u0008
\n 換行 \u000a
\r 回車 \u000d
\t 製表符(tab) \u0009

6.4 boolean型別 boolean型別有兩個常量值,true和false,在記憶體中佔一位(不是一個位元組),不可以使用 0 或非 0 的整數替代 true 和 false ,這點和C語言不同。 boolean 型別用來判斷邏輯條件,一般用於程式流程控制 。 請不要這樣寫:if ( flag == true ),只有新手才那麼寫。