почему мы не должны использовать статические и абстрактные для одного метода? - PullRequest
3 голосов
/ 07 января 2010

почему мы не должны использовать статические и абстрактные для одного метода?

Ответы [ 4 ]

7 голосов
/ 07 января 2010

ключевое слово static определено так, что метод может вызываться по имени класса, а не по объекту. это означает, что метод должен иметь какое-то определение. но абстрактный означает, что у вас нет никаких подробностей о том, что делает метод, это как говорится **Abstract**. Когда вы наследуете или расширяете класс, вы можете определить метод.

Подумайте об интерфейсе.

Если вы спрашиваете о наличии статического метода внутри абстрактного класса, это другая история. Абстрактный класс, по сути, как уже упоминалось, является интерфейсом и содержит только шаблон, скажем, функций, которые вы должны позднее реализовать путем наследования / расширения класса. Как только вы расширяете этот класс, статический метод не приходит вместе с ним (то есть по умолчанию, если модификатор доступа не является открытым / защищенным).

5 голосов
/ 07 января 2010

Ключевое слово abstract означает, что дочерние классы должны переопределять метод - это (один из способов) Java поддерживает полиморфизм. Если вы хотите сделать так, чтобы подклассы не могли переопределить метод, вы помечаете его как финальный. Таким образом, было бы невозможно иметь метод «абстрактного финала», поскольку они полностью противоположны друг другу.

ключевое слово static также подразумевает final - все статические методы также являются окончательными. Таким образом, невозможно иметь метод, который является как статическим, так и абстрактным, поскольку вы сможете создать метод, который является абстрактным и окончательным.

Причина того, что static является окончательным, заключается в том, что он привязан к классу, а не к экземпляру. Это означает, что компилятор ищет его во время компиляции, а не во время выполнения, чтобы определить, какой метод вызывать. Причина, что это так? Произвольное решение, которое приняли дизайнеры Java - они могли допустить переопределение статического метода, но решили этого не делать. У меня нет особого понимания, почему, к сожалению, один из них выбрал другое.

5 голосов
/ 07 января 2010

A статический метод не наследуется . Поэтому делать его абстрактным - это нонсенс.

0 голосов
/ 07 января 2010

Как уже говорили, static + abstract - это нонсенс в Java. Но были (редкие) случаи, когда я хотел, чтобы я мог сделать именно это.

Результат, который я искал, состоял в том, чтобы сказать: «все конкретные классы, которые расширяют этот абстрактный класс (или реализуют этот интерфейс), должны предоставлять статический метод с этой сигнатурой». Эта возможность позволит этим классам предоставлять метаинформацию о себе.

Обычно я получаю метод экземпляра в этих случаях. Если вы оговариваете, что конкретные реализации должны поддерживать конструктор по умолчанию (без аргументов), вы можете сделать ...

MyInterface obj = MyClassThatImplementsMyInterface.newInstance();
obj.invokeTheMethodIWishWasBothStaticAndAbstract();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...