无法在不同对象上调用finalize()方法

时间:2014-06-02 10:44:36

标签: java eclipse finalize

无法在不同的Object上调用finalize()方法。我正在使用Eclipse。

我创建了StringBuilder的对象

StringBuilder sb= new StringBuilder("abc");
sb.finalize(); // compile time error The method finalize() from the type Object is not visible    

我在每个

中创建了一个带有main方法的2类Test和MyTest
  public class Test {

          public  static  void main throws Throwable(String [] args ){

                  Test t= new  Test();
                  t.finalize();    //ok no  error

                  MyTest mt= new MyTest();

                  mt.finalize() // compile time  error  The method finalize() from the type Object is not visible
          }
    }

我有些疑问:

1)由于对象是所有java类的超类,因此必须使用final方法,因为finalize方法受到保护。那为什么eclipse会出现这样的错误?

2)这是eclipse中的一个错误吗?

请有人详细说明这个概念。

2 个答案:

答案 0 :(得分:4)

如果您要查看对象的API,您会发现该方法的可见性为protected NOT public

  

protected修饰符指定只能在其自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问该成员。 source

对于protected,只允许同一个包或子类中的类访问该方法,否则会导致编译器错误。

public class Test {

    public  static  void main throws Throwable(String [] args ){
        Test t= new  Test();
        t.finalize();    //ok no  error
    }
}

您要在课程finalize内拨打Test,因此finalize可见,因为Test隐含地是Object的子类。

public class Test {

    public  static  void main throws Throwable(String [] args ){

        MyTest mt= new MyTest();
        mt.finalize() // compile time  error  The method finalize() from the type Object is not visible
    }
}

您在此处调用类MyTest上的方法,因为这不是来自同一个类,也不是来自java.lang包中finalize方法不可见,因此编译错误。

答案 1 :(得分:1)

Object#finalize()不应该在外部调用。

来自Javadocs

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup.