继承在Java中是否可以扩展最后一个类?
On possible duplicate:
This thread is not asking how to extend a
final
class. It is asking why a class declared asfinal
could possibly extend another class.
从this线程:
A
final
class is simply a class that can't be extended.
但是,我有一个助手类,我声明它是final
和extends
另一个类:
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。)
# 1 楼答案
你没有。你的最后一节课扩展了另一节课,而不是扩展了自己
最后的类(例如String)是“受保护”的,不会被继承。你不能扩展它们
在您的示例中,尝试创建一个新类,它确实扩展了您的最终类:
看看会发生什么
# 2 楼答案
PdfPageEventHelper
类不是最终的,因此您可以扩展该类。最后一节课不能延长如果您试图扩展
PDFGenerator
类,您已经将其作为final,那么您将看到,您无法将其扩展为标记为final的# 3 楼答案
在我看来,^{} 不是
final
(这个javadoc证实了这一点),所以你可以extend
它,但你仍然不能扩展这个新类PDFGenerator
不过,您可以尝试这样做:
然后您将得到编译错误:
# 4 楼答案
PDFGenerator
无法扩展,因为它被标记为final。您正在扩展未标记为final的PdfPageEventHelper
# 5 楼答案
标记为
final
的Class
可以扩展另一个Class
,但是final Class
不能扩展下面是一个例子:
这是允许的
这是不允许的
# 6 楼答案
请注意,
PDFGenerator extends PdfPageEventHelper
。这意味着PDFGenerator是final类,但PdfPageEventHelper不是final类。如果您试图扩展PDFGGenerator,那么如果没有错误,您将得到异常