1. 一直搞不明白垃圾回收到底根据什么来判断是否回收,有人说根据“没有任何变量引用此对象”时就回收,
(1)如果我在main函数里只写了一句“ClassA a = new ClassA();”那么在程序执行时,a永远指向new出来的对象,
该对象永远不被回收?;(2)如果我在main函数里只写了一句“new ClassA();”是不是过一会儿垃圾回收期就把这个
new出来的对象回收了?如果是的话,请看下面代码:import java.awt.*;public class TestPaint {
public static void main(String[] args)
{
new PaintFrame().launchFrame(); }
}class PaintFrame extends Frame{
public void launchFrame() {
setBounds(200,200,640,180);
setVisible(true);
}
//public void paint(Graphics g){
// Color c = g.getColor();
// g.setColor(Color.RED);
// g.fillOval(50,50,30,30);
// g.setColor(c);
}}
以上代码main函数里只new了对象,并无引用,只有这一句:new PaintFrame().launchFrame();程序执行时会画一个窗口出来,在画完之后是不是new出来的那个对象过会儿就被垃圾回收器回收了?而那个窗口是不是永远存在?2. main函数有一个方法:public ClassA method(){ClassA a = new ClassA(); return a;},如果我在main函数里写:method();像这种情况,当程序执行时,首先new一个对象,然后有a指向它,最后method把a返回,可我在main方法里并没有利用这个a,那么这个“a引用”怎么处理?对象过会儿会不会被回收? 3. 关于java API(JDK),是我们在编程时可以利用的一些函数,是Sun为我们写好的,我们也能得到它的源码,可我感觉它提供的源代码里和我们自己写的用本质的区别。我想知道,sun提供的那些函数里是不是有调用更底层的接口,我想知道这些底层的接口是什么?打个比方,我自己可以写类、写方法,我自己的类或方法里调用了JavaAPI提供的某个类或方法,如果看它的源码,它一定又调用了某个类或方法,可以肯定的是它绝没调用我写的(哈哈),这样一直追究下去,它一定到最后调用了一个最底层最本质的方法,而这个方法是什么?我想知道这些最底层最本质的方法是什么。
如果把1.(2)那段注释部分加上后,这个paint方法是什么时候被调用的?我在主方法里并没调用它,而它确实被调用了,难道是虚拟机在调用我每个方法前都要判断是不是从Fram继承的,是不是包含一个paint方法?这样虚拟机岂不是要累死?每个方法它都要判断是不是从哪哪继承的,是不是有什么什么方法。
(1)如果我在main函数里只写了一句“ClassA a = new ClassA();”那么在程序执行时,a永远指向new出来的对象,
该对象永远不被回收?;(2)如果我在main函数里只写了一句“new ClassA();”是不是过一会儿垃圾回收期就把这个
new出来的对象回收了?如果是的话,请看下面代码:import java.awt.*;public class TestPaint {
public static void main(String[] args)
{
new PaintFrame().launchFrame(); }
}class PaintFrame extends Frame{
public void launchFrame() {
setBounds(200,200,640,180);
setVisible(true);
}
//public void paint(Graphics g){
// Color c = g.getColor();
// g.setColor(Color.RED);
// g.fillOval(50,50,30,30);
// g.setColor(c);
}}
以上代码main函数里只new了对象,并无引用,只有这一句:new PaintFrame().launchFrame();程序执行时会画一个窗口出来,在画完之后是不是new出来的那个对象过会儿就被垃圾回收器回收了?而那个窗口是不是永远存在?2. main函数有一个方法:public ClassA method(){ClassA a = new ClassA(); return a;},如果我在main函数里写:method();像这种情况,当程序执行时,首先new一个对象,然后有a指向它,最后method把a返回,可我在main方法里并没有利用这个a,那么这个“a引用”怎么处理?对象过会儿会不会被回收? 3. 关于java API(JDK),是我们在编程时可以利用的一些函数,是Sun为我们写好的,我们也能得到它的源码,可我感觉它提供的源代码里和我们自己写的用本质的区别。我想知道,sun提供的那些函数里是不是有调用更底层的接口,我想知道这些底层的接口是什么?打个比方,我自己可以写类、写方法,我自己的类或方法里调用了JavaAPI提供的某个类或方法,如果看它的源码,它一定又调用了某个类或方法,可以肯定的是它绝没调用我写的(哈哈),这样一直追究下去,它一定到最后调用了一个最底层最本质的方法,而这个方法是什么?我想知道这些最底层最本质的方法是什么。
如果把1.(2)那段注释部分加上后,这个paint方法是什么时候被调用的?我在主方法里并没调用它,而它确实被调用了,难道是虚拟机在调用我每个方法前都要判断是不是从Fram继承的,是不是包含一个paint方法?这样虚拟机岂不是要累死?每个方法它都要判断是不是从哪哪继承的,是不是有什么什么方法。
http://www.cnblogs.com/healerkx/articles/1371627.html
别只看一篇,后面的还有。
2,那个引用没有用,这个就是利用了表达式的负作用吧,像i++;之类的也是一个意思,不用表达式的值,只利用了其负作用。
3.应该是JVM自己的伪代码吧。再下一层要要和操作系统和CPU联系到一起了。
jdk最终调用的函数是一些本地的方法(用c和汇编语言写的函数),这些c和汇编写的函数就会调用操作系统的api,操作系统的api是操作系统内核实现了
你那个paint是在父类Frame中被某个方法调用(具体是那个方法,一时忘记),这涉及到设计模式的模板方法。你没有重载paint方法,所以调用的是父类Frame的paint方法。(多态)
我们平时写程序时经常这么写“ClassA a = new ClassA();a.method();”在调用完方法之后,对象仍然存在,引用也指向它,那对象怎么消失呢?