CodeGym /Java блог /Случаен /Абстрактни методи и класове на Java
John Squirrels
Ниво
San Francisco

Абстрактни методи и класове на Java

Публикувано в групата
Абстрактните методи са мощен инструмент на Java и дават на този обектно-ориентиран език още повече възможности, когато става въпрос за полиморфизъм. Абстрактен метод на Java може да се използва за създаване на основна рамка за цяла програма и да ви позволи да коригирате според нуждите.Java Abstract Method и Вие - 1

Какво е абстрактен метод?

Абстрактен метод е метод, който няма реализация. Тоест, той просто има декларация, така че знаете името, типа на връщането и променливите, които ще приеме. Ето пример за основен абстрактен метод:

public abstract int example(int a1, int a2);
Когато погледнете този метод, можете да кажете, че той връща цяло число и приема две цели числа като аргумент. Това, което не можете да кажете, е How се прилага този метод. Това е така, защото за да го приложите, трябва да го отмените. Когато създавате абстрактен метод в java, трябва да се придържате към няколко насоки or вашата програма няма да се компorра правилно. Помня:
  • Абстрактните методи на Java нямат реализация. Тоест те никога не трябва да бъдат последвани от фигурни скоби и тяло, което казва How трябва да се използва методът. Просто завършва с точка и запетая.

  • Ако създадете абстрактен метод, той може да бъде поставен само в абстрактен клас. Тоест, не можете да имате конкретен клас, който има абстрактен метод вътре в него.
    аз Като странична бележка, ако имате абстрактен клас, той може да съдържа конструктори. Не е необходимо обаче да има абстрактен метод.

  • Когато конкретен клас разширява абстрактен клас, той също трябва да имплементира всички абстрактни методи на родителския клас or не може да бъде конкретен и трябва да бъде обявен за абстрактен.

Последните две може да са малко объркващи, така че нека изясним това веднага.

Разширяване на абстрактни Java класове

Да кажем, че искаме да напишем програма за основни форми, която ще върне периметър и площ. Така че създаваме родителски абстрактен клас. Но тъй като всяка форма има свои собствени правила, всяка трябва да се изчислява по различен начин, така че ние пишем абстрактния клас Shape така:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
Сега, ако искаме действително да използваме тези абстрактни методи, трябва да разширим абстрактния родителски клас на Java Shape и след това да инстанцираме методите. Така че всеки конкретен клас трябва да имплементира абстрактните методи за площ и периметър.

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
Тогава изходът от конзолата изглежда така:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Обърнете внимание, че класът Quadrilateral не трябва да инстанцира Shape(String name) конструктор от родителския клас Shape . Това е така, защото това не е абстрактен метод. Въпреки това, ако сте внедрor само област or периметър в клас, новият клас ще трябва да бъде абстрактен, защото не включва и двете. Можете също да използвате абстрактни методи в интерфейси.

Абстрактни Java методи с интерфейси

Нека набързо да прегледаме Howво е интерфейс и How се различава от абстрактен клас. В интерфейса всички променливи, декларирани в интерфейса, са публични, статични и окончателни. От друга страна, абстрактните класове имат само нефинални променливи. Всичко в интерфейса е публично по подразбиране. Един абстрактен клас може да има private, protected, public и т.н. И накрая, класът не разширява интерфейс, той го имплементира. Преди JDK 8 интерфейсът не можеше да има нищо друго освен абстрактни методи. Сега интерфейсът може да има методи по подразбиране и статични. Поради това най-добрите практики се отдалечиха от използването на абстрактни методи като разширяеми шаблони и се фокусираха върху интерфейсите и тяхното внедряване. Така че, ако трябваше да създадете Shape като интерфейс и след това да го внедрите като Quadrilateral, How би изглеждало? Първо, ще трябва да премахнете конструктора Shape(String name) . Ще изглежда така само с двата абстрактни метода:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
И накрая, използването на новия Quadrilateral , тъй като той прилага интерфейса Shape , би било почти същото:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
И разпечатката на конзолата ще изглежда така:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Ако искате да проучите повече за разликите между интерфейси и абстрактни класове, можете да намерите повече информация тук.

Но защо да използвате абстрактни Java методи?

Има много причини, поради които се използват абстрактни методи в Java и защо трябва да се чувствате комфортно с използването им. Ето три бързи причини защо трябва да ги използвате, когато е подходящо.
  1. Избягвайте дублиране на усorя – погледнете назад към нашия пример за codeиране; представете си, че вие ​​и вашият екип трябва да създадете класове за форми, различни от правоъгълник. Колко различни начина можете да измислите, за да проектирате този клас? десет? петнадесет? И това е прост проблем. Представете си нещо много по-сложно. Вие и вашият екип можете да измислите стотици начини. Тогава ще бъдете изпequalsи пред трудната задача да ги вплетете заедно в последователна програма. Това ни води до следващата ни точка: дефиниране на изпълнението.

  2. Абстрактните методи в Java позволяват дефинирането на използване и внедряване – Когато използвате абстрактен клас or интерфейс и по дизайн абстрактни методи, вие определяте How другите хора ще взаимодействат с вашия интерфейс. Това им позволява да знаят Howви променливи трябва да използват и Howви видове връщане могат да очакват.
    Въпреки че те могат да ги заменят и да създадат конкретни класове, които внедряват вашия интерфейс по уникален начин, вие все още определяте в камък основната употреба на вашия code. Ако някой иска да внедри Shape, тогава трябва да отмени or внедри Howто периметъра, така и площта.

  3. Четивност и отстраняване на грешки – наличието на абстрактни методи ще подобри четливостта на вашия code. Когато пишете клас, който имплементира интерфейс, знаете Howво да търсите. Знаете, че всеки абстрактен метод в интерфейса ще бъде в изпълнението и това го прави по-лесен за четене и проследяване на грешки. Абстрактните методи са само началото на обучението How правилно да се използва полиморфизъм в Java и други обектно-ориентирани езици. Когато започнете да ги разбирате и използвате, ще започне изцяло нова глава от вашето codeиращо пътуване.

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION