可以用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也不是。