Java基礎進階 基本類型包裝類

1、基本類型包裝類(掌握)

1.1、基本類型包裝類介紹

場景:通過文本框獲得用戶輸入的數字數據,因為文本框里面是書寫文本數據的,所以后臺得到的都是字符串。如果想要對字符串中的數字進行運算,必須將字符串轉換成數字。
怎么解決上述出現的問題呢?
Java中提供了相應的解決問題的對象。
基本數據類型包裝類:Java將基本數據類型值封裝成了對象。
封裝成對象有什么好處?
可以提供更多操作基本數據的功能。
java語言屬于一種面向對象的語言,會把真實存在的事物或信息都會進行描述并封裝為類。
在java中存在8種基本數據類型,而java語言也把這8種基本數據類型進行了封裝。稱為:包裝類。
學習Java語法基礎的時候,我們知道Java中有8種基本數據類型,這些數據類型可以在內存中開辟出對應類型的空間,然后可以保存對應類型的數據。
8種基本數據類型,它們僅僅只能規定空間的類型,而我們不能使用面向對象的方式去使用8種基本類型創建對象(newint();不能這樣去創建基本類型的對象)。
由于8種基本類型不能像類類型一樣去new對象,于是Java就對每種基本類型給出了一個對應的類類型。

而java語言也把這8種基本數據類型進行了封裝。稱為:包裝類。
8種基本類型: byte short int long float double char boolean
對應的包裝類型:Byte Short Integer Long Float Double Character Boolean

我們就可以使用這8種基本類型對應的類類型操作基本類型。
而這8個對應的包裝類型,都在java.lang包下。

2.2、基本類型包裝類演示

為什么要使用包裝類呢?
8種基本類型的數據只能:賦值、運算、取值。
把基本類型進行封裝后,就可以有更多的功能來操作基本類型數據。
基本類型包裝類,它們包裝的就是自己對應的某個基本類型。這樣我們就可以使用包裝類對象操作基本類型數據。


1.png

說明:字段摘要就是這個類中的成員變量。
所有的基本類型包裝類中都有構造函數,可以把自己對應的基本類型的值,變成對應的包裝類型對象中存放的那個數據。


2.png
package cn.xuexi.b_baozhuang_demo;
/*
 * 包裝類講解
 */
public class IntegerDemo {
    public static void main(String[] args) {
        //打印整數最大值和最小值
        System.out.println(Integer.MAX_VALUE);//最大值
        System.out.println(Integer.MIN_VALUE);//最小值
        //使用構造函數獲取包裝類對象
        //要求指定的字符串是數字字符串,否則會拋NumberFormatException異常
        Integer i = new Integer("123");
        //打印i的值
        System.out.println(i);
        //將十進制分別轉換為其他進制
        System.out.println(Integer.toBinaryString(60));//二進制
        System.out.println(Integer.toOctalString(60));//八進制
        System.out.println(Integer.toHexString(60));//十六進制
    }
}

基本類型包裝類:
把基本類型的數據包裝成對象,然后提供更多的函數可以完成對基本數據的操作。

2.3、基本類型數據和包裝類之間轉換(掌握)

學習基本類型包裝類:
1、把基本類型怎么轉成對應的包裝類型
2、把包裝類型怎么轉成基本類型
3、包裝類型和字符串之間的轉換
4、基本數據和字符串之間的轉換

把基本類型怎么轉成對應的包裝類型:
1、可以通過對應的包裝類的構造函數完成。

3.png

2、包裝類中提供的靜態函數:


4.png

需求:
1)定義一個DoubleDemo類,在這個類中定義一個double類型的變量d并賦值為123.12;
2)通過構造函數Double()將d轉換為對應的包裝類型d1,打印d1的值;
3)也可以使用Double類名調用valueOf()函數將變量d轉換為包裝類型d2,打印d2;

package cn.xuexi.b_baozhuang_demo;
public class DoubleDemo {
    public static void main(String[] args) {
        //定義一個double類型的數據
        double d=123.12;
        //1.通過構造函數把基本數據類型轉換為對應的包裝類型
        Double d1 = new Double(d);
        System.out.println(d1);
        //2.使用包裝類中的靜態方法來完成
        Double d2 = Double.valueOf(d);
        System.out.println(d2);
    }
}

把包裝類型怎么轉成基本類型
只能使用包裝類中提供的函數。
xxxxValue方法。可以把對應的包裝類型轉成基本類型數據

5.png

2.4、字符串和基本類型數據、包裝類型轉換

包裝類和字符串之間的轉換
1、包裝類轉成字符串:
使用包裝類中的toString方法完成

6.png

2、字符串轉成包裝類:
a) 可以通過包裝類的構造函數完成。


7.png

b) 使用包裝類中的valueOf方法


8.png

基本類型轉字符串
1、可以直接使用+號
2、使用String類中的valueOf

9.png

3、使用對應的包裝類中重載的toString方法


10.png

11.png

字符串轉基本數據類型(開發中經常用)
字符串轉成基本類型使用包裝類中的parseXxxx方法。

12.png

13.png

注意:
1)后期學習中遇到和parse相關的函數,都是把字符串解析成其他的數據。
2)使用parseXxxx方法把一個字符串轉成基本數據類型的時候,前提是這個字符串一定能夠被轉成對應的基本類型,否則會發生NumberFormatException異常。
根據查看API我們得知,如果轉換不了會發生異常,所以在開發中如果使用上述方法將字符串轉換為基本數據類型,需要對轉換的代碼進行捕獲異常處理。


14.png

15.png

2.5、jdk5的自動裝箱和拆箱
jdk5之前,需要把基本類型賦值給對應的包裝類型,需要使用包裝類型的構造函數,或者valueOf方法完成。
sun公司發現這樣寫比較麻煩,于是在在JDK5后給出了自動裝箱的機制:
自動裝箱:可以直接把一個基本類型的數據賦值給自己對應的包裝類型。
自動拆箱:可以直接把一個包裝類型的數據賦值給自己對應的基本類型。

package cn.xuexi.b_baozhuang_demo;
/*
 * 自動裝箱和拆箱
 */
public class Demo1 {
    public static void main(String[] args) {
        //定義一個int類型數據
        int x=123;
        //使用jdk5以前辦法將基本數據x變成包裝類型
        Integer i = new Integer(x);
        Integer i1 = Integer.valueOf(x);
        //jdk5自動裝箱
        //先把int類型數據x包裝成Integer對象,然后把對象的內存地址放到i2變量中
        //在底層其實就是執行Integer.valueOf(x)這句話
        Integer i2=x;
        //jdk5的自動拆箱
        int z=i.intValue(); 
        //根據i引用變量空間中的地址找到對應的基本數據類型,保存在y變量空間中
        int y=i;
    }
}

說明:
1)Integer i2=x;

          先把int類型數據x包裝成Integer對象,然后把對象的內存地址放到i2變量中,
          在底層其實就是執行Integer.valueOf(x)這句話。

2)int y = i;
根據i引用變量空間中的地址找到對應的基本數據類型,保存在y變量空間中。
在底層其實就是執行i.intValue()這句話。

3、JDK5的特性

3.1、靜態導入(了解)

當我們在程序中需要使用某個類的時候,如果這個類不在當前的包中,通常情況下,我們需要導入這個類。
如果我們要使用當前這個類中的函數或屬性都是靜態的,這時可以在導入包的時候把這些靜態的內容提前導入進來。
靜態導入:在程序中,會遇到一些靜態的方法、靜態變量,當要使用靜態成員時,就需要使用類名訪問。而使用了靜態導入后,就可以在書寫上省略類名

靜態導入的格式:
import static 包名.靜態類.靜態成員;


16.png

3.2、可變參數

需求:計算兩個數值相加
計算三個數值相加
計算四個數值相加


17.png

使用以上方案解決,存在:程序的擴展性差的問題(如果再有一個計算5個值相加的功能,還要再書寫一個函數)

現象:有時定義函數的時候,需要根據用戶傳遞的參數的個數來決定到底我們定義函數上參數的個數。而不是自己直接在函數上就把參數的個數寫死。這種問題就可以使用可變參數來解決。
可變參數:它主要針對的是程序員定義函數的時候,參數列表而言。
格式:修飾符 返回值類型 函數名( 可變參數 ){
}
可變參數:參數類型…變量名
說明:其實可變參數上定義的變量名就是一個數組名,我們在函數中就可以以數組的方式操作傳遞進來的所有數據,在這里相當于對數組進行求和。

/*
 * 可變參數講解
 * 需求:計算兩個數值相加
      計算三個數值相加
      計算四個數值相加
 */
public class Demo3 {

    public static void main(String[] args) {
        //調用自定義函數計算和值
        int sum=add(1,7);
        int sum1=add(1,7,4);
        int sum2=add(1,7,8,9);
        System.out.println(sum);
        System.out.println(sum1);
        System.out.println(sum2);
    }
    //使用可變參數可以接收不確定個數的數據
    public static int add(int ... num) {
        /*
         * 其實可變參數上定義的變量名就是一個數組名
         * 我們在函數中就可以以數組的方式操作傳遞進來的所有數據
         * 在這里相當于對數組進行求和
         */
        //定義一個變量接收數組中所有數據的和
        int sum=0;
        for (int i = 0; i < num.length; i++) {
            sum=sum+num[i];
        }
        return sum;
    }
    /*public static int add(int i, int j, int k, int l) {
        // TODO Auto-generated method stub
        return i+j+k+l;
    }*/

    /*public static int add(int i, int j, int k) {
        // TODO Auto-generated method stub
        return i+j+k;
    }*/

    /*public static int add(int i, int j) {
        // TODO Auto-generated method stub
        return i+j;
    }*/
}

結論:可變參數的底層其實還是使用數組。
在使用可變參數時,需要注意兩個地方:
1)當函數中除了有可變參數外,還需要其它的參數時,必須把可變參數書寫在函數中參數列表的最后面。

18.png

說明:因為第一個參數是可變參數,可以接收傳遞過來的所有參數,第二個參數就變得沒有意義了。

錯誤:
19.png

正確:
20.png

2)在一個類中,如果已經存在了帶有可變參數的函數,該類中就不能再存在另一個相同名稱的帶有數組參數的函數(參數列表不相同可以同時存在,以重載的方式存在)。


21.png

3.3、foreach循環(掌握)

foreach循環,也稱為高級for循環或者叫做增強for循環。它可以簡化普通的for循環。foreach 不能完全代替普通的for循環。
普通for循環的格式:
for( 循環初始化; 循環條件 ; 修改循環條件 ){
循環體
}

foreach循環:
for( 數組或集合中元素的類型 變量名 : 數組名或集合名 ){
//變量名所指的空間中,保存的是從數組或者集合中取出的數據
}

舉例:

定義int類型的數組:
int[] arr={-1,4,0,79};
for(  int  x  :  arr  ){
//變量名x所指的空間中,保存的是從數組或者集合中取出的數據
} 

foreach循環它僅僅只能用來完成遍歷,不能對操作的數組或集合中的數據進行修改操作。


22.png

注意:高級for循環只能用在遍歷數組或者集合上。不能對數組或者集合中的數據進行修改。

4、其他常用類介紹

4.1、System類(掌握)

23.png

通過查閱API,可以得到:

1)System類,它是描述和系統相關的信息的,并且是一個最終的類。System類不能被繼承。
2)System類不能創建對象。
3)System類中的成員全部都是靜態的。


24.png
25.png

System類中的常用方法:
1、currentTimeMilllis()方法的作用:


26.png

1)獲取當前系統時間的毫秒值。
2)在開發中,用來計算程序中功能的執行時間。


27.png

2、 System.exit(0);終止JVM運行 (開發中不建議使用);


28.png

3、重要


29.png

說明:
1)getProperties()表示獲取所有的系統屬性信息;
說明:jvm虛擬機安裝在了不同的平臺上,比如Windows平臺,jvm通常會獲取Windows自身的一些信息 來為Java程序提供方便,因為程序最終要基于jvm虛擬機跑在windows平臺上。所以,對于Java程 序而言必須得需要了解下Windows下都有哪些東西,因為Linux和Windows系統平臺是不一樣的。
而getProperties()就能獲取到當前系統的一些相關的信息,這些信息有些是我們能夠用到的,而且很實 用。

需求:獲取系統中所有的屬性信息。
代碼如下所示:


30.png

上述函數是獲取系統中所有的屬性信息,那么我要想獲取指定的信息,該怎么辦呢?
比如:我想獲得當前操作系統的用戶的賬戶名稱。這時可以使用如下函數:

2)getProperty(Stringkey) 表示根據系統屬性信息的名稱獲取相應的信息;
其實就是根據參數中的key獲取對應的value值,這個key可以理解為變量名,然獲取變量值。

代碼如下所示:


31.png

需求:實現跨平臺換行。
比如將一個字符串 “hello我的世界” 使用輸出語句輸出到控制臺上,但是要求這兩個字符串換行輸出,即
輸出結果應該是:
hello
上海上海
分析:我們都知道在windows系統中換行符號是 \r\n ,只不過在eclipse控制臺中也支持 \n 。 但是在windows系統中的很多軟件中,比如記事本只支持 \r\n ,不支持 \n 。但是這只是在windows系統中,在其他的系統中不能被識別。
所以得出一個結論:原來在不同的操作系統中,換行符是不一樣的。
那么要想在任何系統中都實現換行,怎么辦呢?
在Java中的System類中提供了一個函數就是getProperty(String key) ,然后line.separator作為參數進行獲取當前系統中的換行符。
代碼如下所示:

32.png

說明:上面的程序拿到任何的系統中都可以實現跨平臺了。
總結:找和系統相關的就要使用System類。

4.2、Math類

Math類:用來描述和數學相關的一些信息。Math類中方法全部都是靜態方法。


33 .png

說明:
1)Math類不能有子類;
2)Math類不能被創建對象;
Math類中常用的函數:
1)abs():返回一個數的絕對值;
2)ceil():返回比指定數大的最小整數,返回值類型是double;
3)floor():返回比指定數小的最大整數,返回值類型是double;
4)round():返回四舍五入的數,返回值類型是int;
5)random():生成大于等于 0.0 且小于 1.0 的隨機 double類型的值

/*
 * Math類的演示
 */
public class MathDemo {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(Math.E);
        System.out.println(Math.PI);
        System.out.println(Math.abs(-3));//返回一個數的絕對值
        System.out.println(Math.ceil(4.123));//返回比指定數大的最小整數
        System.out.println(Math.floor(4.567));//返回比指定數小的最大整數
        System.out.println(Math.round(4.367));//返回四舍五入的數
        System.out.println(Math.random());//生成大于等于 0.0 且小于 1.0 的隨機 double類型的值。
    }
}

4.3、Random類(理解)

34.jpg

Random類可以幫助我們產生一個隨機數。

35.png

Random類中的函數代碼演示:

/*
 * Random類說明
 */
public class RandomDemo {
    public static void main(String[] args) {
        //創建Random類的對象
        Random r=new Random();
        //函數演示
        System.out.println(r.nextInt());//生成一個在int范圍之內的隨機數
        System.out.println(r.nextInt(100));//生成一個大于等于零小于100之間的隨機數
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容