java细节总结

1.如果返回值为void,即没有返回值,方法中有return 编译就会报错,即使是return null;

	public void test() {
		return null;
	}

 

-----------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------

2. 

-----------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------

 

3.数组问题总结专楼

		int[][] a = { { 1, 2 }, { 2 }, { 3, 4 } };
		System.out.println(a[1][1]);

 

这样写会报异常

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at com.lch.test.Test.main(Test.java:22)

 

这点非常值得注意,因为java的数组内存分配和c不同,如果像上面这样写,java的内存分配如下图:

java细节总结

所以a[1][1]是不存在的。

 

而对于c来说,声明时必须至少指定第二维的长度。

int[][2] a = {{1,2},{2},{3,4}};

 它是一个3行2列的数组,a[1][1]没有赋值,系统会自动赋值为0,所以a[1][1]=0

 

-----------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------

 

4.jdk1.5新特性专楼

【1】自动装箱拆箱。

		//自动装箱,jkd1.4以前的写法为Integer i = new Integer(3);
		Integer i = 3;
		//自动拆箱
		//Integer对象不可以用+运算符,这里将Integer自动拆箱成int
		System.out.println(i+3);

 map中的put方法的一个参数和get方法的参数都是对象,但是也可以利用装箱写成如下方式:

		Map map = new HashMap();
		map.put(1, "value");
		System.out.println(map.get(1));

 

 

有一点需要注意:

对于 -128~127的整数,系统会将其放到缓冲池中去:

		Integer i1 = 3;
		Integer i2 = 3;
		System.out.println("i1 == i2:"+(i1 == i2));//true,系统会将-127~128的对象放到缓冲池中
		
		Integer i3 = new Integer(3);
		Integer i4 = new Integer("3");
		System.out.println("i1 == i3:"+(i1 == i3));//false,new的当然都是新的对象
		System.out.println("i1 == i4:"+(i1 == i4));//false,new的当然都是新的对象

		
		Integer i5 = Integer.valueOf(3);
/*		下面返回true,这样写返回的也是缓冲池中的对象,这个方法从jdk1.5以后有的
		文档中的写法是:
		返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer
	                实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为
	           该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 */
		System.out.println("i1 == i5:"+(i1 == i5));
		
		Integer i6 = Integer.valueOf("3");
		System.out.println("i1 == i6:"+(i1 == i6));//false,这个比较特殊
		
		int i7 = 3;
		System.out.println("i1 == i6:"+(i1 == i7));//true,直接比较值

 如果超过127结果如下:

		Integer i1 = 128;
		Integer i2 = 128;
		System.out.println("i1 == i2:"+(i1 == i2));//false
		
		Integer i3 = new Integer(128);
		Integer i4 = new Integer("128");
		System.out.println("i1 == i3:"+(i1 == i3));//false
		System.out.println("i1 == i4:"+(i1 == i4));//false

		
		Integer i5 = Integer.valueOf(128);
		System.out.println("i1 == i5:"+(i1 == i5));//false
		
		Integer i6 = Integer.valueOf("128");
		System.out.println("i1 == i6:"+(i1 == i6));//false
		
		int i7 = 128;
		System.out.println("i1 == i6:"+(i1 == i7));//true

 

 

 【2】 jdk1.5以后引入了printf函数

public PrintStream printf(String format, Object... args)

其为java.io.PrintStream的方法,因为java.lang.System类中的静态成员out实际上是一个PrintStream的对象所以out也可调用printf方法。 

 

用法为:

		char a = 'a'+3;
		//执行下面输出d
		System.out.printf("%c\n",a);	
		//执行下面输出100,a对应ascii为97
		System.out.printf("%d\n",(int)a);
		/*执行下面出异常Exception in thread "main" 
		java.util.IllegalFormatConversionException: d != java.lang.Character*/
		System.out.printf("%d\n",a);

  值得注意的是第一行中,char型和int型做运算,先转化为int型,'a'+3结果为int,又int可直接向下赋值给char,short,byte只要不超过其表数范围。

-----------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------

 

4.源代码积累专楼

【1】Integer源码

我们先来创建一个Integer对象,下面用到了自动装箱

		Integer i = 3;
		i.intValue();

 然后调用了intValue方法,此方法将返回封装类的基本数据类型,这里是int。如何实现的呢?看源码:

	    public int intValue() {
	    	return value;
	        }

  

直接返回了value,那这个value又是什么呢?

	    private final int value;

 

再看构造方法:

	    public Integer(int value) {
	    	this.value = value;
	        }	

 

原来每个封装类都保留了一个与其对应的基本类型作为成员变量,在构造的时候对其进行初始化。调用intValue方法就返回了这个值。

注意每个封装类都是如此,就连Boolean中也保留了一个boolean的成员变量。

你可能感兴趣的:(java,thread,C++,c,C#)