thinking in java 学习4

this关键字:java如何判断是哪个对象调用了类的方法呢?事实上编译器暗中做了许多事情。调用方法的那个对象的引用会被当做一个非常重要的参数传给对象所调用的方法。

如Test t1 = new Test(), t2 = new Test(); t1.test();t2.test();实际上在编译器内部这两个方法调用就成了

Test.test(t1);Test.test(t2);

假设你想在方法里使用当前对象的引用。由于这个引用是由编译器秘密传递的,因此它没有标识符。为此Java加了一个关键词this。this关键词只能用于方法内部,它负责返回调用这个方法的对象的引用。在一个构造函数中可以使用this来调用该类的另一个构造函数(如果有的话),但是不能调用两个,因为构造函数必须在最前面调用,否则会报错。

如class Test{ Test(){}; Test(String s){this();System.out.println(s);}}

掌握了this关键字之后,就能完全理解static方法的含义了。它的意思是,这个方法没有this(也就是说编译器在调用它的时候不会以Test(t1)这样的的形式将对象的引用传递到方法里边去,而是直接调用Test.test())。所以你不能再static方法里边调用非static的方法(非静态的方法必须要知道调用该方法的对象引用,但是在静态方法中是不会有调用该方法的对象引用的),但是你却可以不通过对象,直接对类调用static方法。实际上这正是static方法的本义。类的static方法只能访问其他static方法和static数据成员。

关于垃圾回收和finalize()方法:垃圾回收的时候会先调用finalize方法,但是只要JVM还没到快要耗尽内存的地步,它是不会浪费时间来回收垃圾以恢复内存的。(如此看来垃圾回收并不是在做定时循环清理不用的对象,而是有一定的触发条件,这个触发条件跟JVM的内存相关

Java在堆中创建对象:Java在堆中创建对象就像是一条每次分配新对象的时候不断向前移动的传送带,因此它为对象分配内存会非常快。“堆指针”只是简单地向前面的处女地移动,所以这实际上就同C++的栈分配是一样的了。实际上堆不是一条传送带。如果真的这么做的话,就得非常频繁地启动虚拟内存的交换,进而耗尽系统资源。关键就是垃圾回收器。当它回收垃圾的时候,会把堆里面的对象全都压紧,实际上就是把“堆指针”往传送带的开头方向移,让他远离页面断层。垃圾回收器会重新安排内存,这样就实现了一种高速的,有无限的对空间可供分配的内存分配模型。

垃圾回收的工作原理:垃圾回收通常不是寻找已经"死掉(没有引用指向他)"的对象,而是寻找所有没死的对象。所有没死的对象都应该能最终找到它在栈或者静态存储区里的引用。这个关系链可以跨好几层对象。这样,如果从栈和静态域存储区开始,查遍所有的引用,就能找出全部的还活着的对象。找到一个引用之后还得跟着它所指对象里去,然后跟着对象里面的引用找出它所指的对象,以此类推,直到访遍整个网。

stop-and-copy:基于某些很明显的原因,程序必须先停下来,然后把或着的对象从一个堆里拷贝到另一个堆里,这样原先那个堆就成垃圾了。此外,对象被拷贝到新堆里的时候是一个紧挨一个的,于是新的堆就被压缩了。

mark-and-sweep:从栈和静态存储触发,跟踪所有的引用,然后找出活着的对象。但是每次它找到一个活着的对象的时候,它会在对象里面设置一个标记,不过它不会马上就回收对象。只有当标记过程完全结束之后,它才会开始清理。清理的时候会释放已死的对象。但是,它不进行拷贝,所以如果垃圾回收器要压缩已经成了碎片的堆的话,它就只能重排对象了。

如果程序运行时产生大量垃圾,就会采用stop-and-copy模式,当程序运行稳定,产生很好的垃圾是,JVM就会切换到mark-and-sweep模式,这就是所谓的“自适应”。

java创建对象的步骤:

1、第一次创建类的对象(构造函数实际上是static方法),或者第一次访问类的static的方法或字段的时候,jav编译器会要搜寻classpath,找到相应的.class文件。

2、装载了.class文件之后,会对所有的static数据进行初始化。这样第一个装载Class对象的时候,会先进行static成员的初始化。

3、用new关键字创建新对象的时候,对象的构建进程会先在堆里为对象分配足够的内存。

4、这块内存先被清零,这样就自动地把对象的基本类型的成员赋上缺省的值(对于数字就是零,或者是相应的boolean和char),将引用设成null。

5、执行定义成员数据时所作的初始化。

6、执行构造函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值