• 大家一起和snailren学java-(四)初始化与清理


      初始化和清理,是一个生命周期的起始。在java中,对象的初始化和对象的回收是怎样的呢?

      在开发c++的时候,有构造器的概念。即对象的创建,首先默认调用构造器进行初始化。在java中也有“构造器”。java对象的创建与初始化是捆绑在一起的,在对对象创建的同时,对对象进行初始化设置。在编写构造方法的时候,假如不写构造方法,则会系统使用默认的无参构造方法。但是如果你自己有定义构造方法了,那系统就不会帮你做了。这里有一个小tips,在写构造方法的时候没有返回值。是“没有返回值”,而不是返回值为空。那又有什么区别呢?返回值为空,只是返回值为空而已(@-@),它也能返回其他值。但是没有返回值就是不能返回任何值。

      这里,我们跳到方法的重载。我们知道,方法的重载是通过参数的不同来区别的,不是通过返回值。那为什么不能通过返回值呢?举个栗子,假如你的方法功能不需要返回值,根本不care返回值,那你怎么区别不同的方法呢?只能通过参数啦。所以……你懂。

      我们再说说java中的this指针。this指针的定义是“调用方法的那个对象”。只能用于方法的内部,表示正在调用这个方法的对象。其实我一直对这个this的体会不会很清晰,但是可以换一个思路,那就好想多了。我们知道,对象的生成后被存储在堆中。我们可以把一个个在堆中的对象想象成一个个箱子。不同的箱子去调用同一个方法,我总要知道到底是哪个箱子调用的啊?那就用this表明。(不知道这样说是不是更好理解……)。当然this也能作为一个对象返回,返回当前对象。

      有this指向对象本身,那也有不含this的。那就是static。作为“类全局”方法,static方法内部不能调用非静态方法(当然啦,一个非this的怎么能调用一个需要this对象的方法呢)。

      好,现在我们说到垃圾的回收(GC)。

      在java中,经常被大家提起的就是垃圾回收机制。我们知道,垃圾回收机制通过软指针来监控每个对象,判断对象受否为空,后面不会再使用,对无用的对象自动回收,释放内存。当然,这一切都是GC自动处理,程序员无法控制。如果非要在释放时程序员要做一些事情,那就用finalize()方法。但是这个也是“建议”GC这样做,真正做还是要GC自己决定。因此有的对象可能不被垃圾回收。因为GC的唯一目的是回收不需要再使用的内存,因此你的finalize的作用必须是做内存回收。那什么情况下用finalize方法呢?如果你的程序内存申请除了new以外,还进行了混编,用了c/c++的内存申请方法,那就要在finalize中明确释放。 所以说java的垃圾回收和其他语言的析构函数是不一样的。

      对于垃圾回收器如何工作的,这里简单说一下。首先是在java的对象存储中,将所有对象存放在堆,其实速度是比较快的,因为java通过堆指针进行内存的分配,可以快速进行对象的分配、存储。JVM在实现垃圾回收机制时,采用自适应的垃圾回收技术。不同的java虚拟机,其实实现机制不一样。一类是停止-复制方式,就是先暂定程序运行,再把存活的对象复制到另一块新堆。一种是标记-清扫机制。就是从堆栈和静态存储区出发,遍历所有引用。堆存活的对象进行标记,标记结束后释放没有标记的对象,再重新整理不连续的内存。

      在对成员的初始化时,java会自动对其进行初始化赋值,且不能阻止。就算后面对那个变量进行赋值,系统也要先初始化赋值。但是对于静态变量和非静态的还是有点不一样的。一般的非静态变量,在运行后会进行初始化。但是静态数据成员在需要使用的时候才会初始化。比如说一个类里面,有静态和非静态的。new一个该类的对象,会先初始化静态变量,再初始化非静态变量。

      哈哈,当我看第五章觉得后面没有什么看的了时候,发现了一个彩蛋——可变参数列表。这个平时还真没用过。怎么用呢?其实就是当你的方法要传入的参数的个数不知道有几个,更或者不知道要传什么类型的参数的时候,可以用这个。

      

    //什么都不知道
    void test(Object... args)
    {
     for(Object obj : args)
        {
           
           System.out.print(obj+ "");
        }
    }
    
    
    //指定参数类型
    void test(interger... args)
    {
     for(Object obj : args)
        {
           
           System.out.print(obj+ "");
        }
    }

      其实这种用法,个人感觉虽然很方便,但是也不应该滥用吧,可能会让程序变的比较乱,不清晰,只能在特定的小范围使用。因为java的自动装箱,所以可以在调用的时候直接用基本类型。因为所有的类型都是继承的object,因此都能用。 

      最后,我们说说java SE5的新类型枚举,enum。和switch一起使用更配哦。

      

  • 相关阅读:
    C++中两种获取UUID的方法(编程)
    在python中发送自定义消息
    lib,dll的位置
    GetWindowText
    SuspendThread and ResumeThread
    创建线程检查按钮的状态
    C++检测句柄的权限
    POJ2186 强联通
    POJ2186 强联通
    POJ 1201 差分约束(集合最小元素个数)
  • 原文地址:https://www.cnblogs.com/ren-jie/p/5308672.html
Copyright © 2020-2023  润新知