Java基礎(chǔ)02_變量_數(shù)據(jù)類型_類型轉(zhuǎn)換_運(yùn)算符

主要內(nèi)容

  • 變量
  • Java數(shù)據(jù)類型
  • Java數(shù)據(jù)類型轉(zhuǎn)換
  • 運(yùn)算符

學(xué)習(xí)目標(biāo)

  • 掌握變量的定義、初始化、使用及注意事項(xiàng)
  • 掌握J(rèn)ava基本數(shù)據(jù)類型的使用(4類8種)
  • 掌握數(shù)據(jù)類型的轉(zhuǎn)換及其中的注意事項(xiàng)

第一節(jié) 變量

1.1 概念

? 變量: 程序運(yùn)行時(shí)候可以變化的量.

? 思考過(guò)沒(méi)有, 變量用來(lái)干什么?

? 答案: 變量本質(zhì)就是對(duì)"實(shí)際量"的一個(gè)指代, 就是一個(gè)代詞. 和我們?cè)跀?shù)學(xué)中見(jiàn)到的函數(shù)變量一樣, 函數(shù)的本質(zhì)是因變量隨著自變量的變化而變化, 所以使用x,y之類的變量來(lái)表示這個(gè)變化的數(shù); 編程中的變量也是同樣道理.

1.2 變量的定義

? 概述: 在使用變量之前, 我們首先要在程序中告訴機(jī)器, 給我們創(chuàng)建一個(gè)什么類型的變量, 這個(gè)聲明的過(guò)程也叫做變量的定義.

? 方式1(定義并初始化變量):

? 數(shù)據(jù)類型 變量名 = 值;

    public static void main(String[] args){
        System.out.println("定義變量的方式1: ");

        //定義一個(gè)字符串類型的變量
        String studentName = "小馬哥";

        //定義一個(gè)整形變量
        int stuAge = 30;
    }

? 方式2(先定義變量, 用的時(shí)候再初始化):

? 數(shù)據(jù)類型 變量名;

? 變量名 = 值;

    public static void main(String[] args){
        System.out.println("定義變量的方式2: ");
        
        //定義一個(gè)字符串類型的變量
        String studentName;         
        //定義一個(gè)整形變量
        int stuAge;       

        /*
        其它代碼
        */
        
        //變量初始化
        stuAge = 30;
        studentName = "小馬哥";
    }

1.3 變量的使用

變量定義和初始化的目的是為了使用的, 如何使用呢? 直接調(diào)用變量的名字.

//使用"定義并初始化"之后的變量: 打印
System.out.println("學(xué)員姓名: "+studentName);
System.out.println("學(xué)員年齡: "+stuAge);

1.4 注意事項(xiàng)

學(xué)習(xí)提示: 以下各個(gè)注意事項(xiàng), 先自己測(cè)試思考總結(jié)到你自己的筆記上, 然后對(duì)比講義的實(shí)驗(yàn)結(jié)果.

  • 1,變量使用之前,必須初始化;
  • 2,使用變量的時(shí)候,必須有這個(gè)變量;
  • 3,變量在相同的作用域下不能重名;
  • 4,在不同的作用域中,變量不能互相使用
  • 5,變量可以同時(shí)定義,但是初始化賦值只能單獨(dú)的

代碼演示:

試驗(yàn)1: 使用變量前, 不進(jìn)行初始化的后果

public class Demo03_warning1{
    public static void main(String[] args){
//      1,變量使用之前,必須初始化;
        String name;
        System.out.println(name);
    }
}

? 運(yùn)行結(jié)果:

D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning1.java
Demo03_warning1.java:5: 錯(cuò)誤: 可能尚未初始化變量name
                System.out.println(name);
                                   ^
1 個(gè)錯(cuò)誤

? 結(jié)果解釋:

? Demo03_warning1.java:5: 錯(cuò)誤: 可能尚未初始化變量name

? 代表在 Demo03_warning1.java 文件的第 5 行代碼出現(xiàn)錯(cuò)誤

試驗(yàn)2: 使用變量之前, 沒(méi)有定義變量的結(jié)果

public class Demo03_warning2{
    public static void main(String[] args){
        //2,使用變量的時(shí)候,必須有這個(gè)變量;
        System.out.println(studentName);
        System.out.println(contry);
    }
}

? 運(yùn)行結(jié)果:

Demo03_warning2.java:3: 錯(cuò)誤: 找不到符號(hào)
                System.out.println(studentName);
                                   ^
  符號(hào):   變量 studentName
  位置: 類 Demo03_warning2
Demo03_warning2.java:4: 錯(cuò)誤: 找不到符號(hào)
                System.out.println(contry);
                                   ^
  符號(hào):   變量 contry
  位置: 類 Demo03_warning2
2 個(gè)錯(cuò)誤

試驗(yàn)3: 變量在相同的作用域下不能重名;(定義多個(gè)重名變量試試)

public class Demo03_warning3{
    public static void main(String[] args){
        //3, 測(cè)試定義重復(fù)的變量
        int age = 10;
        int age = 100;
        System.out.println(age);
    }
}

? 運(yùn)行結(jié)果:

D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning3.java
Demo03_warning3.java:4: 錯(cuò)誤: 已在方法 main(String[])中定義了變量 age
                int age = 100;
                    ^
1 個(gè)錯(cuò)誤

試驗(yàn)4: 當(dāng)前作用域無(wú)法使用其它作用域內(nèi)的變量

public class Demo3_warning4{
    public static void main(String[] args){
//      4,在不同的作用域中,變量不能互相使用
        {
            //Block1中定義一個(gè)變量
            String strInBlock1 = "hello java";
        }
        {
            //Block2中是否可以使用
            System.out.println(strInBlock1);
        }
    }
}

? 運(yùn)行結(jié)果:

D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning4.java
Demo03_warning4.java:10: 錯(cuò)誤: 找不到符號(hào)
                        System.out.println(strInBlock1);
                                           ^
  符號(hào):   變量 strInBlock1
  位置: 類 Demo03_warning4
1 個(gè)錯(cuò)誤

試驗(yàn)5: 變量可以同時(shí)定義,但是初始化賦值只能單獨(dú)的

public class Demo03_warning5{
    public static void main(String[] args){
        
        //方式1: 一行定義并初始化多個(gè)變量
        int x2=10,y2=20,z2=30;

        //方式2: 定義和初始化分開(kāi)
        //1,定義多個(gè)變量一行定義多個(gè)變量
        int x1,y1,z1;
        //2,分別初始化多個(gè)變量
        x1=10;y1=20;z1=30; //寫(xiě)在一行和不寫(xiě)在一行沒(méi)區(qū)別, 有分號(hào)就相當(dāng)于分在三行.

        //錯(cuò)誤的寫(xiě)法: 但是不能如下這樣
        int x3,y3,z3 = 10,20,30;
    }
}

? 運(yùn)行結(jié)果

D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo03_warning5.java
Demo03_warning5.java:14: 錯(cuò)誤: 需要<標(biāo)識(shí)符>
                int x3,y3,z3 = 10,20,30;
                                  ^
1 個(gè)錯(cuò)誤

第二節(jié) Java數(shù)據(jù)類型

2.1 概述

? 有沒(méi)有想過(guò)一個(gè)問(wèn)題: 程序在內(nèi)存中運(yùn)行的時(shí)候, CPU處理的所有數(shù)據(jù)都統(tǒng)一成一種類型不可以嗎? 為什么要給數(shù)據(jù)劃分類型? 為什么還要?jiǎng)澐殖苫镜? 復(fù)雜的多種類型呢?

? 答案: 如果幾百個(gè)G的數(shù)據(jù)到加載到內(nèi)存中, 還有可能實(shí)現(xiàn), 幾百個(gè)TB或者幾百個(gè)PB的數(shù)據(jù)呢? 所以, 內(nèi)存永遠(yuǎn)是不夠大的, 針對(duì)不同的數(shù)據(jù)分配不同大小的內(nèi)存空間, 實(shí)際是為了節(jié)省內(nèi)存空間. 這個(gè)不同大小的空間體現(xiàn)在你寫(xiě)程序的時(shí)候, 就是不同的數(shù)據(jù)類型.

2.2 變量種類

    • 基本數(shù)據(jù)類型: (四類,八種)

      • 整形 byte(1), short(2), int(4), long(8) 默認(rèn)類型int類型
      • 浮點(diǎn)型 float(4), double(8) 默認(rèn)類型double類型
      • 字符型 char(2)
      • 布爾型 boolean(1)
    • 復(fù)雜數(shù)據(jù)類型, 引用數(shù)據(jù)類型:

      • 數(shù)組,字符串
      • 接口
  • 操作: 練習(xí)定義并使用各種類型的變量

2.3 注意事項(xiàng)

? 1, 整形數(shù)據(jù)類型默認(rèn)為int類型

? 2, 浮點(diǎn)型的數(shù)據(jù)類型默認(rèn)為double類型

在定義long型的時(shí)候,想要表示long型,那么值后面加一個(gè)字母l或者L

在定義float型的時(shí)候,為了表示float型,那么值后面加一個(gè)字母f或者F

第三節(jié) Java數(shù)據(jù)類型轉(zhuǎn)換

3.1 概述

? 為什么要進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換?

? 直觀來(lái)看, 進(jìn)行一個(gè)賦值操作 int num = 3.14;發(fā)現(xiàn)賦值運(yùn)算符=兩邊的數(shù)據(jù)類型的不統(tǒng)一的. 一個(gè)是int另外一個(gè)是float.計(jì)算機(jī)要如何操作呢, 罷工嗎?

? 遇到兩邊取值范圍(本質(zhì)上是兩種類型的數(shù)據(jù)占用內(nèi)存空間不一樣大), Java定義了兩種類型轉(zhuǎn)換的方式.

3.2 類型轉(zhuǎn)換的種類

  • ? 自動(dòng)類型轉(zhuǎn)換

    也被稱作隱式類型轉(zhuǎn)換, 由Java自動(dòng)完成, 條件是賦值運(yùn)算符的左邊為大范圍類型, 右邊是小范圍類型

    語(yǔ)法格式: 大類型 變量名 = 小類型;

    // java會(huì)自動(dòng)將10這個(gè)int常量轉(zhuǎn)換為long類型賦值給amount變量
    long amount = 10;       //左邊是long類型, 右邊是int類型
    //long amount = 10L;    //常量使用L結(jié)尾標(biāo)識(shí)后, 這樣才是兩邊數(shù)據(jù)類型一致
    
    // java會(huì)自動(dòng)將100這個(gè)int常量轉(zhuǎn)換為float類型賦值給number變量
    float number = 100;     //左邊是float類型, 右邊是int類型
    //float number = 100F;  //常量使用F結(jié)尾標(biāo)識(shí)后, 代表這是一個(gè)float型常量, 兩邊數(shù)據(jù)類型一致
    
  • ? 強(qiáng)制類型轉(zhuǎn)換

    上面是將小數(shù)據(jù)范圍的數(shù)賦值給大數(shù)據(jù)范圍的變量, 沒(méi)有什么數(shù)值損失, 反之呢?這就需要我們程序員強(qiáng)制轉(zhuǎn)換了, java不會(huì)自動(dòng)承擔(dān)這個(gè)類型轉(zhuǎn)換帶來(lái)的后果. 于是強(qiáng)制轉(zhuǎn)換需要我們程序員明確操作.

    語(yǔ)法格式: 小數(shù)據(jù)類型 變量名 = (小數(shù)據(jù)范圍類型) 大數(shù)據(jù)類型范圍的數(shù)據(jù)

    首先測(cè)試, 程序員不采取任何操作什么現(xiàn)象

    public class Demo04_dataType2{
        public static void main(String[] args){
            //大范圍的float類型常量3.14,賦值給小范圍的變量number
            int number = 3.14F;
        }
    }
    

    運(yùn)行結(jié)果: 不兼容的類型: 從float轉(zhuǎn)換到int可能會(huì)有損失這就是前面說(shuō)的, java不給你承擔(dān)損失, 拋出錯(cuò)誤.

    D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo04_dataType2.java
    Demo04_dataType2.java:4: 錯(cuò)誤: 不兼容的類型: 從float轉(zhuǎn)換到int可能會(huì)有損失
                    int number = 3.14F;
                                 ^
    1 個(gè)錯(cuò)誤
    

    正確的方式

    public class Demo04_dataType2{
        public static void main(String[] args){
            //大范圍的float類型常量3.14,賦值給小范圍的變量number
            int number = (int)3.14F;
            System.out.println(number);
        }
    }
    

    運(yùn)行結(jié)果

    D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>javac Demo04_dataType2.java
    
    D:\OnlineEdu\Task02 數(shù)據(jù)類型 運(yùn)算符\code>java Demo04_dataType2
    3
    

    結(jié)果解析: 經(jīng)過(guò)強(qiáng)制類型轉(zhuǎn)換, java會(huì)確定程序員對(duì)精度損失的結(jié)果是有考慮的.

3.3 注意事項(xiàng)

? 1, 一般不要輕易使用強(qiáng)制類型轉(zhuǎn)換(除非避免不了),因?yàn)闀?huì)出現(xiàn)精度損失,數(shù)據(jù)溢出.

? 2, 特別注意: byte,short,char參加算術(shù)運(yùn)算, 但是在沒(méi)有超范圍的情況下,會(huì)首先被提升為int

? byte num1 = 10;

? byte num2 = 20;

? byte sum = num1+num2

? 這里第三行會(huì)出現(xiàn)問(wèn)題: 首先num1+num2的時(shí)候會(huì)自動(dòng)提升為int類型

? char a = 'A'

? 當(dāng)char類型參加運(yùn)算的時(shí)候,會(huì)去ASCII碼表中,尋找char類型數(shù)據(jù)對(duì)應(yīng)的整數(shù)

字符碼表是什么?

ASCII碼表

? 美國(guó)人整的,每個(gè)字符都對(duì)應(yīng)了一個(gè)整數(shù),128個(gè)字符表示

UNICODE碼表:萬(wàn)國(guó)碼表,包含了所有國(guó)家的字符

注意: char數(shù)據(jù)類型在運(yùn)算時(shí)候會(huì)被自動(dòng)轉(zhuǎn)換為int,再去參加運(yùn)算

第四節(jié) 運(yùn)算符

4.1 種類

? 算術(shù)運(yùn)算符、賦值運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符、三目運(yùn)算符

4.2 算術(shù)運(yùn)算符

種類 符號(hào) 舉例
+ 1+1, num1+num2 (除去加法這種算術(shù)運(yùn)算, 還用來(lái)做字符串拼接)
- 2-1, num1- num2
* 10 * 10, num1 * num2
/ 101 / 10, num1 / num2 (作用保留整數(shù)部分, 除數(shù)不能為0)
求余取模 % 101 % 10 , num1 % num2 (作用求余數(shù))
自加 ++i 變量++i ( 作用先自加1, 再參與運(yùn)算 )
自減 --i 變量 --i ( 作用先自減1, 再參與運(yùn)算 )
自加 i++ 變量 i++ ( 作用先參與其它運(yùn)算, 后自加1 )
自減 i-- 變量 i-- ( 作用先參與其它運(yùn)算, 后自減1 )

注意:

? 1, 自加自減

? 2, 字符串與其它數(shù)據(jù)類型的拼接運(yùn)算

4.3 賦值運(yùn)算符

分類: 1, 基本賦值; 2, 復(fù)合賦值.

種類 符號(hào) 舉例
基本賦值 = num = 100;
加賦值 += num += 1; 等價(jià)于 num = num +1;
減賦值 -= num -= 10; 等價(jià)于 num = num -10;
乘賦值 *= num *= 5; 等價(jià)于 num = num * 5
除賦值 /= num /= 10; 等價(jià)于 num = num /10;
模賦值 %= num %= 10; 等價(jià)于 num = num %10;

注意:

? byte,short,char在參與運(yùn)算的時(shí)候,會(huì)被提升為int類型

? byte num1 = 125;

? byte num2 = 125;

? byte result = 0;

? result = num1+num2;

? System.out.println(result);

? 倒數(shù)第二行就會(huì)出現(xiàn)錯(cuò)誤: 不兼容的類型: 從int轉(zhuǎn)換到byte可能會(huì)有損失

? 但是在復(fù)合賦值中:byte,short,char在參與運(yùn)算的時(shí)候,不用程序員手動(dòng)強(qiáng)制類型轉(zhuǎn)換

4.4 比較運(yùn)算符

作用: 如果比較的結(jié)果為真, 返回true; 反之結(jié)果返回false.

種類 符號(hào) 舉例
相等比較 ==
大于比較 >
小于比較 <
大于等于比較 >=
小于等于比較 <=
不等比較 !=

4.5 邏輯運(yùn)算符

種類 符號(hào) 舉例
短路與 && i>0 && i<100 作用: 如果與判斷左邊為false, 右邊不做判斷
短路或 || gender=="男" || age<35 作用: 如果與判斷左邊為true, 右邊不做判斷
! ! true, !(name==null) 作用: !true=false; !false = true
& i>0 & i<100 作用: 無(wú)論左邊是true還是false, 都計(jì)算右邊
| gender=="男"| age<35 作用: 無(wú)論左邊是true還是false, 都計(jì)算右邊

4.6 三目運(yùn)算符

語(yǔ)法: 布爾表達(dá)式?表達(dá)式1:表達(dá)式2

流程:

? 計(jì)算布爾表達(dá)式的邏輯值

? 如果是true,執(zhí)行表達(dá)式1;

? 如果是false,執(zhí)行表達(dá)式2

例子: 判斷分?jǐn)?shù)是否及格?

int score = 100;
String result = score>=60 ? "及格" : "不及格";
System.out.println(result);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容