是否可以在 Java 中扩展最终的 class?
Is it possible to extend a final class in 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.
但是,我有一个助手 class,我声明为 final
和 extends
另一个 class:
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 没有检测到任何错误。我已经测试了 class 并成功生成了 PDF,没有错误。
为什么我能够 extend
一个 final
class 而我在理论上应该不能?
(如果重要的话,我正在使用 Java 7。)
PDFGenerator
不能扩展,因为它被标记为最终的。您正在扩展未标记为最终的 PdfPageEventHelper
。
在我看来,PdfPageEventHelper
不是 final
(这个 javadoc 证实了这一点),所以你可以 extend
它,但你仍然不能扩展这个新的 class PDFGenerator
.
不过您可以尝试这样做:
private Object abacaba = new PDFGenerator() {
};
然后你会得到编译错误:
BlahBlah.java:n: error: cannot inherit from final PDFGenerator
Why was I able to extend a final class when I should not be able to in theory?
你不是。你最后的 class 扩展了另一个 class,它本身没有扩展。
final classes(String 是一个例子)'protected' 反对被继承。您不能扩展它们。
在您的示例中,尝试创建一个新的 class,它会扩展您的最终 class:
public class A extends PDFGenerator{}
看看会发生什么。
注意PDFGenerator extends PdfPageEventHelper
。这意味着 PDFGenerator 是最终的,但 PdfPageEventHelper 不是最终的 class。如果您尝试扩展 PDFGenerator,那么如果不是错误,您将得到异常。
PdfPageEventHelper
class 不是最终版本,因此您可以扩展 class。最后的class无法延期
如果您尝试扩展您已作为 final 制作的 PDFGenerator
class,那么您会发现您无法扩展它,因为其标记为 final.
不,绝对不是,final
关键字在 java 中已知,用于限制用户。它可以应用于变量方法和 class;
常量变量:(对于所有原始和字符串)如果将任何变量设为最终变量,则不能更改值。
方法:如果将任何方法设为最终方法,则无法覆盖它。
Class: 如果你将任何 class 设为 final,则不能扩展它。
完全取决于对象should/must设置为最终对象的要求。
使用final的原因:保证field/method或class,
的线程安全
您已经扩展了 PdfPageEventHelper
(我确定它一定不是最终的),PDFGenerator
被声明为最终的,所以 class PDFGenerator
不能被任何 class.Try 扩展 PDFGenerator
扩展,你将无法扩展。
标记为 final
的 Class
可以扩展另一个 Class
,但是不能扩展 final Class
。
这是一个例子:
这是允许的
public class Animal {
}
public final class Cat extends Animal {
}
这是不允许的
public final class Animal {
}
public class Cat extends Animal {
}
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.
但是,我有一个助手 class,我声明为 final
和 extends
另一个 class:
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 没有检测到任何错误。我已经测试了 class 并成功生成了 PDF,没有错误。
为什么我能够 extend
一个 final
class 而我在理论上应该不能?
(如果重要的话,我正在使用 Java 7。)
PDFGenerator
不能扩展,因为它被标记为最终的。您正在扩展未标记为最终的 PdfPageEventHelper
。
在我看来,PdfPageEventHelper
不是 final
(这个 javadoc 证实了这一点),所以你可以 extend
它,但你仍然不能扩展这个新的 class PDFGenerator
.
不过您可以尝试这样做:
private Object abacaba = new PDFGenerator() {
};
然后你会得到编译错误:
BlahBlah.java:n: error: cannot inherit from final PDFGenerator
Why was I able to extend a final class when I should not be able to in theory?
你不是。你最后的 class 扩展了另一个 class,它本身没有扩展。
final classes(String 是一个例子)'protected' 反对被继承。您不能扩展它们。
在您的示例中,尝试创建一个新的 class,它会扩展您的最终 class:
public class A extends PDFGenerator{}
看看会发生什么。
注意PDFGenerator extends PdfPageEventHelper
。这意味着 PDFGenerator 是最终的,但 PdfPageEventHelper 不是最终的 class。如果您尝试扩展 PDFGenerator,那么如果不是错误,您将得到异常。
PdfPageEventHelper
class 不是最终版本,因此您可以扩展 class。最后的class无法延期
如果您尝试扩展您已作为 final 制作的 PDFGenerator
class,那么您会发现您无法扩展它,因为其标记为 final.
不,绝对不是,final
关键字在 java 中已知,用于限制用户。它可以应用于变量方法和 class;
常量变量:(对于所有原始和字符串)如果将任何变量设为最终变量,则不能更改值。
方法:如果将任何方法设为最终方法,则无法覆盖它。
Class: 如果你将任何 class 设为 final,则不能扩展它。
完全取决于对象should/must设置为最终对象的要求。
使用final的原因:保证field/method或class,
的线程安全您已经扩展了 PdfPageEventHelper
(我确定它一定不是最终的),PDFGenerator
被声明为最终的,所以 class PDFGenerator
不能被任何 class.Try 扩展 PDFGenerator
扩展,你将无法扩展。
标记为 final
的 Class
可以扩展另一个 Class
,但是不能扩展 final Class
。
这是一个例子:
这是允许的
public class Animal {
}
public final class Cat extends Animal {
}
这是不允许的
public final class Animal {
}
public class Cat extends Animal {
}