Klasy abstrakcyjne
Klasa abstrakcyjna - oznaczona słowem kluczowym abstract to klasa, w której występuje jedna lub więcej metod abstrakcyjnych - również oznaczonych słowem kluczowym abstract. Metoda abstrakcyjna jest tylko zadeklarowana i nie ma implementacji.
Nie można utworzyć bezpośrednio obiektu klasy abstrakcyjnej. Klasa abstrakcyjna może być jedynie odziedziczona. W klasie potomnej muszą być zaimplementowane wszystkie abstrakcyjne metody zadeklarowane w nadrzędnej klasie abstrakcyjnej, albo klasa potomna również musi być oznaczona jako abstrakcyjna. Czyli w abstrakcyjnej klasie dziedziczącej (potomnej) mogą nie występować żadne metody abstrakcyjne - wystarczy, że dana klasa dziedzicząca od nadklasy abstrakcyjnej nie implementuje zadeklarowanej abstrakcyjnej metody, wówczas klasa ta również jest abstrakcyjna, mimo że nie zawiera jawnej deklaracji żadnej abstrakcyjnej metody.
W klasie abstrakcyjnej mogą występować dowolne atrybuty i metody z implementacją (metody nie-abstrakcyjne).
W klasie abstrakcyjnej mogą występować statyczne atrybuty i statyczne metody.
Klasa abstrakcyjna, w której występują wyłącznie metody abstrakcyjne powinna być zadeklarowana jako interfejs (patrz Interfejsy), a nie jako klasa abstrakcyjna.
Klasa abstrakcyjna może implementować interfejsy, wówczas nie musi zawierać implementacji wszystkich metod zadeklarowanych w implementowanych interfejsach.
Uwaga:
...natomiast klasa nie abstrakcyjna, która implementuje interfejs MUSI implementować wszystkie metody danego interfejsu.

Odpowiadający temu diagramowi kod w języku Java:
abstract class Animal {
abstract void move(); // metoda abstrakcyjna - w przypadku różnych zwierząt będzie różnie realizowana
}
class Bird extends Animal {
void fly() {
// Tutaj jest implementacja procesu poruszania się przy użyciu lotu
}
void move() { // implementacja metody move() zadeklarowanej w nadrzędnej klasie abstrakcyjnej
fly();
}
}
class Mammal extends Animal {
void walk() {
// Tutaj jest implementacja procesu chodzenia
}
void move() { // implementacja metody move() zadeklarowanej w nadrzędnej klasie abstrakcyjnej
walk();
}
}
Drugi przykład klasy abstrakcyjnej

Ta sama sytuacja przedstawiona przy użyciu kodu w języku Java:
abstract class PojazdSilnikowy {
float mocSilnika; // pole-atrybut wspólny dla wszystich pojazdów silnikowych
int maxLiczbaObrotówNaMinutę; // pole-atrybut wspólny dla wszystich pojazdów silnikowych
abstract void ustawObrotySilnika( int liczbaObrotówNaMinutę ) {
// metoda wspólna dla wszystkich pojazdów silnikowych
// ALE TUTAJ ABSTRAKCYJNA - pusta - bez implementacji, ponieważ dla każdego typu pojazdu silnikowego
// ustawienie określonych obrotów silnika będzie realizowane w zupełnie inny sposób
}
}
class PojazdSpalinowy extends PojazdSilnikowy {
// obiekt klasy PojazdSpalinowy jest jednocześnie obiektem klasy PojazdSilnikowy,
// czyli posiada wszystkie atrybuty i metody klasy PojazdSilnikowy
// i dodatkowo atrybuty i metody zdefiniowane tutaj:
int typPaliwa; // cecha - atrybut typowy wyłącznie dla pojazdów spalinowych
float pojemnośćZbiornikaPaliwa; // cecha - atrybut typowy wyłącznie dla pojazdów spalinowych
void zatankujPaliwo( ) { // funkcja - metoda typowa wyłącznie dla pojazdów spalinowych
[...implementacja metody...]
}
public void ustawObrotySilnika( int liczbaObrotówNaMinutę ) {
// Tutaj musi być implementacja tej metody, ponieważ jest ona zadeklarowana
// w macierzystej klasie abstrakcyjnej abstract class PojazdSilnikowy
[...implementacja metody...]
}
}
class PojazdElektryczny extends PojazdSilnikowy {
// obiekt klasy PojazdElektryczny jest jednocześnie obiektem klasy PojazdSilnikowy,
// czyli posiada wszystkie atrybuty i metody klasy PojazdSilnikowy
// i dodatkowo atrybuty i metody zdefiniowane tutaj:
float pojemnośćAkumulatorów; // cecha - atrybut typowy wyłącznie dla pojazdów elektrycznych
void naładujAkumulatory( ) { // funkcja - metoda typowa wyłącznie dla pojazdów elektrycznych
[...implementacja metody...]
}
public void ustawObrotySilnika( int liczbaObrotówNaMinutę ) {
// Tutaj musi być implementacja tej metody, ponieważ jest ona zadeklarowana
// w macierzystej klasie abstrakcyjnej abstract class PojazdSilnikowy
[...implementacja metody...]
}
}