2013-08-07 3 views
3

Я новичок в Java (чтение книг в течение 4 месяцев). Поэтому, наверное, мой вопрос может показаться слишком простым. Я понимаю, что абстрактные методы не имеют тела и не могут обеспечить реализациюАбстрактные методы не имеют тела?

Как это работает?

public abstract void fillRect (int x, int y, with, height); 

Я не поставил вопрос четко. У нас есть абстрактный метод. Почему он рисует прямоугольник, если я не предоставляю тело, просто параметры.

Например

public void paint (Graphics g) { 

g.fillRect (5, 5, 30, 30); 

} 
+3

Возможно, унаследованный класс будет реализован. Вы можете найти дополнительную информацию [здесь] (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) – ipeiro

+3

Это как просить - я знаю, что «кошка - животное», но как «кошка животное"? –

+3

Вам, кажется, не хватает точки абстрактных методов – keyser

ответ

2

Есть две вещи, которые вы должны знать

-declaration: Прототип или структура метода.

  ex:public int add(int a,int b) 

-defination: Объявление метода

  public int add(int a,int b){ 
      this.a=a; 
      this.b=b; 
      return a+b; 

      } 

Теперь абстрактный метод может иметь декларацию т.е. структуру или prototype.But она не может иметь Defination. Защиту следует выполнять в классе, который расширяет класс, содержащий абстрактный метод.

   class A{ 
         public abstract int add(int a,int b); //just declaration- nobody 

        } 
      class B extends A{ 

       /*must override add() method because it is abstract in class A i.e class B must have a body or defination of add()*/ 
         int a,b; 
         public int add(int a,int b) { 
          this.a=a; 
          this.b=b; 
          return a+b; 
         } 
      } 
      } 
+0

жаль быть болью. fillRect не обеспечивает защиту. Вы помещаете параметры и рисуете прямоугольник –

+0

, поэтому он выглядит следующим образом: (i) fillRect объявляется в классе Graphics в пакете java.awt. (ii) Класс апплета расширяет класс Graphics и, таким образом, защищает filEct(). (iii) Теперь u расширяет класс Applet, поэтому вы можете просто указать параметры, а тело fillRect() в классе Applet используется. Я ожидаю, что это должно быть правильно. Но все же я бы предложил сделать некоторые исследования ... –

7

Also read docs

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

0

Вы можете видеть абстрактные классы и абстрактные методы как своего рода контракт. Если у вас есть абстрактный класс (любой класс с абстрактным методом становится абстрактным классом), вы не можете создать объект этого класса.

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

Вот почему вы создать метод

public abstract void drive(); 

и реализовать его в своих подклассов автомобилей и Велосипедная.

0

следующие

public abstract void fillRect (int x, int y, with, height); 

не работает с абстрактным классом в одиночку только. Он будет работать с подклассом.

Сделайте подкласс абстрактного класса, а затем переопределите его с помощью реализации.

1

Допустим, что все животные имеют от 0 до п ног:

abstract Class Animal{ 

    public abstract int legCount(); 

} 

Class Dolphin extends Animal{ 

    public int legCount(){ return 0; } 

} 

Class Cat extends Animal{ 

    public int legCount(){ return 4; } 

} 

Class Man extends Animal{ 

    public int legCount(){ return 2; } 

} 

Каждый породы будет иметь другой способ подсчета ноги/лапы - вы просто не можете сделать для абстрактного животного, потому что не является абстрактным животным вообще, только бетон отдельных лиц.

1

Абстрактные методы, используемые при использовании одного метода в нескольких подклассах с различной реализацией.

Подкласс предназначен для обеспечения различной реализации абстрактных методов.

Примечание: = Один абстрактный класс расширяет еще один абстрактный класс.

примечание: = Мы не можем создать абстрактный класс objcet.

1

Если класс имеет абстрактный метод, вы не можете увести объект от него. Вы можете инициировать объект из производного класса, реализующего методы abstact.

Однако, вы можете указать, что аргумент какой-либо другой метод/функции из «абстрактного класса», например,

doSomethingWithIt(MyAbstractClass argument);

и метод doSomethingWithIt опирается только на том, что объекта предоставляет реализацию абстрактных методов в MyAbstractClass, но не полагается на , который производный класс обеспечивает реализацию.

Следовательно, абстрактные методы полезны, например, если вы хотите использовать разные реализации для одного и того же метода.

Это основная техника ОО, и я предполагаю, что все книги покрывают ее.

+0

Хороший ответ. благодаря –

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