如果不使用final关键字,如何才能使类不可扩展?

时间:2011-08-01 12:17:03

标签: java class

如果没有final关键字,我怎样才能做到这一点?我必须改变什么构造函数?

 public final class testName {
     testName() {
        //do something
     }
 }

3 个答案:

答案 0 :(得分:12)

如果您制作了所有的构造函数private,那么该类也将不再可扩展。

public class TestName {

    private TestName(){do something}

}

要了解原因,请查看第3.4.4.1节'The default constructor'。通过声明您的私有默认构造函数,该段落的最后一句包含:

  

这样的[private]构造函数永远不能从类外部调用,但它会阻止自动插入默认构造函数。

通过在超类中声明一个不可访问的构造函数,有效地实现了子类可以调用的(其他)构造函数,因此Java阻止了编译。

答案 1 :(得分:3)

如果构造函数由于在“// do something”注释中插入代码而失败,则抛出异常。

其他选项 - final类或私有构造函数 - 通常是更好的选择,因为它们在编译时报告错误,而不是运行时。但是如果失败应该是有条件的,或者有人正在测试你的知识,那么抛出异常是通常的方法。

[专家问题:如果构造函数抛出异常,那么程序是否仍然可以最终引用新创建的实例? (提示:是的。)]

答案 2 :(得分:0)

您可以创建该类的私有构造函数。