Какова цель абстрактного метода? - PullRequest
2 голосов
/ 04 марта 2012
abstract public class car 
{   
    abstract void drive();
}

Как и во фрагменте кода выше, какова цель абстрактного метода в Java? Из того, что я могу собрать, по определению, им не разрешено иметь тела.

Ответы [ 5 ]

3 голосов
/ 04 марта 2012

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

3 голосов
/ 04 марта 2012

Объявляя реферат метода, вы не предоставляете реализацию, но заставляете конкретные классы, расширяющие класс car, предоставлять реализацию метода. Пример:

abstract public class Car {
    abstract void drive();
}

public class Audi extends Car {
    void drive() {
        System.out.println("I'm an Audi.");
    }
}

public class Volvo extends Car {
    void drive() {
        System.out.println("I'm a Volvo.");
    }
}

Невозможность предоставить реализацию приведет к ошибке компиляции.

Теперь, из этого примера вы можете легко увидеть, что, поскольку экземпляры Audi и Volvo могут быть размещены там, где ожидается Car, вы можете подключать различные варианты поведения во время выполнения (это называется полиморфизмом) :

void driveCar(Car car) {
    car.drive();
}

void testDrive() {
    driveCar(new Audi()); // prints I'm an Audi
    driveCar(new Volvo()); // prints I'm a Volvo
}
2 голосов
/ 04 марта 2012

Абстрактные методы должны быть реализованы в подклассах этого абстрактного класса.Например, ваш класс называется Shape и у него есть метод draw().Вы не можете реализовать этот метод для класса Shape, потому что вы действительно не знаете, как нарисовать Shape, поэтому вы делаете его abstract.И когда вы создаете, скажем, класс Triangle, который расширяет Shape - вы уверены, как нарисовать Triangle, и вы можете реализовать метод draw().Надеюсь, это поможет.

0 голосов
/ 04 марта 2012

Abstract работает как класс "shape", в котором должны быть реализованы все перечисленные методы (например, drive ()), иначе вы увидите некоторые ошибки при компиляции вашей программы.Этот класс не может быть создан, поэтому вам нужно унаследовать этот класс и установить все абстрактные методы.Преимущество использования abstract состоит в том, что вы можете иметь абстрактный класс в качестве класса shape, который вы можете наследовать некоторым классам без необходимости переписывать ваши методы, так как они уже есть.Не путайте переписывание с реализацией, потому что вы должны реализовать эти методы.Пример: у вас есть класс животных:

abstract public class Animal{
    abstract void eat();
    abstract void walk();
}

Итак, если вы унаследуете это, вам автоматически потребуется реализовать эти методы.Смотрите ниже:

public class Horse extends Animal{
        void eat() { //place the eating code }
        void walk() { /// place the walking code }
}

Надеюсь, вы понимаете!

0 голосов
/ 04 марта 2012

Чтобы заставить любой неабстрактный класс, унаследованный от него, реализовать метод, аналогичный интерфейсу.

...