Czy można stworzyć instancję klasy abstrakcyjnej?

TL;DR

Nie można utworzyć instancji klasy abstrakcyjnej.

Można to już wywnioskosować z nazwy – abstrakcyjna. Można to również bez problemu sprawdzić:

package org.blog;

public abstract class Entity {
    private Long id;

    public Entity(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

Podczas próby utworzenia obiektu Entity:

package org.blog;

public class Main {

    public static void main(String[] args) {
        Entity entity = new Entity(1L);
    }
}

Otrzymamy błąd:

Error:(6, 25) java: org.blog.Entity is abstract; cannot be instantiated

Zalety

Klasy abstrakcyjne mają swoje zastosowanie pomimo tego, że w Javie zazwyczaj wykorzystujemy interfejsy do określania abstrakcji.

Wykorzystuj się je czesto do stworzenia “bazy” dla jakiegoś modelu, ponieważ większość modeli mają coś ze sobą wspólnego np. ID tak jak to widać to na przykładzie poniżej.

package org.blog;

public class User extends Entity {
    private String login;
    private String email;

    public User(Long id, String login, String email) {
        super(id);
        this.login = login;
        this.email = email;
    }

    public String getLogin() {
        return login;
    }

    public String getEmail() {
        return email;
    }
}

Choć w niektórych serwisach też one mogą się przydać:

package org.blog;

public abstract class RemoteService {
    private final String url;

    public RemoteService(String url) {
        this.url = url;
    }

    public String getUrl() {
        return getBaseUrl() + "/" + url;
    }

    private String getBaseUrl() {
        //load base url from config file
    }
}

I na bazie klasy abstrakcyjnej możemy tworzyć kolejne serwisy, gdzie wszystkie będą bazować na tym samym base url zaciąganym z pliku konfiguracyjnego.

package org.blog;

import java.util.List;

public class FacebookUserService extends RemoteService{

    public FacebookUserService(String url) {
        super(url);
    }
    
    public List<User> getUsers() {
        // get users from facebook rest api
    }
}

Cały kod można zobaczyć tutaj.

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
1 Komentarz
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Jędrzejek
Jędrzejek
2 lat temu

W artykule należy zaznaczyć ze owszem, nie mozemy utworzyć instancji klasy abstrakcyjnej – takie jest jej przeznaczenie – ale mozemy np utworzyć jej instancje za pomocą klasy anonimowej lub za pomocą mechanizmu refleksji jednak jest to antypattern. Rekruter moze sprawdzać jak szeroko znamy temat.

1
0
Would love your thoughts, please comment.x