1.构造器木有返回值,这个和返回void有明显的区别的哦。

2.涉及到基本类型的重载(注意重载和重写的区别):

当传入的数据类型小于方法中申明形式的参数类型时候,实际的数据会被提升。ps:char有所不同,如无法找到合适的类型对应char,直接提升到了int略过了byte。

如果传入实际参数大于方法中申明形式的参数类型时候,必须通过类型转换,此时数据会被截断。否则是会报错的。

3.编译器暗自把“所操作对象的引用”作为第一个参数传入给方法中。例如peel(1),实际是peel(a,1),a表示peel所在类的一个对象引用。

4.this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用

5.同一个类中,一个构造器调用另一个构造器可以使用this关键字,此时this代替构造函数,例如:this(1,2)。但是要注意:

a.只能再构造器中这样使用,不能在其它任何方法内使用;

b.必须在最开始处使用;

c.只能调用一次。

6.static补充:

a.static方法就是没有this关键字的方法。

b.在static方法内部不可调用非静态方法,但是返过来可以。

c.static关键字不能应用于局部变量

d.static静态初始化只有在必要的时刻才会进行,即第一次创建/访问静态数据时候。

另可参考http://blog.tomner.com/?p=695最后一条关于static。

7.垃圾回收器只会释放那些由new分配的内存

8.finalize一般用在本地方法调用c/c++的free来释放内存。

9.System.gc();可以强制垃圾回收。

10.垃圾回收机制简单说明

a.停止-复制模式:

暂停程序运行–遍历堆栈和静态存储去所有引用并找出栈中所有存活对象–复制到新的堆中–引用修正

缺点:需要比实际多一倍的存储空间,有些无垃圾产生的也复制。

b.标记–清扫

暂停程序运行–遍历堆栈和静态存储去所有引用并找出栈中所有存活对象–标记–清空所有无标记对象–重新整理剩下对象到连续空间

java实际上是a b两种机制自适应进行。

11.JIT:需要装载类(new)时候,编译器先找到.class文件,将该类字节码装入内存。

12.我们无法阻止自动初始化的进行,它将在构造器被调用之前发生,即使被分散在类的各处

13.对象创建过程,以Dog类为例:

a.即使没有显示static关键字,构造器实际上也是静态方法,因此,首次创建类型为Dog的对象,或说Dog静态方法首次被访问时,java解释器必须找到类路径,以定位class文件。

b.然后载入Dog.class,有关静态初始化的所有动作都会执行。

c.当用new Dog()创建时,首先将在堆上为Dog对象分配足够的内存空间。

d.此空间被清零,设为默认值。

e.执行所有出现字段定义出的初始化动作。

f.执行构造器。

14.非静态子句,可以保证无论调用哪一个显示构造器,某些操作都会发生。

15.数组初始化:int[] a;/int a[];推荐使用第一种,表示int类型数组。

此时不允许指定数组的大小,即长度。因为定义的只是一个数组的引用,没有给对象分配内存,必须初始化

16.随机数:

a.

Random rand=new Random(47);

rand.nextInt(100);//0-100的整数,不包括100

b.

Math.random();产生0-1之间的数,不包括1

17.int[] a = new int[rank.nextInt(20)];这样可以创建长度为0-20之间任意长度的数组。对象可以指定长度,引用不可以

ps:基本类型在方法内定义不能自己初始化,必须给定值,而定义数组时候跟类成员一样可以初始化为默认值

18.创建非基本类型的数组:

Integer[] a = new Integer[rank.nextInt(20)];

这里只是创建了引用数组,必须在后面给每个int[i]赋值,否则对象为null;

这里以及17中的new可以理解为new一个数组,而不是int/Integer对象。(当然int不能new)

19.Object很有用,因为所有类都直接或间接继承与Object。

20.f(类型…,arg1)…表示可变参数,>=0个,f(arg1)同样可以调用。