是否可以在 Java 中扩展最终的 class?

Is it possible to extend a final class in Java?

On possible duplicate:

This thread is not asking how to extend a final class. It is asking why a class declared as final could possibly extend another class.


来自 this 线程:

A final class is simply a class that can't be extended.

但是,我有一个助手 class,我声明为 finalextends 另一个 class:

public final class PDFGenerator extends PdfPageEventHelper {
    private static Font font;

    private PDFGenerator() {
        // prevent instantiation
    }

    static {
        try {
            BaseFont baseFont = BaseFont.createFont(
                "/Trebuchet MS.ttf",
                BaseFont.WINANSI,
                BaseFont.EMBEDDED
            );

            font = new Font(baseFont, 9);

        } catch(DocumentException de) { 
            de.printStackTrace();

        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public static ByteArrayOutputStream generatePDF() throws DocumentException {            
        Document doc = new Document();
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();        
        PdfWriter pdfWriter = PdfWriter.getInstance(doc, baosPDF);

        try {           
            // create pdf

        } catch(DocumentException de) {
            baosPDF.reset();
            throw de;

        } finally {
            if(doc != null) {
                doc.close();
            }

            if(pdfWriter != null) {
                pdfWriter.close();
            }
        }

        return baosPDF;
    }
}

Eclipse 没有检测到任何错误。我已经测试了 class 并成功生成了 PDF,没有错误。

为什么我能够 extend 一个 final class 而我在理论上应该不能?

(如果重要的话,我正在使用 Java 7。)

PDFGenerator 不能扩展,因为它被标记为最终的。您正在扩展未标记为最终的 PdfPageEventHelper

在我看来,PdfPageEventHelper 不是 final(这个 javadoc 证实了这一点),所以你可以 extend 它,但你仍然不能扩展这个新的 class PDFGenerator.

不过您可以尝试这样做:

private Object abacaba = new PDFGenerator() {
};

然后你会得到编译错误:

BlahBlah.java:n: error: cannot inherit from final PDFGenerator

Why was I able to extend a final class when I should not be able to in theory?

你不是。你最后的 class 扩展了另一个 class,它本身没有扩展。

final classes(String 是一个例子)'protected' 反对被继承。您不能扩展它们。

在您的示例中,尝试创建一个新的 class,它会扩展您的最终 class:

public class A extends PDFGenerator{}

看看会发生什么。

注意PDFGenerator extends PdfPageEventHelper。这意味着 PDFGenerator 是最终的,但 PdfPageEventHelper 不是最终的 class。如果您尝试扩展 PDFGenerator,那么如果不是错误,您将得到异常。

PdfPageEventHelper class 不是最终版本,因此您可以扩展 class。最后的class无法延期

如果您尝试扩展您已作为 final 制作的 PDFGenerator class,那么您会发现您无法扩展它,因为其标记为 final.

不,绝对不是,final 关键字在 java 中已知,用于限制用户。它可以应用于变量方法和 class;

常量变量:(对于所有原始和字符串)如果将任何变量设为最终变量,则不能更改值。

方法:如果将任何方法设为最终方法,则无法覆盖它。

Class: 如果你将任何 class 设为 final,则不能扩展它。

完全取决于对象should/must设置为最终对象的要求。

使用final的原因:保证field/method或class,

的线程安全

您已经扩展了 PdfPageEventHelper(我确定它一定不是最终的),PDFGenerator 被声明为最终的,所以 class PDFGenerator 不能被任何 class.Try 扩展 PDFGenerator 扩展,你将无法扩展。

标记为 finalClass 可以扩展另一个 Class,但是不能扩展 final Class

这是一个例子:

这是允许的

public class Animal {

}

public final class Cat extends Animal {

}

这是不允许的

public final class Animal {

}

public class Cat extends Animal {

}