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的内存分配如下图:
所以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的成员变量。