Java中的值類型


在打算了解Java的時候,根據C#的經驗,了解一下Java中有哪一些值類型,如何判斷某個類型為值類型還是引用類型是一件值得做的事情.

在C#中,值類型存放在棧中,不需要垃圾回收,引用類型存放在堆中,需要垃圾回收.將一個值類型轉換為引用類型,會引起裝箱(創建一個需要垃圾回收的引用類型),在真正使用時,需要拆箱,在裝箱拆箱時會產生需要垃圾回收的對象,

如果裝箱拆箱太多,對我們程序的性能有較大影響,所以了解哪些是值類型,哪些是引用類型,以方便在開發中注意區分是很有必要的.

 

看書是一種方式,自己探索也是一種方式.

Java中有哪些值類型呢?在中文版的<Java編程思想>第4版23頁中,列出了Java的基本類型:boolean,char, byte, short,int, long, float,double,void.同時也列出了他們的包裝期.(首字母大寫)<

(java中似乎與C#不同,Java的基本類型應該是都放在棧中的,<Java編程思想>中文第四版25頁:Java對象不具備和基本類型一樣的生命周期)

根據C#的經驗,我希望能找到一個類似與C#中is,as的方式判斷是否值類型就比較好.

C#中,可以如下判斷: 

Type t = typeof(T);

t.IsSubclassOf(typeof(ValueType))
在java中有沒有類似的方法呢?

我自己寫了一個:

 

 
    /**
     * 是否數據
     * @param t
     * @return
     */
    public static boolean IsNumer(Class<?> t) {
    	if (t == null) {
    		return false;
    	}
    	if (t == Object.class) {
    		return false;
    	}
    	if (t == void.class) {
    		return false;
    	}
    	Class<?> superClass = t.getSuperclass();
    	if (superClass == null) {
    		return true;
    	}
    	return superClass == Number.class;
    }

  

驗證的結果如下:

	@Test
	public void Test_HiTypeHelper_Number() {
		Assert.assertTrue(HiTypeHelper.IsNumer(int.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(BigDecimal.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(float.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(double.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(long.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(short.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(boolean.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(char.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(Float.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(Double.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(Long.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(Short.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(byte.class));
		Assert.assertTrue(HiTypeHelper.IsNumer(Byte.class));
		Assert.assertFalse(HiTypeHelper.IsNumer(Boolean.class));
		Assert.assertFalse(HiTypeHelper.IsNumer(void.class));
		Assert.assertFalse(HiTypeHelper.IsNumer(Void.class));
		Assert.assertFalse(HiTypeHelper.IsNumer(EnumTest.class));
		Assert.assertFalse(HiTypeHelper.IsNumer(Object.class));
	}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM