藍橋杯Java_C組·從零開始卷】第一節、環境與變量類型&運算符與類型分析

      網友投稿 585 2025-03-31

      B站高清回放地址:

      【https://www.bilibili.com/video/BV1Bm4y1Q7Wt?spm_id_from=333.999.0.0】

      目錄

      一、Java環境搭建與使用(Eclipse——1.6JDK)

      二、主函數

      三、變量類型

      Java中簡基本數據類型的轉型:

      Java中的高精度數:

      四、運算符

      一元運算符(一元運算符有1個操作數)

      輸出【false】

      二元運算符(二元運算符有2個操作數)

      三元運算符(三元運算符有3個操作數)

      五、類型分析(堆棧)

      1. 棧(stack)與堆(heap)都是Java用來在Ram(隨機存取存儲器)中存放數據的地方。

      2. 棧的優勢是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。

      3. Java中的數據類型有兩種。

      4.String是一個特殊的包裝類數據。

      5. 關于String str = "abc"的內部工作。

      6. 數據類型包裝類的值不可修改。

      7. 結論與建議:

      一、Java環境搭建與使用(Eclipse——1.6JDK)

      -【https://download.csdn.net/download/feng8403000/69430455】·免費

      解壓即可用,非常方便。

      二、主函數

      基礎結構

      package Action;//包名 public class test {//類名 public static void main(String[] args) {//主函數 //花括號{}內是作用域 } }

      三、變量類型

      int:int為整數類型,存儲的時候,用4個字節存儲,范圍為-2,147,483,648到2,147,483,647,在變量初始化的時候,int類型的默認值為0。

      short:short也屬于整數類型,在存儲的時候,用2個字節存儲,范圍為-32,768到32,767,在變量初始化的時候,short類型的默認值為0,一般情況下,因為Java本身轉型的原因,可以直接寫為0。

      long:long也屬于整數類型,在存儲的時候,用8個字節存儲,范圍為-9,223,372,036,854,775,808到9,223,372,036,?854,775,807,在變量初始化的時候,long類型的默認值為0L或0l,也可直接寫為0。

      byte:byte同樣屬于整數類型,在存儲的時候,用1個字節來存儲,范圍為-128到127,在變量初始化的時候,byte類型的默認值也為0。

      float:float屬于實數類型,在存儲的時候,用4個字節來存儲,范圍為32位IEEEE?754單精度范圍,在變量初始化的時候,float的默認值為0.0f或0.0F,在初始化的時候可以寫0.0。

      double:double同樣屬于實數類型,在存儲的時候,用8個字節來存儲,范圍為64位IEEE?754雙精度范圍,在變量初始化的時候,double的默認值為0.0。

      char:char屬于字符類型,在存儲的時候用2個字節來存儲,因為Java本身的字符集不是用ASCII碼來進行存儲,是使用的16位Unicode字符集,它的字符范圍即是Unicode的字符范圍,在變量初始化的時候,char類型的默認值為'u0000'。

      boolean:boolean屬于布爾類型,在存儲的時候不使用字節,僅僅使用1位來存儲,范圍僅僅為0和1,其字面量為true和false,而boolean變量在初始化的時候變量的默認值為false。

      通過包裝類獲取其最大值與最小值:

      System.out.println(Byte.MAX_VALUE); System.out.println(Byte.MIN_VALUE); System.out.println(Short.MAX_VALUE); System.out.println(Short.MIN_VALUE); System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE);

      浮點數屬于科學計數法顯示。

      String:

      字符串類,顧名思義,就是操作字符串的類。可以用來存儲字符串。

      3)相關介紹:

      在Java基本類型在使用字面量賦值的時候,有幾個簡單的特性如下:

      【1】當整數類型的數據使用字面量賦值的時候,默認值為int類型,就是直接使用0或者其他數字的時候,值的類型為int類型,所以當使用long?a?=?0這種賦值方式的時候,JVM內部存在數據轉換。

      【2】當實數類型的數據使用字面量賦值的時候,默認值為double類型,就是當字面兩出現的時候,JVM會使用double類型的數據類型。???(*:以上兩點在轉型中進行詳細說明。)

      【3】從JDK?5.0開始,Java里面出現了自動拆箱解箱的操作,基于這點需要做一定的說明:

      對應原始的數據類型,每種數據類型都存在一個復雜類型的封裝類,分別為Boolean、Short、Float、Double、Byte、Int、Long、Character,這些類型都是內置的封裝類,這些封裝類(Wrapper)提供了很直觀的方法,針對封裝類需要說明的是,每種封裝類都有一個xxxValue()的方法,通過這種方法可以把它引用的對象里面的值轉化成為原始變量的值,不僅僅如此,每個封裝類都還存在一個valueOf(String)的方法直接把字符串對象轉換為相應的簡單類型。???在JDK?5.0之前,沒有存在自動拆解箱的操作,即Auto?Box操作,所以在這之前是不能使用以下方式的賦值代碼的:

      Integer?a?=?0;?//這種賦值方式不能夠在JDK?1.4以及以下的JDK編譯器中通過

      但是JDK?5.0出現了自動拆解箱的操作,所以在JDK?5.0以上的編譯器中,以上的代碼是可以通過的,關于自動拆箱解箱我會另外用一篇1.4到5.0的升級加以詳細說明。

      Java中簡基本數據類型的轉型:

      Java中的簡單數據類型的轉換分為兩種:自動轉換和強制轉換

      1)自動轉換:

      當一個較“小”的數據和較“大”的數據一起運算的時候,系統將自動將較“小”的數據轉換為較“大”的數據,再進行運算。

      在方法調用過程,如果實際參數較“小”,而函數的形參比較“大”的時候,除非有匹配的方法,否則會直接使用較“大”的形參函數進行調用。

      2)強制轉換:

      將“大”數據轉換為“小”數據時,可以使用強制類型轉換,在強制類型轉換的時候必須使用下邊這種語句:?int?a?=?(int)3.14;

      只是在上邊這種類型轉換的時候,有可能會出現精度損失。???關于類型的自動提升,遵循下邊的規則:???所有的byte、short、char類型的值將提升為int類型;???如果有一個操作數是long類型,計算結果是long類型;???如果有一個操作數是float類型,計算結果是float類型;

      如果有一個操作數是double類型,計算結果是double類型;

      自動類型轉換圖如下:

      byte->short(char)->int->long->float->double???如果是強制轉換的時候,就將上邊的圖反過來

      3)轉換附加:

      當兩個類型進行自動轉換的時候,需要滿足條件:

      【1】這兩種類型是兼容的,

      【2】目的類型的數值范圍應該比源轉換值的范圍要大。而拓展范圍就遵循上邊的自動類型轉換樹,當這兩個條件都滿足的時候,拓展轉換才會發生,而對于幾個原始類型轉換過程,根據兼容性boolean和char應該是獨立的,而其他六種類型是可以兼容的,在強制轉換過程,唯獨可能特殊的是char和int是可以轉換的,不過會使用char的ASCII碼值比如:?int?a?=?(int)'a';

      a的值在轉換過后輸出的話,值為97;也可以通過中文的char進行轉換int類型。

      Java中的高精度數:

      Java提供了兩個專門的類進行高精度運算:BigInteger與BigDecimal,雖然Java原始變量都具有對應的封裝類型,但是這兩個變量沒有對應的原始類型,而是通過方法來提供這兩種類型的一些運算,其含義為普通類型能夠做的操作,這兩個類型對應都有,只是因為精度過大可能效率不夠高。至于這兩個類的具體操作可以參考JDK的相關API文檔。

      關于數據類型的一些技巧:若要求精度的結果,盡量避免使用float和double:

      float和double類型本身是為了做科學運算,即執行二進制浮點運算而設計,但是卻不能提供完全精確的結果,所以在要求精度的數值中,避免使用float和double,float和double在貨幣運算中尤其不合適,要讓float和double精確表達0.1也是不可能的事。測試一下下邊這段代碼就明白了:

      System.out.println(3.02-0.01);

      結果是不是出乎意料,這個結果并不是偶然,而是JVM本身設計的目的決定的。而要解決這個問題,最好的辦法是使用BigDecimal、int或者long進行相關運算,特別是貨幣運算,使用BigDecimal代替double是一個很好的辦法。???BigDecimal唯一的缺點在于:BigDecimal沒有相對應的原始類型,所以在進行基本數值運算的時候,需要進行方法調用才能操作,這樣會使得和我們的編程習慣不相符合,若使用int和long,就需要進行簡單的封裝運算。

      所以在要求精度答案的計算任務里面,一般慎用float和double,如果在進行商務運算,并且要求四舍五入或者簡單的舍入行為,使用BigDecimal可能更加方便。所以盡量避免在精度運算中使用float和double,特別是我們常用的貨幣運算。

      四、運算符

      一元運算符(一元運算符有1個操作數)

      ++,- -都是運算符

      ++,- -可分為前+,后+和前-,后減

      【藍橋杯Java_C組·從零開始卷】第一節、環境與變量類型&運算符與類型分析

      如果++在后面,如:num++ +10;先參與運算,然后自身結果再加一

      如果++在前面,如:++num +10;先自身加一,然后再參與運算

      int num1=10; int num2=10; System.out.println(++num1); System.out.println(num2++);

      !非,對表達式取反

      !true=false

      System.out.println(!true);

      輸出【false】

      二元運算符(二元運算符有2個操作數)

      【+-*/】四則運算·簡單計算器

      【%】取模運算·對12345,做各位上的數組做累加運算。

      【&、|、&&、||、^】邏輯運算符·值交換·通過【&和|】判斷一百分制成績。

      int a=5;//101 int b=7;//111 a=a^b;//兩者不同量:010=2 System.out.println(a); b=a^b;//兩者不同:101 System.out.println(b); a=a^b;//再進行兩者不同取值:111 System.out.println(a);//二進制111 System.out.println(b);//二進制101

      三元運算符(三元運算符有3個操作數)

      三元運算符是軟件編程中的一個固定格式,語法是“條件表達式?表達式1:表達式2”。使用這個算法可以使調用數據時逐級篩選。

      表達式:“()? :”。

      ()中進行二元運算

      ?再運算,就形成三元運算符

      int x = 10; int y = 5; int z; //如果x大于y 則是true,將x賦值給z; //如果x不大于y 則是false,將y賦值給z; z = (x > y) ? x : y; System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("z = " + z);

      五、類型分析(堆棧)

      stack和haep都是內存的一部分

      stack空間小,速度比較快, 用來放對象的引用

      heap大,一般所有創建的對象都放在這里。

      棧(stack):是一個先進后出的數據結構,通常用于保存方法(函數)中的參數,局部變量.

      在java中,所有基本類型和引用類型都在棧中存儲.棧中數據的生存空間一般在當前scopes內(就是由{...}括起來的區域).

      堆(heap):是一個可動態申請的內存空間(其記錄空閑內存空間的鏈表由操作系統維護),C中的malloc語句所產生的內存空間就在堆中.

      在java中,所有使用new xxx()構造出來的對象都在堆中存儲,當垃圾回收器檢測到某對象未被引用,則自動銷毀該對象.所以,理論上說java中對象的生存空間是沒有限制的,只要有引用類型指向它,則它就可以在任意地方被使用.

      1. 棧(stack)與堆(heap)都是Java用來在Ram(隨機存取存儲器)中存放數據的地方。

      與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。

      2. 棧的優勢是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。

      但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享,詳見第3點。堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢。

      3. Java中的數據類型有兩種。

      一種是基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char(注意,并沒有string的基本類型)。這種類型的定義是通過諸如int a = 3; long b = 255L;的形式來定義的,稱為自動變量。值得注意的是,自動變量存的是字面值,不是類的實例,即不是類的引用,這里并沒有類的存在。如int a = 3; 這里的a是一個指向int類型的引用,指向3這個字面值。這些字面值的數據,由于大小可知,生存期可知(這些字面值固定定義在某個程序塊里面,程序塊退出后,字段值就消失了),出于追求速度的原因,就存在于棧中。

      另外,棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:

      int a = 3; int b = 3;

      編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找有沒有字面值為3的地址,沒找到,就開辟一個存放3這個字面值的地址,然后將a指向3的地址。接著處理int b = 3;在創建完b的引用變量后,由于在棧中已經有3這個字面值,便將b直接指向3的地址。

      這樣,就出現了a與b同時均指向3的情況。特別注意的是,這種字面值的引用與類對象的引用不同。

      假定兩個類對象的引用同時指向一個對象,如果一個對象引用變量修改了這個對象的內部狀態,那么另一個對象引用變量也即刻反映出這個變化。

      相反,通過字面值的引用來修改其值,不會導致另一個指向此字面值的引用的值也跟著改變的情況。

      如上例,我們定義完a與b的值后,再令a=4;那么,b不會等于4,還是等于3。在編譯器內部,遇到a=4;時,它就會重新搜索棧中是否有4的字面值,如果沒有,重新開辟地址存放4的值;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。

      另一種是包裝類數據,如Integer, String, Double等將相應的基本數據類型包裝起來的類。這些類數據全部存在于堆中,Java用new()語句來顯示地告訴編譯器,在運行時才根據需要動態創建,因此比較靈活,但缺點是要占用更多的時間。

      4.String是一個特殊的包裝類數據。

      即可以用String str = new String("abc");的形式來創建,也可以用String str = "abc";的形式來創建(作為對比,在JDK 5.0之前,你從未見過Integer i = 3;的表達式,因為類與字面值是不能通用的,除了String。而在JDK 5.0中,這種表達式是可以的!因為編譯器在后臺進行Integer i = new Integer(3)的轉換!)。

      前者是規范的類的創建過程,即在Java中,一切都是對象,而對象是類的實例,全部通過new()的形式來創建。Java中的有些類,如DateFormat類,可以通過該類的getInstance()方法來返回一個新創建的類,似乎違反了此原則。其實不然。該類運用了單例模式來返回類的實例,只不過這個實例是在該類內部通過new()來創建的,而getInstance()向外部隱藏了此細節。那為什么在String str = "abc";中,并沒有通過new()來創建實例,是不是違反了上述原則?其實沒有。

      5. 關于String str = "abc"的內部工作。

      Java內部將此語句轉化為以下幾個步驟:

      (1)先定義一個名為str的對String類的對象引用變量:String str;

      (2)在棧中查找有沒有存放值為"abc"的地址,如果沒有,則開辟一個存放字面值為"abc"的地址,接著創建一個新的String類的對象o,并將o的字符串值指向這個地址,而且在棧中這個地址旁邊記下這個引用的對象o。如果已經有了值為"abc"的地址,則查找對象o,并返回o的地址。

      (3)將str指向對象o的地址。

      值得注意的是,一般String類中字符串值都是直接存值的。但像String str = "abc";這種場合下,其字符串值卻是保存了一個指向存在棧中數據的引用!

      為了更好地說明這個問題,我們可以通過以下的幾個代碼進行驗證。

      String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); //true

      注意,我們這里并不用str1.equals(str2);的方式,因為這將比較兩個字符串的值是否相等。==號,根據JDK的說明,只有在兩個引用都指向了同一個對象時才返回真值。而我們在這里要看的是,str1與str2是否都指向了同一個對象。

      結果說明,JVM創建了兩個引用str1和str2,但只創建了一個對象,而且兩個引用都指向了這個對象。

      我們再來更進一步,將以上代碼改成:

      String str1 = "abc"; String str2 = "abc"; str1 = "bcd"; System.out.println(str1 + "," + str2); //bcd, abc System.out.println(str1==str2); //false

      這就是說,賦值的變化導致了類對象引用的變化,str1指向了另外一個新對象!而str2仍舊指向原來的對象。上例中,當我們將str1的值改為"bcd"時,JVM發現在棧中沒有存放該值的地址,便開辟了這個地址,并創建了一個新的對象,其字符串的值指向這個地址。

      事實上,String類被設計成為不可改變(final)的類。如果你要改變其值,可以,但JVM在運行時根據新值悄悄創建了一個新對象,然后將這個對象的地址返回給原來類的引用。這個創建過程雖說是完全自動進行的,但它畢竟占用了更多的時間。在對時間要求比較敏感的環境中,會帶有一定的不良影響。

      再修改原來代碼:

      String str1 = "abc"; String str2 = "abc"; str1 = "bcd"; String str3 = str1; System.out.println(str3); //bcd String str4 = "bcd"; System.out.println(str1 == str4); //true

      str3這個對象的引用直接指向str1所指向的對象(注意,str3并沒有創建新對象)。當str1改完其值后,再創建一個String的引用str4,并指向因str1修改值而創建的新的對象。可以發現,這回str4也沒有創建新的對象,從而再次實現棧中數據的共享。

      我們再接著看以下的代碼。

      String str1 = new String("abc"); String str2 = "abc"; System.out.println(str1==str2); //false

      創建了兩個引用。創建了兩個對象。兩個引用分別指向不同的兩個對象。

      String str1 = "abc"; String str2 = new String("abc"); System.out.println(str1==str2); //false

      創建了兩個引用。創建了兩個對象。兩個引用分別指向不同的兩個對象。

      以上兩段代碼說明,只要是用new()來新建對象的,都會在堆中創建,而且其字符串是單獨存值的,即使與棧中的數據相同,也不會與棧中的數據共享。

      6. 數據類型包裝類的值不可修改。

      不僅僅是String類的值不可修改,所有的數據類型包裝類都不能更改其內部的值。

      7. 結論與建議:

      (1)我們在使用諸如String str = "abc";的格式定義類時,總是想當然地認為,我們創建了String類的對象str。擔心陷阱!對象可能并沒有被創建!唯一可以肯定的是,指向String類的引用被創建了。至于這個引用到底是否指向了一個新的對象,必須根據上下文來考慮,除非你通過new()方法來顯要地創建一個新的對象。因此,更為準確的說法是,我們創建了一個指向String類的對象的引用變量str,這個對象引用變量指向了某個值為"abc"的String類。清醒地認識到這一點對排除程序中難以發現的bug是很有幫助的。

      (2)使用String str = "abc";的方式,可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對于String str = new String("abc");的代碼,則一概在堆中創建新對象,而不管其字符串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。

      (3)當比較包裝類里面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==。

      (4)由于String類的final性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。

      本節比較細致,希望能對大家有一定的幫助,祝大家藍橋都能拿一個好成績。

      Java 面向對象編程

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:word如何取消分隔符(怎樣取消word分隔符)
      下一篇:怎么發大目錄
      相關文章
      亚洲国产另类久久久精品小说| 亚洲av日韩av无码黑人| 久久久久亚洲AV成人片| av无码东京热亚洲男人的天堂| 亚洲av无码专区在线观看下载| 亚洲性无码一区二区三区| 久久亚洲国产最新网站| 亚洲fuli在线观看| 亚洲AV无码精品蜜桃| 亚洲精品亚洲人成在线播放| 亚洲精品韩国美女在线| 亚洲啪啪免费视频| 亚洲人成毛片线播放| avtt天堂网手机版亚洲| 亚洲看片无码在线视频| 亚洲日产乱码一二三区别| 亚洲成AV人影片在线观看| 麻豆亚洲AV成人无码久久精品 | 亚洲av无码成人影院一区| 久久亚洲精品无码gv| 在线观看亚洲电影| 亚洲高清免费视频| 国产亚洲色视频在线| 亚洲精品成人网站在线观看| 亚洲av无码av制服另类专区| 久久久久久久久亚洲 | 国产亚洲女在线线精品| 亚洲黄黄黄网站在线观看| 国产亚洲色婷婷久久99精品91| 久久亚洲精品中文字幕三区| 亚洲AV无码国产在丝袜线观看| 亚洲va在线va天堂va888www| 亚洲黄色一级毛片| 久久精品国产99国产精品亚洲 | 亚洲精品无码久久千人斩| 亚洲av日韩av激情亚洲| 亚洲国产av美女网站| 亚洲精品美女久久7777777| 亚洲精品无码久久久| 亚洲精品二区国产综合野狼| 亚洲视频在线观看地址|