Какова роль абстрактного ключевого слова в модификаторе и типе некоторых методов в java api? [Дубликат]

Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:

object o = null;
DateTime d = (DateTime)o;

Он выкинет NullReferenceException в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.

Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:

" />

Здесь SelectedDate на самом деле является свойством - типа DateTime - типа Calendar Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...

1
задан letsc 16 January 2011 в 20:31
поделиться

6 ответов

Ключевое слово abstract не имеет значения. Единственное, о чем говорится в спецификации:

Для совместимости со старыми версиями платформы Java разрешено, но не рекомендуется, в качестве стиля, избыточно указывать абстрактный модификатор для методов, объявленных в интерфейсы.

Быстрый тест показывает, что ключевое слово действительно не имеет значения. Эти два являются действительными:

abstract class A implements B { }
interface B {
    public void meth();
}

abstract class A implements B { }
interface B {
    public abstract void meth();
}

, и оба этих параметра являются недопустимыми:

class A implements B { }
interface B {
    public void meth();
}

class A implements B { }
interface B {
    public abstract void meth();
}
A.java:1: A is not abstract and does not override abstract method meth() in B
class A implements B { }
^
1 error
0
ответ дан Artefacto 28 August 2018 в 06:27
поделиться

эффективно абстрактный класс является частичным интерфейсом и / или все интерфейсы являются абстрактными классами.

interface Sheet{
  public double computeArea();
  public abstract double computePerimter();
} 

Точно так же, как

interface Sheet{
  public double computeArea();
  public double computePerimter();
} 

Абстрактные классы - это классы, которые частично реализованы и не могут быть созданы, потому что они не полностью реализованы. Они похожи на интерфейсы, но они определенными телами для некоторых методов, но обычно не все (не имеет значения, так как вы объявили его абстрактным). Что он делает, так это позволить вам выполнить часть работы и сделать все остальное производным классом. Это не похоже на интерфейс, где производный класс должен реализовать все методы (которые иногда могут быть утомительными).

0
ответ дан AbstractDissonance 28 August 2018 в 06:27
поделиться

Извлечение из Спецификация языка Java :

Каждое объявление метода в теле интерфейса неявно абстрактно, поэтому его тело всегда представлено точкой с запятой, а не блоком.

Каждое объявление метода в теле интерфейса неявно открыто.

Для совместимости со старыми версиями платформы Java разрешено, но не рекомендуется

Книга должна быть ошибочной или, по крайней мере, сделана путаница.

Изменить: Единственное, что я могу придумать, это то, что вы можете реализовать интерфейс и сохранить абстрактный метод, чтобы добавить Javadoc к нему.

interface Foo {
  void bar();
}

abstract class FooImpl implements Foo {
  /**
   * I want to put documentation here without implementing the method.
   */
  abstract void bar();
}

Но это не влияет на поведение кода.

1
ответ дан biziclop 28 August 2018 в 06:27
поделиться

Насколько я знаю, каждый метод, определенный в интерфейсе, неявно abstractpublic). Но если вы объявите свой класс реализации как abstract, вы можете пропустить реализацию одного или нескольких методов, определенных в реализованном интерфейсе.

abstract class Sphere implements Sheet {
 public double computeArea() {
    // do something
}

// skip computePerimeter():
// public double computerPerimeter();
}
0
ответ дан Claude 28 August 2018 в 06:27
поделиться

Если вы реализуете интерфейс, вам нужно реализовать методы интерфейса или объявить их абстрактными, что сделает класс абстрактным.

0
ответ дан Navi 28 August 2018 в 06:27
поделиться

Прежде всего, если ваш класс содержит метод abstract, он должен быть объявлен как abstract. Например: abstract class Sphere. Во-вторых, классы abstract не могут быть созданы. Подумайте о abstract классах как еще не законченных и не полностью пригодных для использования. В interface можно думать о классе, который имеет все методы неявно abstract и public. Он определяет поведение не для реализации.

1
ответ дан Petar Minchev 28 August 2018 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: