常量是指在程序運行過程中其值不能改變的量。
常量的類型
Java中常量的分類:
整數常量: 所有整數
小數常量: 所有小數
布爾常量: 只有true和false
字符常量:使用’’引起來的單個字符
字符串常量(String):使用“”引起來的字符序列,“” 、“a” 、””
null常量: 只有一個值null
char 類型
char類型表示的是單個字符類型,任何數據使用單引號括起來的都是表示字符。字符只能有一個字符,比如:普通的人穿上軍裝就是軍人。
轉義字符的概述
轉義字符 | 名稱 | Unicode |
\b | Backspace (退格鍵) | \u0008 |
\t | Tab (Tab鍵盤) | \u0009 |
\n | Linefeed (換行) | \u000A |
\r | Carriage Return(回車) | \u000D |
\\ | Backslash (反斜槓) | \u005C |
\' | Single Quote (單引號) | \u0027 |
\" | Double Quote (雙引號) | \u0022 |
\r 表示接受鍵盤輸入,相當於按下回車。
\n 表示換行。
\t 製表符,相當於Table鍵
\b 退格鍵,相當於Back Space
\’ 單引號
\’’ 雙引號
\\ 表示一個斜跨
特殊字符使用”\”把其轉化成字符的本身輸出,那麼使用”\”的字符稱作爲轉義字符。
比如使用輸出語句,打印出帶引號的信息例如輸出。
System.out.println("teachersaid"java is fun"");編譯是無法正常通過的。語法有錯誤,編譯器讀到第二個引號就認爲是字符串的結束,剩餘的不知道怎麼處理。如何解決這個問題:java中使用轉義字符來表示特殊的字符。一個轉義字符以反斜槓(\)開始。
解決方案:System.out.println("teacher said\"java is fun\"");
注意:換行符就是另起一行,回車符就是回到一行的開頭,所以我們平時編寫文件的回車符應該確切來說叫做回車換行符
boolean由數學家Geogore Boole 發明
boolean 類型用來存儲布爾值,在java中布爾值只有2個,true和false。
boolean flag=true; flag=false; |
變量
用於存儲可變數據的容器。
變量存在的意義
計算機主要用於處理生活中的數據,由於生活中存在大量的可變數據,那麼計算機就必須具備存儲可變數據的能力。
比如:
時間每一秒都在發生變化,根據不同的時間要有不同的處理方式。
氣象站會根據溫度發佈天氣預報信號。
變量的特點
正常情況下牛奶盒裝的都是牛奶,而且會根據牛奶的多少去決定要多大的容量的牛奶盒,A和B兩位同學同時把牛奶盒放進籃子裏面,但是需要區分兩個牛奶盒是誰的,都需要在牛奶盒上做一個標誌。
1. 必須要有大小
2. 存儲一定格式的可變數據
3. 必須要有名字
根據上述變量的特點,所以我們聲明一個變量的時候需要確定變量的大小,類型、名字三個特點:
錯誤: 1024byte temp = 1000000;
錯誤原因,java有自己的變量類型。
變量的數據類型
1. 整型
byte 代表一個字節的大小 8bit 2(8) -128~127 256
short 代表兩個字節的大小 16bit 2(16) -2(15)~2(15)-1
int 代表四個字節的大小 32bit 2(32) -2(31)~2(31)-1
long 代表八個字節的大小 64bit 2(64) -2(63)~2(63)-1
如果一個數值沒有采取特殊的處理,那麼該整數默認的類型是int。
可以使用數值後面添加L或小寫L改變默認的整數類型。
2. 浮點型
float 代表四個字節的大小 32bit
double 代表八個字節的大小 64bit
java程序中所有的小數默認的類型是double類型,所以需要使用特殊的符號改變默認的小數類型。
3. 字符型
char 代表兩個字節的大小 16bit 2(16)
原理:將字符映射爲碼錶中對應的十進制數據加以存儲。
4. 布爾型
boolean 佔一個字節。只有true與false兩個值。
變量的聲明
格式: 數據類型 變量名字1 , 變量名字2 ,……變量名字n ,; |
例:
int i 聲明瞭一個×××的變量。
double d 聲明瞭一個double數據類型的變量
float f 聲明瞭一個float數據類型的變量。
備註:變量名的首字母都一般都是以小寫字母開始。
變量的初始化方式
初始化方式1: 數據類型 變量名字 = 數值。
初始化方式2: 數據類型 變量名字 , 變量名字 = 數值。
例:
方式1: double d = 3.14;
方式2: double d ; d = 3.14 ;
Java中這8中基本數據類型都是小寫的。
Java中可以進行不同數據類型的加減乘除運算嗎?答案是可以的。在算術運算符中已經體驗過如果兩個整數(int)相除會去掉小數部分。如果需要保留小數部分,可以讓除數或者被除數變爲double類型的(5變爲5.0)。其實Java是自動的將int的那個數變爲了double類型了也就是Java自動的將整數變爲了浮點數。例如5/2.0 其實是5.0/2.0
1、自動類型轉換(也叫隱式類型轉換)
可以將一個數賦值給更大數值範圍的變量,例如可以經byte 變量賦值給short變量可以將short變量賦值給int變量可以將int變量賦值給long變量。
Java內部其實做了工作就是自動將數值進行了類型提升,就叫做自動類型轉換(也叫隱式類型轉換)
byte b = 1; //00000001 short s = b; //00000000 00000001 int i = s; long lon = i; double d = lon; //1.0 |
自動類型轉換(也叫隱式類型轉換)
要實現自動類型的轉換,需要滿足兩個條件,第一兩種類型彼此兼容,第二目標類型取
值範圍必須大於源類型。所有的數字類型,包括×××和浮點型彼此都可以進行轉換。
例:
byte b=100; int x=b; System.out.println(x);//程序把b結果自動轉換爲int類型。 |
2、強制類型轉換(也叫顯式類型轉換)
不可以將一個數值賦給範圍更小數值範圍的變量,除非進行類型轉換。
byte b = 100; b = b + 2; System.out.println(b); |
上述例子發生了什麼,發生了類型轉換。
b+2 遇到了加法運算,2默認是int類型,byte類型b變量存儲的值自動類型提升爲
了int類型。執行完加法運算後的結果就是int類型,想要將int的類型值放入到byte類型變量b中,無法放入,編譯報錯。
byte b=1; b=(byte)(b+2); |
當兩種類型彼此不兼容,或者目標類型取值範圍小於源類型(目標是byte源是int)
無法自動轉換,此時就需要進行強制類型轉換。
強制類型轉換需要注意:
損失精度!!!
int a=128; byte b=(byte)a; System.out.println(b);//-128 /* * 此時的強轉已經造成了數值的不準確 */ |
再次分析此行代碼
byte b = 100; b = b + 2; System.out.println(b); |
編譯:提示如下錯誤。
3、類型轉換的原理
可以把byte 理解爲1兩的碗,short 2兩的碗,int 4兩的碗,long 8兩的碗。1兩碗的滿碗酒可以倒入 2兩 4兩 8兩的碗中。但是 4兩碗的酒倒入1兩碗的酒就有一些問題。
4、什麼時候要用強制類型轉換
比如小數部分只想保留整數部分.
一定要清楚要轉換的數據在轉換後數據的範圍內否則會損失精度.
publicstaticvoid main(String[] args) { byte b = 100; b = (byte) (b + 2); System.out.println(b); // 102 //捨棄小數部分 double d=5.5; int num=(int)d; } |
5、表達式的數據類型自動提升
算術表達式,邏輯表達式
所有的byte型、short型和char的值將被提升到int型。
如果一個操作數是long型,計算結果就是long型;
如果一個操作數是float型,計算結果就是float型;
如果一個操作數是double型,計算結果就是double型。
分析 System.out.println(‘a’+1)結果?
自動類型提升
byte b = 3; int x = 4; x = x + b;// b會自動提升爲int類型參與運算。 System.out.println(x);// 7
|
強制類型轉換
byte b = 2; /* * 強制類型轉換,強制將b+2強制轉換爲byte類型,再賦值給b */ b = (byte) (b + 2); System.out.println(b);// 4 |
思考1
byte b=126;
問:既然數據默認的有數據類型,那麼126 默認是int類型的,爲什麼存儲到byte類型時不會報錯呢。
126 是常量java在編譯時期會檢查該常量(每個常量)是否超出byte類型的範圍。如果沒有可以賦值。
思考2:byte b=128;能否正常的編譯和運行。
該語句會出現編譯錯誤,128超出了byte變量的存儲範圍,所以出現編譯錯誤。
思考2
byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪一句編譯失敗?爲什麼?
b =3+4, 3和4都是常量,所以java在編譯時期會檢查該常量(每個常量)是否超出byte類型的範圍。如果沒有可以賦值。例如b=128+1 就無法編譯通過。b=127+1;也是無法通過。
b =b1+b2 不可以,因爲b1 和b2 是變量,表達式求值時,變量值會自動提升爲int型,表達式結果也就成了int型,這是要賦值給byte型的b,必須進行強制類型轉換了。
6、System.out.println(‘a’+1)結果
美國人爲了讓計算機識別他們生活中的文字,讓二進制表示生活中的文字.所以一個字母代表了一個二進制.,二進制也有十進制的表現形式.,把生活中的字母都用數字來標識,例如97 代表a ,98 代表 b。打印’a’就把a作爲輸出顯示,沒有疑問。但是 ‘a’+1 有加號涉及到了運算。根據java自動類型提升規則,同樣道理 char 提升爲int 。就把’a’代表的數字體現了出來。a 表示的是97 97+1就是98; 那麼想要查看98 表示的char 是什麼怎麼實現呢 ?就要用到剛纔介紹的強制類型轉換了 System.out.println(char(‘a’+1));就取到了98 在ASCII碼錶中表示的字符。大寫A 和小寫a 在 ASCII有不同的表現。還有一個概念字符’1’ 在ASCII中 不是數字 1,可以運行代碼查看,到此就可以明白了char 類型,char類型也是可以參與運算的,爲什麼可以參與運算呢。因爲字符在ASCII表中都有對應的數字體現。所有的計算機兼容ASCII。
System.out.println('a'+1); //98
System.out.println((char)('a'+1)); //b
補充問題:
int i='a'+'b'; System.out.println(i);//結果? System.out.println("hello"+'j'); //結果? |
總結:
所有數值運算符都可以用在char型數據上,如果另一個操作數是
一個數字或者字符,那麼char會自動提升爲int型,如果另一個
操作數是字符串,那麼字符就會和字符串相連。