Причины, по которым абстрактные и строгие ключевые слова не могут использоваться вместе в объявлении метода?
Я читаю SCJP Кэтрин Сьерра.
Я понимаю, что абстрактные и окончательные ключевые слова не могут использоваться вместе, потому что они противоречат друг другу, как объяснено в книге.
Тем не менее, я не понимаю, почему строгие ключевые слова и абстрактные ключевые слова нельзя использовать вместе.
Я пока не знаю, как именно работает ключевое слово strictfp в Java.
В моих мыслях можно было бы объявить абстрактный метод strictfp, иметь подкласс и реализовать этот метод в "строгом режиме".
По какой причине эти ключевые слова не ладят друг с другом?
РЕДАКТИРОВАТЬ
Я дважды проверил книгу, и она наверняка говорит
Поскольку методы интерфейса являются абстрактными, они не могут быть помечены как final, strictfp или native.
от SCJP Кэтрин Сьерра. страница 21
Также моя IDE(Eclipse Juno) говорит, что я не могу использовать абстрактные и строгие ключевые слова вместе.
Хм, а почему бы и нет?
2 ответа
Кэтрин Сьерра, вероятно, говорила об абстрактных методах. Не имеет смысла делать абстрактный метод strictfp
поскольку абстрактный метод просто предоставляет сигнатуру метода (и бросает предложение, если оно есть), для его использования нам необходимо переопределить его в подклассе с помощью конкретного метода, и этот метод будет иметь свои собственные модификаторы, которые будут переопределять модификаторы его родительского метода. То есть методы не наследуют модификаторы.
Обратите внимание, что это не только sctriptfp
, но никакие модификаторы не допускаются для абстрактных методов, кроме public
а также protected
, Вы получите ошибку во время компиляции, если попытаетесь.
Надеюсь, вы уже получили свой ответ, если нет, то он может быть полезен для вас.
Я столкнулся с подобным вопросом, заданным на форуме.
Причина по которой abstract
а также strictfp
не может сидеть вместе в объявлении метода, потому что abstract
говорит, что метод не должен быть реализован текущим классом, и он должен быть реализован конкретным подклассом и strictfp
говорит, что метод должен быть реализован (должен иметь тело) классом, где strictfp
используется. Таким образом, в этом случае оба ключевых слова противоречат друг другу, поэтому оба не допускаются вместе в объявлениях методов.
Но это абсолютно законно использовать abstract
а также strictfp
перед уроком. Что-то вроде
public abstract strictfp class MyAbstractClass{} //is ok
Если вы объявите strictfp в абстрактном классе, тогда весь его метод будет по умолчанию строгим. Запомните все конкретные методы в классе, а не абстрактные методы.
Запустите приведенный ниже пример и посмотрите ОП:
import java.lang.reflect.*;
public abstract strictfp class AbstractStrictfp
{
public abstract void abstractMethod();
public void concreteMethod(){};
public static void main(String args[]){
Method methods[] = AbstractStrictfp.class.getMethods();
for(Method method : methods){
System.out.println("Method Name::"+method.getName());
System.out.println("Modifiers::"+Modifier.toString(method.getModifiers()));
System.out.println();
}
}
}