本章目錄
- 溫馨提示
- 開篇介紹( 說的多一點 耐心看完哦!)
- 本章重點
- 正文開始
- 1. 變數和型別
- 1.1 常量
- 1.2 變數
- 1.2.1 變數的作用域
- 1.2.2 變數的命名規則(阿里巴巴開發手冊)
- 1.3 基本資料型別
- 1.3.1 整型變數(重點)
- 1.3.2 長整型變數
- 1.3.3 雙精度浮點型變數(重點)
- 1.3.4 單精度浮點型變數
- 1.3.5 字符型別變數
- 1.3.6 位元組型別變數
- 1.3.7 短整型變數
- 1.3.8 布爾型別變數
- 1.3.9 字串型別變數(重點)
- 2. 型別轉換及數值提升
- 2.1 型別轉換
- 2.1.1 int 和 long/double 相互賦值
- 2.1.2 int 和 boolean 相互賦值
- 2.1.3 int 和 String 之間的相互轉換
- 2.2 數值提升
- 2.2.1 int 和 long 混合運算
- 2.2.2 byte 和 byte 的運算
- 全文結束
溫馨提示
大家好我是Cbiltps,在我的博客中如果有難以理解的句意,難以用文字表達的重點,我會有配圖,所以我的博客配圖非常重要!!!
而且很多知識在代碼的注釋里,所以代碼注釋也非常重要!!!
開篇介紹( 說的多一點 耐心看完哦!)
從今天開始我就寫JAVA相關博客了,關于JAVA我也會做分欄:【JAVA SE】和后期的【JAVA EE初階/進階】還有其他的課程,這篇文章是【JAVA SE】的第一篇博客!
這是一新的起點也是一個新的開始,在學習JAVA之前建議學習一下C語言的,這樣JAVA前幾章的知識點學習起來更容易!
那博主就是先學習C語言的,所以在前面的資料型別、運算子、邏輯控制、方法會寫的精簡一些,相比于大多數的文章,我覺得我寫的更勝一籌,所以你們不必擔心文章的內容!
那么,今天這篇博客的知識點在拼多多、阿里巴巴、快手、猿輔導等公司常考!!!
本章重點
- 常量及變數
- 資料型別的詳細介紹
- 型別轉換及數值提升
正文開始
1. 變數和型別
1.1 常量
什么是常量?
常量就是程式在運行的時候不能修改的量
常量的分類:
- 字面值常量
final修飾的變數(也叫常量)
//字面值常量
10 // int 字面值常量(十進制)
010 // int 字面值常量(八進制) 由數字 0 開頭, 010 也就是十進制的 8
0x10 // int 字面值常量(十六進制) 由數字 0x 開頭, 0x10 也就是十進制的 16
10L // long 字面值常量. 也可以寫作 10l (小寫的L)
1.0 // double 字面值常量. 也可以寫作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科學計數法表示, 相當于 1.5 * 10^2
1.0f // float 字面值常量, 也可以寫作 1.0F
true // boolen 字面值常量, 同樣的還有 false
'a' // char 字面值常量, 單引號中只能有一個字符
"abc" // String 字面值常量, 雙引號中可以有多個字符
final int a = 10;//final關鍵字修飾的常量
a = 20;//如果想要修改它的值,就會報錯(運行圖如下)

注意:常量在編譯的時候就已經確定其值是什么了(只能初始化一次)!
1.2 變數
變數指的是程式運行時可變的量,創建變數相當于開辟一塊記憶體空間(馮·諾依曼體系中,這個所謂的記憶體空間就是記憶體儲器)來保存一些資料,

1.2.1 變數的作用域
本章針對的是區域變數的作用域,說明還有其他種類的變數,在類和物件的博客中會有詳細講解,到時候貼鏈接,大家敬請期待!!!
關于作用域完全和C語言的是一樣的,也就是該變數能生效的范圍, 一般是變數定義所在的代碼塊 (花括號)之內,
1.2.2 變數的命名規則(阿里巴巴開發手冊)

1.3 基本資料型別
型別是對變數的種類進行了劃分,不同型別的變數具有不同的特性(下圖是JAVA中的型別匯總),

注意:這里的默認值不是區域變數的默認值!!!
1.3.1 整型變數(重點)
基本語法格式:
int 變數名 = 初始值;
int a = 1;
取值范圍(寫下面的代碼可以直接看):
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);//int的最大值 列印出來是 2147483647
System.out.println(Integer.MIN_VALUE);//int的最小值 列印出來是 -2147483648
}//4個位元組(int型別)表示的資料范圍是 -2^31 -> 2^31-1 , 也就大概是 -21億 到 +21億,
}
// 這里的Integer大家可以認為是int的plus版本,術語叫做包裝類,后期會講到!
變數在定義的時候不初始化,可不可以?(看下圖就知道)
不可以,JAVA比較安全,如果不初始化就使用,編譯器會報錯,注意不是警告!!!

一個運算題:
int a = 1;
int b = 2;
System.out.println(a / b);//結果是 0
//Java中,int除以int的值仍然是int(會直接舍棄小數部分),如果想得到0.5, 需要使用double型別計算
//而且,JAVA中不存在截斷的情況,如
int a = 1.1;
//等號左邊是int型別,右邊是double型別,這樣是錯的!
注意:
- JAVA中的
int型別的大小不管作業系統是多少位的,都是4個位元組,
這一點說明JAVA的可移植性強(一次編譯,到處運行)! - JAVA中的
int型別沒有無符號型別,統一都是有符號的,所以第一位是符號位!
1.3.2 長整型變數
基本語法格式:
long 變數名 = 初始值;
long num = 10L; //定義一個長整型變數, 初始值寫作 10L 也可以 10l ,不是數字1
//建議使用大寫 L 做后綴
取值范圍(寫下面的代碼可以直接看):
public class Main {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
}//Java中 long型別 占8個位元組. 表示的資料范圍 -2^63 -> 2^63-1
}
注意:JAVA中沒有long long型別!
1.3.3 雙精度浮點型變數(重點)
基本語法格式:
double 變數名 = 初始值;
double num = 1.0;
一個問題:
double num = 1.1;
System.out.println(num * num);//看下圖

我們看到執行結果為1.2100000000000002,這是為什么?
其實在程式里,小數里是沒有精確的數字的,只能精確到前幾位(float只能精確到前6位),
注意:(關于資料的存盤,大家看我的這篇博客!)
-
Java中的
double型別雖然也是8個位元組,但是浮點數的記憶體布局和整數差別很大, 不能單純的用 2^n 的形式表示資料范圍! -
Java的
double型別的記憶體布局遵守IEEE 754標準(和C語言一樣), 嘗試使用有限的記憶體空間表示可能無限的小數, 勢必會存在一定的精度誤差!
1.3.4 單精度浮點型變數
基本格式:
float 變數名 = 初始值;
float num = 1.0f; // 寫成 1.0F 也可以
特別注意(錯誤演示):
float a = 1.2;//這樣初始化是錯的,系統會報錯!
//1.2默認是double型別,從double轉換到float可能會有損失!
//但是在C語言中最多一個警告!
//由此看出:JAVA是強型別語言,C語言是弱型別語言
所以:初始化的時候一定要加 l或者L!
float型別在Java中占四個位元組, 同樣遵守IEEE 754標準,由于表示的資料精度范圍較小,,一般在工程上用到浮點數都優先考慮double,不太推薦使用float!
1.3.5 字符型別變數
基本格式:
char 變數名 = 初始值;
char ch = 'A';
cahr ch2 = 97;//char型別初始化為97,列印出來是a!
//雖然初始化是整數,但是會決議成字符,計算機上的字符本質是一個整數!
//在C語言中使用ASCII表示字符, 而Java中使用Unicode表示字符(大家可以百度一下Unicode)!
字符型別的大小(上代碼):
char a = '你';
System.out.println(a);

上圖可以運行,但是注意漢字是兩個位元組的!
所以:JAVA中char型別是兩個位元組(C語言是一個位元組)!
但是,JAVA中使用漢字在執行javac的時候可能出現以下錯誤:

此時我們在執行javac時加上-encoding UTF-8即可編譯:

如果上面的操作沒整明白的話,我會單獨出一篇博客!
到時候貼鏈接,大家敬請期待!
1.3.6 位元組型別變數
基本語法格式:
byte 變數名 = 初始值;
byte a = 10;
注意:位元組型別表示的也是整數,只占一個位元組, 表示范圍較小 ( -128 -> +127 )
1.3.7 短整型變數
基本語法格式:
short 變數名 = 初始值;
short a = 10;
注意:short型別占用2個位元組, 表示的資料范圍是-2^15 -> 2^15-1( -32768 -> +32767),范圍比較小, 一般不推薦使用,
1.3.8 布爾型別變數
基本語法格式:
boolean 變數名 = 初始值;
boolean a = true;
boolean b = false;
那我們和C語言中的布爾型別做一下比較:
//C語言中 0表示假 非0表示真
//那在java中這樣初始化布爾型別可以嗎?
boolean a = 0;//這樣是錯的!
//Java中boolean只有兩個取值,要么是true,要么是false,不能有其他取值!
boolean value = true;
System.out.println(value + 1);//所以,這樣的代碼更不能寫了
布爾型別的大小:
在JVM的規范中,并沒有規定布爾型別的大小,有些書上說是一個bit(位元)位,有些書上說是一個(byte)位元組!
但是注意:當我們在刷題的時候,預見這樣的問題(如下)
假設有四個選項,讓你找出哪一個是對的?
技巧就是你看其他三項是不是明顯錯誤的,一旦有更適合的答案,就選它!
1.3.9 字串型別變數(重點)
String型別(字串型別)也叫參考型別,參考型別有很多(String、陣列、介面、類、列舉等),如何去判斷就要看它存盤的是不是地址(關于參考型別后期會寫到),
基本語法格式:
String 變數名 = "初始值";
String name = "daxiangzi";//把一些字符放到一起就構成了字串
字串相加:
System.out.println("daxiangzi");
System.out.println("da"+"xiangzi");
//這樣列印出來會是什么?

結果拼到一起了,所以這里的+加號有拼接的作用!
字串加數字:
System.out.println("hello"+10+20);//結果會是hello30嗎?

結果居然是hello1020,這是為什么?
原因就是:其他資料型別和字串型別使用+加號拼接,結果就是一個字串!
但是有特例:
System.out.println(10+20+"hello");//這樣子寫就是30hello

原因就是計算機在運算的時候從左往右算,然后拼接字串(hello)最后變成了新的字串(30hello) !
如果想要結果是hello30:
System.out.println("hello"+(10+20));//這樣寫即可,就是添加括號

想要結果是1020hello:
System.out.println(10+""+20+"hello");//中間加一個空字串即可

問一個問題:如果想輸出結果是"bit"要怎么辦?
這個時候就要用到轉義字符了
System.out.println("\"bit\"");

轉義字符有很多,其中常見的如下:

注意:''單引號引起的是字符,""雙引號引起的是字串(若干字符)!
2. 型別轉換及數值提升
2.1 型別轉換
Java作為一個強型別編程語言, 當不同型別之間的變數相互賦值的時候, 會有教嚴格的校驗(先看以下幾個代碼場景),
2.1.1 int 和 long/double 相互賦值
那我們直接上代碼:
int a = 10;
long b = a;//這樣寫是可以的,int(四個位元組)可以放到long(八位元組)里
System.out.println(b);
但是反過來就不行了
long p = 12;
int q = p;//這樣會報錯,型別不兼容,不能說是12不能放進int里
但是如果一定要放進去,就要強制型別轉換,這樣有可能損失精度(有風險)
int q = (int)p;
這里轉換double型別就是不舉例了,道理相同!
2.1.2 int 和 boolean 相互賦值
int a = 10;
boolean b = a;//型別不匹配直接報錯
boolean c = (boolean)a;//就算強制型別轉換也不行
同樣的boolean轉換int也是不行的!
2.1.3 int 和 String 之間的相互轉換
這個轉換比較特殊,直接上代碼(int轉換String):
int num = 10;
String ret = String.valueOf(num);//Java中可以直接呼叫方法把int轉換成String
System.out.println(ret);
還有一種方法:
System.out.println(num+"");//這樣也行,但是不可取
String轉int:
這里就要引入包裝類的好處了!
就是類里面有很多寫好的方法(函式),可以隨意呼叫!
String a = "123";
int ret = Integer.valueOf(a);//呼叫方法把int轉換成String
System.out.println(ret);
2.2 數值提升
所有的型別提升為了什么?
其實就是為了提升效率!
2.2.1 int 和 long 混合運算
int a = 10;
long b = 20;
int c = a + b;//這樣會報錯,為什么呢?
int c = (int)(a + b);//除非這樣強制型別轉換
long d = a + b;//編譯通過
當int和long混合運算的時候, int會提升成long, 得到的結果仍然是long型別, 需要使用long型別的變數來接收結果,如果非要用int來接收結果(型別不匹配報錯), 就需要使用強制型別轉換,
2.2.2 byte 和 byte 的運算
byte a = 1;
byte b = 2;
byte c = a + b;//表面上看著沒問題,但是會報錯
這里的byte是小于四個位元組的,對于CPU來說,運算的時候會發生整型提升,
所以,a和b 就是int型別,c是byte,型別不匹配就會報錯!
為了解決問題,就使用強制型別轉換,但有可能會損失精度!
byte c = (byte)(a + b);
System.out.println(c);
但是下面的代碼(不會報錯):
byte c2 = 1 + 2;//不會報錯
這是因為此時的1和2是整形的字面值常量,編譯的時候直接把1+2當作3了,使用字面值常量賦值的時候, Java會自動進行一些檢查校驗, 判定賦值是否合理,
最后特此強調:關于整形提升(隱式型別轉換),博主之前在【C語言初階】關于運算子的文章(在后面部分的運算式求值小節)里有詳細的講解,大家一定要去看!!!
全文結束
本來想寫的精簡一些的,但是發現我他喵本根精簡不起來!!!
一個資料型別就快一萬字了,不敢想象后期的類與物件的文章有多少!!!
希望大家多多支持點贊!!!
您的鼓勵就是我最大的動力!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342199.html
標籤:java
