2015-05-06 4 views
0

On possible duplicate:Возможно ли продлить окончательный класс на Java?

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.

Однако, у меня есть вспомогательный класс, который я объявленную быть 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 a final класс, когда я не был в состоянии теоретически?

(Я использую Java 7, если это имеет значение.)

+5

Попробуйте * расширение * '' PDFGenerator. Последний класс может расширять классы, но он не может быть расширен другими классами. – TheLostMind

+0

Возможный дубликат: http://stackoverflow.com/questions/13294629/how-to-extend-a-final-class-in-java – mattfryercom

+1

Окончательный 'class, который расширяет другой класс, - это не то же самое, что другой класс, который расширяет класс' final' - это совсем наоборот. – Jesper

ответ

4

A Class обозначенный как final может распространяться еще Class, однако final Class не может быть расширена.

Вот пример:

Это позволило

public class Animal { 

} 

public final class Cat extends Animal { 

} 

Это не разрешено

public class SomeCat extends Cat { 

} 
2

PDFGenerator не может быть продлен, как отмечается окончательным. Вы расширяете PdfPageEventHelper, который не отмечен окончательным.

1

Мне кажется, что PdfPageEventHelper не final (и это Javadoc подтверждает это), так что вы можете extend его, до сих пор вы не можете продлить этот новый класс PDFGenerator.

Вы можете попытаться сделать это, хотя:

private Object abacaba = new PDFGenerator() { 
}; 

Тогда вы получите ошибку компиляции:

BlahBlah.java:n: error: cannot inherit from final PDFGenerator

1

Why was I able to extend a final class when I should not be able to in theory?

Вы не были. ваш последний класс расширил другой класс, он не был расширен сам.

окончательные классы (пример строки) являются «защищенными» от унаследованного. Вы не можете их продлить.

В вашем примере, попытайтесь создать новый класс, который делает расширить свой окончательный класс:

public class A extends PDFGenerator{} 

и посмотреть, что происходит.

1

Отметьте, что PDFGenerator extends PdfPageEventHelper. Это означает, что PDFGenerator является окончательным, но PdfPageEventHelper не является окончательным классом. Если вы попытаетесь расширить PDFGenerator, тогда вы получите исключения, если не ошибки.

+0

Ошибка или исключение возникает, когда запускается ваша программа. Если вы попытаетесь продлить окончательный класс, ваш код даже не будет компилироваться. – Aakash

1

PdfPageEventHelper класс не является окончательным и, следовательно, вы можете расширить этот класс. Окончательный класс не может быть расширен.

Если вы пытаетесь расширить PDFGenerator класс, который вы сделали в финале, то вы увидите, что вы не в состоянии продлить, что в его отмечен окончательный.

0

Нет и вызывающе нет, final ключевое слово известно в java, как используется для ограничения пользователя.Он может применяться к переменному методу и классу;

Константа Переменная: (для всех primtive и String) Если вы сделаете любую переменную окончательной, вы не сможете изменить значение.

Способ: Если вы сделаете какой-либо метод окончательным, вы не сможете его переопределить.

Класс: Если вы делаете какой-либо класс окончательным, вы не можете его продлить.

Это полностью зависит от требований, которые объект должен/должен устанавливать как окончательный.

Причина использования окончательным: Это обеспечивает безопасность потока для поля/методы или класса,

+0

Если вы сделаете PRIMITIVE переменную окончательной, вы не сможете изменить значение. если вы делаете OBJECT final, вы не можете повторно ссылаться на него, но во многих случаях вы сможете изменить значение. – Stultuske

+0

Да, я говорю о константной переменной. Насколько я знаю (глубина программирования пока неизвестна), это означает, что объект должен быть инициализирован в то же время, когда он будет определен. Если вы делаете коллекцию, вы можете добавить объект, но не можете повторно инициализировать. – Sarz

+0

простое pojo. пока все его члены не являются окончательными и предоставляют сеттеры, вы сможете изменить его ценность. – Stultuske

1

Вы расширили PdfPageEventHelper (Это не должно быть окончательным я уверен), PDFGenerator является decleared как окончательные, так класс PDFGenerator не может быть продлен любым классом. Продолжайте расширять PDFGenerator, и вы не сможете продлить его.

Смежные вопросы