Java编程思想初始化与清理

来源:互联网 发布:windows cmd shell 编辑:程序博客网 时间:2024/06/05 06:27

1.用构造器确保初始化。

2.方法重载:方法名相同而形参类型列表(包括顺序)不同的一类方法。如果传入的数据类型(实参)小于方法的形参类型,则实参类型就会提升成符合方法形参的类型。如果传入较大的实参类型,必须类型窄化转换成符合方法形参的类型,否则会导致编译器出错。

3.由于一般使用时,并不关心方法的返回值,而是为了其他副作用效果而调用方法的,所以可能直接调用方法而忽略返回值,因此,根据返回值来区分重载方法是不可取的。

4.如果自定义了一个构造器(无论是否有参数),编译器不会帮你自动构建默认构造器。

5.Java暗自把”所操作的对象引用“作为第一个参数传递给调用函数。this关键字只能用在方法内部,表示对”调用方法的那个对象“的引用。如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。this关键字可以用在需要当前对象引用的情景。

6.在构造器中,通过使用this添加参数列表来在一个构造器中调用另一个构造器,形如:this(parm);但一个构造器中,不能调用两次this来调用其它构造器。此外,必须把构造器调用置于最起始的位置,否则编译器会报错。可用this.s来区分参数s。除了构造器以外,编译器禁止在其他任何方法中调用构造器。

7.static方法就是没有this的方法,在static方法内部不能调用非静态方法,反过来则可以。static方法可以调用类中其他的static域和方法。

8.清理:终结处理和垃圾回收:

1). Java允许在类中定义finalize()方法,一旦垃圾回收器准备释放对象占用的内存空间时,先调用该方法,再真正回收内存。因为Java里的对象不总是被垃圾回收的,如通过“本地方法”即调用C或C++语言来产生的对象。得在该方法中调用free()来释放存储空间。

2).对象可能不被垃圾回收,垃圾回收不等于“析构”,说明垃圾回收并不能在回收时像析构函数一样,可以重置状态,完成清理工作,使对象的状态合理。垃圾回收只跟内存有关。

3).在程序运行时,只有存储空间不足时,垃圾存储器才会释放无用对象的空间。但当程序运行结束后,没有释放的空间会全部交还给操作系统。

4).finalize()方法可以作为对象终结条件验证来验证对象是否处于可以安全释放的状态。system.gc()强制进行终结工作。

5).Java中的堆像传送带,每分配一个新对象,堆指针就往前移动一格,但会导致频繁的内存页面调度影响性能。但由于垃圾回收器的作用,一面回收空间,一面使堆对象紧凑排列,使堆指针更容易指向传送带的开始处。

6)引用计数法:统计每个对象的引用计数,但如果对象之间存在循环引用,可能出现“对象应该回收,但引用计数却不为零”。

7)更好的计数法:从活的对象出发,最终追溯到其存活在堆栈或静态存储区之中的引用。从堆栈或静态存储区开始遍历所有引用,追踪所引用的活的对象,对此对象包含的所有引用,追踪所用引用的对象,如此循环进行,直到源于堆栈或静态存储区的引用所形参的网络全被访问为止。

8)Java采用了自适应的回收技术。Java虚拟机会监视,当所有对象很稳定的时候,只产生少量垃圾的时候,进入“标记-清扫”模式(得在程序暂停下进行),从堆栈或静态存储区出发,遍历所有引用,进而找到所有存活对象。先给所有存活对象都设一个标记,当全部标记工作完成后,开始清理工作,释放没有被标记过的对象,这会导致剩下的堆空间不连续。当堆空间出现很多碎片的时候,就切换到“停止-复制”方式,先暂停程序的运行(不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,没有复制的全都是垃圾。复制时,是一个挨着一个的,所以新堆保持紧凑排列。但这种方式会导致效率降低,第一,在两个堆上来回倒腾,得多花一倍时间。第二,只有少量垃圾,也要进行复制工作,这很浪费。

9).Java采用即使编译器技术来加载类(一般在为类创建第一个对象)时,只在必要的时候才编译代码。

9.Java尽量保证:所有变量在使用前都能得到恰当的初始化。局部变量不能被默认初始化。自动初始化在构造器被调用前发生,因此变量定义的先后顺序决定了初始化的顺序。

10.无论创建多少个对象,静态数据都只占用一份存储区域。Static关键字不能用于局部变量,只能作用于域,跟非静态域一样,也能默认初始化。静态初始化只在必要的时候进行。只有第一次访问静态数据的时候才会被初始化(只有一次)。加载类的时候,进行静态数据初始化。初始化顺序:先静态对象,而后是非静态对象。静态块:static{},与静态初始化动作一样。

11.初始化字句,跟静态快类似,只不过少个static,在构造器前执行。

12.定义数组:int[] a1; 编译器不允许指定数组大小,现在只拥有对数组的一个引用,已对该引用分配足够的存储空间,但没给数组对象本身分配空间。Java可以进行数组赋值,即a2=a1; 真正做的只是复制了一个引用。数组初始化列表的最后一个逗号是可选的。

13.枚举类型。关键字enum,类似与class.为了使用enum,需要创建一个该类型的引用,并把某个实例赋值给该引用。

14.枚举类也是类,并具有自己的方法,其可以在swtich语句内使用。


原创粉丝点击