Java基础知识总结(一)创建和销毁对象

契子:明年就要离开学校找工作了,时间过的真快,想一想这几年,做了一些事,也有一些事并没有做好,有很多收获,也有不少遗憾。感性的话在此不宜多说,既然选择了程序员这条道路,也要有把它到做事业的态度。在正式找工作前还有几个月的时间,做东西,尝试新的技术固然很爽,但是基础也很重要,在这短短的几个月的时间里,我将把以前学过的一些知识,Java,数据结构,算法,网络,OS&Linux,J2EE等等知识查缺补漏,好好梳理一遍,不光是为了找工作,也是一种必须要坚持的态度。

对于Java知识的整理,基于《Effetive Java》2nd和《Java编程思想》4th辅以JVM和设计模式的相关知识,结合书本上的知识和我的理解进行整理。好了,开始我的一篇——创建和销毁对象。


1. Java中的构造器:

构造器是一种特殊类型的方法,它和类同名,没有返回类型,和new关键字结合可以返回对象实例的引用。TIJ中说它是一种静态方法,但是通过字节码我们可以看到其实并没有static关键字,它的行为也和其他静态方法有异(可以访问非静态成员变量),因此这种说法并不完全准确,这里不再深究。

1.1 定义构造器:

一个类可以有多个构造器,如果你没有定义构造器,Java编译器会在语义分析的阶段,首先添加一个默认构造器。

多个构造器可以通过方法重载(overload)实现,注意只有同方法名和不同参数列表可以区别不同的重载版本,返回类型并不能区分

尤其是使用基本类型参数重载时,要注意类型的自动转换如(char—>int,小转大)和窄化转换(强制类型转换,大转小),当然会使用最匹配的类型。

1.2 this关键字:

通过this指针我们可以访问类的实例变量和方法,但最好是在必要的时候(需要返回或使用该实例,内部类访问外部类同名实例变量方法,构造器设置属性等)使用它,否则你不必添加它,编译同样会帮你添加。

在存在多个重载版本的构造器时我们可以在构造器内使用this调用其他构造器,可以避免一些重复的代码:

    public ConstructorTest(int a) {
        this.a = a;
    }

    public ConstructorTest(int a, String s) {
        this(a);
        this.s = s;
    }

PS:在构造器存在很多参数情况下,重叠构造器是一种选择,但是更好的做法是使用Builder模式,后面会讲到。

1.3 static关键字:

static(静态),static方法和static变量是类方法和类变量,它们不能使用this引用,都放在方法区中,供各个线程共享。static变量初始化和static初始化其,会在类加载(隐式加载或显示加载)后执行一次。


2. 清理,终结对象(finalize)/垃圾回收(CG):

这涉及到很多内容。Java提供了垃圾回收器,但内存泄漏可能以很隐秘的方式发生(使用引用数组时),同时对于对象中可能使用的一些资源必须在对象不再使用时进行释放(Connection,FileInputStream等)。

首先对象实例作为类的副本存放在Java堆中,在JVM中,一般使用可达性分析进行垃圾回收,也就是说,如果顺着引用追溯的话,“活”的对象应该可以到达CG Root(包括,静态变量,常量引用,栈中的本地变量表以及本地方法栈JNI native方法中的引用)。垃圾回收器会对不可达对象进行标记,在堆的不同区域使用不同的方法进行回收。

标记-清除:如果只有很少的垃圾的话,它很快,而且简单,但是如果垃圾很多的话,会产生大量的碎片;
复制:我们可以将需要进行垃圾回收的内存区域分为2个部分,比如A和B,需要CG时,将A的存活的对象直接复制到B(之前为空)中,清空A就可以了,不需要考虑碎片的问题,实际上在JVM(Hotspot)中分成了3个部分,一般比例可以为8:1:1,它们分别命名为eden,surivor1,surivor2,因为据统计Java程序中95%以上的对象很快就不再使用,因此eden很大,surivor可以较小(存活的对象少)。这实际上多用与新生代的垃圾回收。
标记-整理:有新生代当然也有老年代了,与新生代不同,老年代的对象相对稳定的多,垃圾回收很少,毕竟是经过了minor CG洗礼的不会那么容易挂掉,开个玩笑。标记-整理与清除的不同的地方在,它并不是直接在原位置清除掉,而是将存活的对象移向一端,之后直接就可以一起清除掉挂了的对象。因为我们也说了老年代的对象回收的少,因此移动的也相对较少。这样就不会有大多的碎片了。

因此我们可以看到,JVM多采用分代回收的方式,对于不同的情况分而治之。

释放资源,终结和垃圾回收有什么关系:

首先, 垃圾回收只和内存的使用状况有关,当内存不足(或满足我们设置的条件)时,才会进行CG。 <
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值