1.听说final定义的局部变量他的生命期可以超出方法的生命期,不知是否能举一个例子?
2.抽象类有什么好处?
3.finalize调用问题:
class Person{
public int age;
Person(){ }
}class TestFinalize{
public void finalize(){
System.out.println("The Objects are OUT!");
}
public static void main(String[] args){
Person person=new Person();
new Person();
System.gc();
}
}
为何程序执行The Objects are OUT!没能输出?

解决方案 »

  1.   

    1.在{}内定义的final变量,会在}后面继续存在,也就是你所说的生命周期超出方法的
    2.抽象类本身只提供方法的声明,而本身没有实现,实现留给继承它的子类来实现,而子类就可以根据自己的情况而有不同的实现
    3.finalize方法我也不是很明白,不回答了
      

  2.   

    你显示地调用System.gc(),以执行垃圾回收,但实际情况是,gc并没有实际的运行,它只会在适当地时候运行。当然了,如果gc方法执行了,那你定义的这个finalize方法也会执行的。
      

  3.   

    接楼上的:
    以下情况是完全可能的:一个程序只占用了少量内存,没有造成严重的内存需求,于是垃圾回收器没有释放那些无用对象占用的内存,因此这些对象的finalize()方法还没有被调用,程序就终止了。程序即使显式调用System.gc()或Runtime.gc()方法,也不能保证垃圾回收操作一定执行,因此不能保证无用对象的finalize()方法一定被调用。还有一个问题,楼主你怎么把public void finalize(){ 
    System.out.println("The Objects are OUT!"); 

    写在了TestFinalize类中?你应该写在Person类中的吧?写在Person类中倒是可能执行了,另外finalize()最好用protected修饰
      

  4.   

    嗯 我没看到 呵呵 是应该定义在Person类中  这样你就能看到gc执行后(如果执行了)的finalize方法输出了。
      

  5.   


    3Q,受益匪浅,System.gc()清除的是什么类型的对象呢?没有引用的?
      

  6.   


    如果子类定义和父类相同的方法不是可以override么?为什么还要用abstract来定义基类?
      

  7.   

    ......System.gc(),显式调用垃圾回收机制,适当时候,它会知道回收那些没有引用指向的对象的内存空间
    ......abstract 修饰是为了继承类必须实现这个方法
      

  8.   


    class Apple{
    String colour;
    public void getcolour(){
    ChangeColour();
    colour=col;
    System.out.println(colour);
    }
    }
    void ChangeColour(){
    final String col = "green";
    }class FinalTest{
    public static void main(String[] args){
    Apple apple = new Apple();
    ChangeColour();
    System.out.println(col);
    }
    }为何错误?
      

  9.   

    针对你的这个问题,其实字面上理解,确实就是你的代码。但是想想不太可能。我想应该是在方法体内定义了内部类,然后方法内申明了一个final变量,但是这个变量在内部类中仍然是可以使用的,即使该方法已经不再执行了。因为内部类的实例完全有可能还是存在的。
      

  10.   


    package finaltest;class Apple{
    String colour;
     String col;public String ChangeColour(){
       this.col = "green";
       return col;
    }
    public void getcolour(){
    colour=ChangeColour();
    System.out.println(colour);
    }
    }public class FinalTest{
    public static void main(String[] args){
    Apple apple = new Apple();
    apple.getcolour();
    }
    }要是final的话实现不了
      

  11.   

    “超出方法的生命期”没听过这个说法。
    finalize 是系统释放对象时执行的方法。
    System.gc()只是建议JVM在这个时候释放一下内存。一般在内存吃紧的时候会释放一下,具体是什么时候,没有定论。
      

  12.   

    final的局部变量会有你所谓的超出生命期的问题  在内部类中使用外部类的局部变量的时候就要将这个局部变量定义成final的。
    System.gc只是建议垃圾回收机制回收无用对象