有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承在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.

但是,我有一个助手类,我声明它是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,没有错误

为什么我能上一门课,而理论上我不能

(如果有必要的话,我正在使用Java7。)


共 (6) 个答案

  1. # 1 楼答案

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

    你没有。你的最后一节课扩展了另一节课,而不是扩展了自己

    最后的类(例如String)是“受保护”的,不会被继承。你不能扩展它们

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

    public class A extends PDFGenerator{}
    

    看看会发生什么

  2. # 2 楼答案

    PdfPageEventHelper类不是最终的,因此您可以扩展该类。最后一节课不能延长

    如果您试图扩展PDFGenerator类,您已经将其作为final,那么您将看到,您无法将其扩展为标记为final的

  3. # 3 楼答案

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

    不过,您可以尝试这样做:

    private Object abacaba = new PDFGenerator() {
    };
    

    然后您将得到编译错误:

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

  4. # 4 楼答案

    PDFGenerator无法扩展,因为它被标记为final。您正在扩展未标记为final的PdfPageEventHelper

  5. # 5 楼答案

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

    下面是一个例子:

    这是允许的

    public class Animal {
    
    }
    
    public final class Cat extends Animal {
    
    }
    

    这是不允许的

    public final class Animal {
    
    }
    
    public class Cat extends Animal {
    
    }
    
  6. # 6 楼答案

    请注意,PDFGenerator extends PdfPageEventHelper。这意味着PDFGenerator是final类,但PdfPageEventHelper不是final类。如果您试图扩展PDFGGenerator,那么如果没有错误,您将得到异常