可能重复:
此主题并未要求如何扩展
final
类。这是在问 为什么声明为final
的类可能会扩展另一个类。
来自this主题:
final
类只是无法扩展的类。
但是,我有一个帮助类,我声明为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而没有错误。
为什么我在理论上无法理解时能extend
final
课?
(如果重要的话,我正在使用Java 7.)
答案 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的原因:确保字段/方法或类的线程安全,