可以用Java扩展最后一个类吗?

可以用Java扩展最后一个类吗?,java,inheritance,final,extends,Java,Inheritance,Final,Extends,关于可能的重复: 此线程不是询问如何扩展final类。它在问 为什么声明为final的类可能扩展另一个类 从线程: final类只是一个不能扩展的类 但是,我有一个helper类,我声明它是final,并且扩展了另一个类: public final class PDFGenerator extends PdfPageEventHelper { private static Font font; private PDFGenerator() { // preve

关于可能的重复:

此线程不是询问如何扩展
final
类。它在问 为什么声明为
final
的类可能扩展另一个类


从线程:

final
类只是一个不能扩展的类

但是,我有一个helper类,我声明它是
final
,并且
扩展了另一个类:

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,没有错误

为什么我能够
扩展
一门
期末
课程,而理论上我不能


(如果需要的话,我使用的是Java 7。)

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

在我看来,这不是
final
(这个javadoc确认了这一点),所以您可以
扩展它,但仍然不能扩展这个新类
PDFGenerator

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

private Object abacaba = new PDFGenerator() {
};
然后您将得到编译错误:

java:n:error:无法从最终PDFGenerator继承

为什么我可以延长最后一节课,而理论上我不应该这样做

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

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

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

public class A extends PDFGenerator{}

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

PdfPageEventHelper
类不是最终类,因此您可以扩展该类。不能扩展最后一个类


如果您试图扩展作为final的
PDFGenerator
类,那么您将看到无法扩展该类,因为它标记为final

否,而且显然不是,
final
关键字在java中被称为限制用户的关键字。它可以应用于变量方法和类

常量变量:(对于所有primitive和String)如果将任何变量设为final,则无法更改该值

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

类:如果将任何类设置为最终类,则无法扩展它

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


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

您已经扩展了
PdfPageEventHelper
(我确定它不能是final),
PDFGenerator
被清除为final,因此类
PDFGenerator
不能被任何类扩展。尝试扩展
PDFGenerator
您将无法扩展。

标记为
final
类可以扩展另一个
类,但是
final类
无法扩展

以下是一个例子:

这是允许的

public class Animal {

}

public final class Cat extends Animal {

}
public final class Animal {

}

public class Cat extends Animal {

}
这是不允许的

public class Animal {

}

public final class Cat extends Animal {

}
public final class Animal {

}

public class Cat extends Animal {

}

尝试扩展
PDFGenerator
。一个final类可以扩展类,但它不能被其他类扩展可能的重复:一个扩展另一个类的
final
类与另一个扩展
final
类的类不是一回事-恰恰相反。可能是英语的问题,不适用于Java:-)程序运行时会出现错误或异常。如果试图扩展final类,代码甚至无法编译。如果将基元变量设为final,则无法更改该值。如果将对象设为final,则不能重新引用它,但在许多情况下,可以更改值。是的,我指的是常量变量,据我所知(编程深度仍然未知)。此final意味着应该在定义对象的同时对其进行初始化。若进行集合,则可以添加对象,但不能重新初始化。也可以使用简单的pojo。只要它的所有成员不是最终成员,并提供setter,您就可以更改它的值。对于POJO,您需要
this.foo=foo
,这是不允许的。因为您有
final Object foo=this.some(),不是吗?我将给出一个例子:公共类Person(){private String name;公共类Person(String name){this.name=name;}public void setName(String name){this.name=name;}public String getName(){return this.name;}公共静态void main(String[]args){final Person p=new Person(“Bob”);System.out.println(p.getName());p.setName(“Kurt”);System.out.println(p.getName());}}}您可以更改该值,因为即使p是final,name也不是。