最近一段時間忙著學習JAVA,本來net學的也不怎么好,趁著這個機會轉下方向學習JAVA。不過.NET core的開源還是有點搞頭的,微軟了解一下。接下來幾天我也會陸續寫一些內容關于線程和集合等方面,現在讓我來講一下類型轉換的內容吧。衍生知識:1.基本類型比較用== 而對象比較用equals 如果改寫了equals 那么也要順便改寫hascode 別問為什么,只是習慣。 equals是比較引用是否指向一個對象 hasCode是返回對象地址。2.System.out.println(對象); println方法里默認調用了toString() 而toString()默認是返回對象的完整類名+@+地址。有些對象會改寫toString()比如ArraysList對象的toString()就是輸出數組的每一個元素外加[]3.當 "=="運算符的兩個操作數都是 包裝器類型的引用,則是比較指向的是否是同一個對象,而如果其中有一個操作數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程)5.基本數據類型在被創建時,在棧上給其劃分一塊內存,將數值直接存儲在棧上;引用數據類型在被床架時,首先要在棧上給其引用(句柄)分配一塊內存,而對象的具體信息都存儲 在堆內存上,然后由棧上面的引用指向堆中對象、6.基礎數據類型的比較只能使用==號,比的是數據的值,而不能使用equals;引用類型兩個都可以,當使用 ==比較的是內存地址,使用equals比較的是堆內存里面的內容 7.不能把對象類型轉換成不相關類的對象。 8.只有double和float的自動裝箱代碼沒有使用緩存,每次都是new 新的對象,其它的6種基本類 型都使用了緩存策略。?使用緩存策略是因為,緩存的這些對象都是經常使用到的(如字符、-128至
??? 127之間的數字),防止每次自動裝箱都創建一次對象的實例。 ???? 而double、float是浮點型的,沒有特別的熱的(經常使用到的)數據的,緩存效果沒有其它幾 ???? 種類型使用效率高。 9.判斷是否具有繼承關系用instanceof A(某個類的對象引用) instanceof(操作符號) B (某個類的名稱)。這個操作符最后返回的是一個布爾值。如果是false的話,則說明A對象不是類B的實例對象。相反,如果返回的值是true的話,則說明對象A是類B的實例對象。 作者:jijs 鏈接:https://www.jianshu.com/p/0ce2279c5691 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 先貼上一個網址: http://cmsblogs.com/?p=70 講的是引用類型的轉換,父類引用指向子類引用之類的。 重點總結:向上轉換和向下轉換需要有繼承關系 ,向下不需要強制轉換,向上需要強制轉換。 應用:多態 。 JAVA類型可以分為兩種:基本類型和引用類型 常類型 1.基本類型有8大 類型: 低———————————————>高 byte,short,char-> int -> long -> float -> double 還有boolean 注意:boolean不能進行類型轉換 精度大的賦值給精度小的需要強制類型轉換 比如 int a=(int)12.4 byte的范圍是-128~127 long的數值結尾要加L 如2000000L float結尾要加f 如12.5f double不需要結尾 如2.33
2.引用類型: 類、接口類型、數組類型、枚舉類型、注解類型 都是 而Object是所有引用類型的根類 意思就是說所有的類都可以賦值給Object。3.常類類型 要加final這個時候有必要介紹一些拆裝箱:百度百科:裝箱就是把byte ,int ,short, long ,double,float,boolean,char
這些Java的基本數據類型在定義數據類型時不聲明為相對應的引用類型,在編譯器的處理下自動轉化為引用類型的動作就叫做裝箱。 拆箱就是把Long,Integer,Double,Float 等將基本數據類型的首字母大寫的相應的引用類型轉化為基本數據類型的動作就叫拆箱。
講到Integer又可以衍生到 包裝類。先來介紹一下包裝類再繼續拆裝箱,因為是連貫的知識 包裝類就是指的是八個和基本數據類型對應的類統稱為包裝類 因為八大類型都是值類型,可是我們常常需要用的是引用類型。比如方法參數是Object
具體的可以看一下這個博客 :https://blog.csdn.net/hjf19790118/article/details/7081925我也就懶得手動敲了 人家寫的更詳細。結論:為了使基本類型具備對象的特性,所以出現了包裝類,就可以像操作對象一樣操作基本類型數據。接下來再來就可以介紹拆裝了
原始類型byte, short, char, int, long, float, double 和 boolean 對應的封裝類為Byte, Short, Character, Integer, Long, Float, Double, Boolean。 舉例:裝箱 Integer i = new Integer(10); 手動轉換 Integer i = 10; 自動轉換 這里面就涉及到了裝箱 10是int類型 Integer是引用類型 相當于父類指向子類 拆箱: Integer i = 10; //裝箱 int n = i; //拆箱 將對象重新轉換成基本類型 內部:裝箱過程是通過調用包裝器的valueOf方法實現的,而拆箱過程是通過調用包裝器的 xxxValue方法實現的。(xxx代表對應的基本數據類型)。 Integer i1 = 100; Integer i2 = 100; 問題: i1==i2嗎? 答案是 false JVM為了節省內存會在里面緩存[-128,127]的Integer 那么值在中間的對象其實是指向一個對象 除非超出這個范圍才會重新創建一個新的對象 而 Double i1 = 100.0; Double i2 = 100.0; i1==i2 答案是false
參考:http://www.cnblogs.com/dolphin0520/p/3780005.htmlhttps://www.jianshu.com/p/0ce2279c5691
拆裝箱注意:
避免 Integer integer = 10;起碼得是Integer integer = new Integer(10);
盡量不要用Integer.valueOf(String str);而要用Integer.parseInt(String str)
Integer.valueOf()把String 型轉換為Integer對象。因此在int countNum = ? 的情況下用
Integer.parseInt() 很好的,直接變成int類型的值,而不用再拆箱變成基礎類型了。
Integer.parseInt()把String 型轉換為Int型,就是說Integer.valueOf(S)是針對包裝類來說
的,而Integer.parseInt(s) 是針對變量而言接下來講一下類型轉換的問題:
基本類型之間的轉換:
1.如果char+int 結果返回的值是int型 自動轉換為int 來操作 因為int精度大 意思就是說
兩個數如果進行算數運算 最后返回的結果是精度大的那一個 比如 4.0/2 返回的是2.0
2.強制轉換是精度大的轉換為精度小的,會有精度缺失,而小的轉換為大的則沒有影響
關鍵是基本類型和引用類型的轉換和引用類型之間的轉換。
里面最基本的是父類子類的轉換關系 上面已經介紹了 這就不多說了 看下面的
再貼一個博客:https://blog.csdn.net/darxin/article/details/5163043Object和String的內容 明天再寫 不早了 先上傳保存類型轉換主要Object String 基本類型
插個題外話 介紹下StringString zz=new String("sdf");String qq=new String("sdf");System.out.println(zz==qq);true or false答案:false;String zz="sdf";String qq="sdf";System.out.println(zz==qq);答案:true原因: 當創建string的時候每次都會從方法區的String變量池(單一性 只存在一個)里面查找有無該變量。如果有 那么不管是直接賦值還是new 都不會在變量池中創建新的變量,但是new的話 還會在堆中創建一個對象。如果沒有的話 ,都會在變量池中創建該變量 ,而new會在堆中創建一個對象 ,直接賦值不會引用類型就是 句柄(指針)在棧中, 指向的對象在堆中題外話:static變量是在方法區中 當剛加載class的時候執行接下來介紹下Object 和String 基本類型的關系Object是對象 String也是對象 但是Object是 String的父類 基本類型會在從操作的時候自動進行封裝箱,所以對應的是包裝類也是對象 如int 對應Integer 用instanceof驗證一下:String a=“sdf”;Integer b=33;int c=33;a instanceof Object trueb instanceof Object truec instanceof Object false接下來介紹轉換的時候 記住 一定要有**繼承關系**才可以! 牢記這點就行比如 Object xx=new Object();String zz="sdf";xx=zz;String qq=(String)xx;是可以的 如果是Object xx=new Object();String qq=(String)xx;就不行 因為Object不能強裝為String前提必須Object是由String裝箱進來的 才可以再次轉換出來就相當于 香蕉放進籠子,拿出來還是香蕉 本質很重要。不然 xx可以為任何子類型 只有確定好了他本來的類型才可以轉換。題外話:我寫這篇也是因為 學習集合的時候遇到了這個問題:Collection collection=new ArrayList();collection.add("sdf");collection.add("qwe");Object[] arr=collection.toArray();System.out.println(arr[1]); //自動調用tostring 所以可以輸出一般來說 要輸出arr中的元素需要一個循環 for(xx){print((String)arr[xx]);}//簡略寫因為toArray返回的Object類型 都是由String轉換過來的可是 如果這樣的話就有問題:Collection collection=new ArrayList();collection.add("sdf");collection.add("qwe");String[] arr=(String[])collection.toArray();Google和百度都說不能將Object數組轉換為String數組類型 可是 明明這個Object是由String轉換過來的 為什么不能再轉換成String我百思不得其解,昨晚睡前冥思了下 一下子就出來了原來只是Object數組中的元素是String轉換過來的 而Object數組本身也是個Object 而他并不是由String轉換過來的意思就是Object[]這個引用并不是String[]轉換過來的 所以無法再強轉為Object[] 這就符合了 前面講的 一定要有繼承關系不過百度其他是這樣解釋的:java中的強制類型轉換只是針對單個對象的題外話:Collection<String> collection=new ArrayList<String>();Collection collection=new ArrayList();前者用到了泛型 只能存放String類型 而后者保存形式是Obejct所以可以存放任何類型 for(String zz: collection) {System.out.println(zz);}針對第一種需要如此 第二種需要將String換成Object也是根據繼承關系回歸正題 :先來注意下 如果Object是null的話 那可以強制轉為任何類型Object與String之間轉換:Object zzObject="sdf";String aa1=String.valueOf(zzObject);String aa2=(String)zzObject;String aa3=zzObject.toString(); 強調:前提Object是String轉換過來的 null值可以強制轉換為任何java類類型,(String)null也是合法的 (內容來自網絡)String轉換數字:盡量不要用Integer.valueOf(String str);而要用Integer.parseInt(String str)
Integer.valueOf()把String 型轉換為Integer對象。因此在int countNum = ? 的情況下用Integer.parseInt() 很好的,直接變成int類型的值,而不用再拆箱變成基礎類型了。 Integer.parseInt()把String 型轉換為Int型, 就是說Integer.valueOf(S)是針對包裝類來說的,而Integer.parseInt(s) 是針對變量而言 3.基本類型與字符串之間的轉換 String類中內置的方法很多,所以會有時候我們會選擇將基本類型轉換為字符串然后使用內置的方法 那么這里我們也分為兩個方面: (1)基本類型轉換為字符串 (2)字符串轉換為基本類型
(1)基本類型轉換為字符串 基本類型轉換為字符串的方法有三種方法: ①使用包裝類中的toString()方法 ②使用String類的valueOf()方法 ③加入空字符
String i = Integer.toString(h);//使用包裝類中的toString()方法 String i = String.valueOf(h);//使用String類的valueOf()方法 String i = h + “”;//加入空字符 (2)字符串轉換為基本類型 包裝類轉換為基本類型有兩種方法: ①使用包裝類中的parseXXX()方法 ②使用包裝類中的valueOf()方法
int j = Integer.parseInt(i);//使用包裝類中的parseXXX()方法 直接轉換為數值型 int j = Integer.valueOf(i);//使用包裝類中的valueOf()方法 把i轉換成包裝類Interger類型 然后拆箱
總結
以上是生活随笔 為你收集整理的JAVA学习笔记--类型转换(父类子类 Object 基本类型 String) 拆装箱 包装类 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。