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

时间:2015-05-06 07:21:36

标签: java inheritance final extends

  

可能重复:

     

此主题并未要求如何扩展final类。这是在问   为什么声明为final的类可能会扩展另一个类。

来自this主题:

  

final类只是无法扩展的类。

但是,我有一个帮助类,我声明为finalextends另一个类:

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没有检测到任何错误。我已经测试了该类,并且成功生成了PDF而没有错误。

为什么我在理论上无法理解时能extend final课?

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

8 个答案:

答案 0 :(得分:7)

标记为Class的{​​{1}}可以扩展另一个final,但无法扩展Class

以下是一个例子:

允许这样做

final Class

这是允许

public class Animal {

}

public final class Cat extends Animal {

}

答案 1 :(得分:2)

PDFGenerator无法扩展,因为它标记为final。您正在扩展PdfPageEventHelper,但未标记为最终版。

答案 2 :(得分:1)

在我看来,PdfPageEventHelper不是final(这个javadoc确认了它),所以你可以extend它,你仍然不能扩展这个新类{{ 1}}。

你可以尝试这样做:

PDFGenerator

然后你会得到编译错误:

  

BlahBlah.java:n:错误:无法从最终的PDFGenerator继承

答案 3 :(得分:1)

  

为什么我能够在理论上无法扩展最后一堂课?

你不是。你的最后一堂课扩展了另一堂课,但没有扩展。

final类(String是一个示例)被“保护”以防止被继承。你不能扩展它们。

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

public class A extends PDFGenerator{}

看看会发生什么。

答案 4 :(得分:1)

请注意 example.com 。这意味着PDFGenerator是最终的,但PdfPageEventHelper不是最终类。如果您尝试扩展PDFGenerator,那么如果没有错误,您将获得例外。

答案 5 :(得分:1)

(in this case port 5000)类不是最终的,因此您可以扩展该类。最后一堂课不能延长。

如果您尝试将PdfPageEventHelper课程扩展为最终成绩,那么您将看到您无法将其扩展为标记为最终的课程。

答案 6 :(得分:1)

你扩展了PdfPageEventHelper(绝对不能是最终的确定),PDFGenerator被删除为最终版,因此课程PDFGenerator无法延期通过任何类别。尝试延长PDFGenerator您无法扩展。

答案 7 :(得分:0)

否且肯定不是,final关键字在java中已知用于限制用户。它可以应用于变量方法和类;

常量变量:(适用于所有原始字符串和字符串)如果您将任何变量设为最终变量,则无法更改该值。

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

分类:如果您将任何课程作为最终成绩,则无法对其进行扩展。

完全取决于哪些对象应该/必须设置为最终的要求。

使用final的原因:确保字段/方法或类的线程安全,