Dlaczego konstruktory nie mogą być ostateczne, statyczne czy abstrakcyjne?

Dlaczego konstruktory nie mogą być ostateczne, statyczne lub abstrakcyjne w Javie?

Na przykład, czy możesz mi wyjaśnić, dlaczego to nie jest ważne?
public class K {

    abstract public K() {
        // ...
    }
}
Author: hat, 2012-02-28

11 answers

Kiedy ustawisz metodę jako final oznacza to: " nie chcę, aby jakaś Klasa ją nadpisywała." ale zgodnie ze specyfikacją języka Java:

JLS 8.8 - " deklaracje konstruktorów nie są członkami. Nigdy nie są dziedziczone i dlatego nie podlegają ukrywaniu lub nadpisywaniu."

Kiedy ustawiasz metodę jako abstract oznacza to: " ta metoda nie ma ciała i powinna być zaimplementowana w klasie potomnej." ale konstruktor nazywa się domyślnie, gdy używane jest słowo kluczowe new, więc nie może mu zabraknąć ciała.

Gdy ustawisz metodę jako static oznacza to: " ta metoda należy do klasy, a nie do konkretnego obiektu." ale konstruktor jest niejawnie wywoływany do inicjalizacji obiektu, więc nie ma sensu mieć statycznego konstruktora.

 169
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-04 00:14:16

Pytanie naprawdę brzmi, dlaczego chcesz, aby konstruktor był static or abstract or final.

Konstruktory nie są dziedziczone, więc nie można ich nadpisać. aby mieć konstruktor końcowy

Konstruktor jest wywoływany automatycznie, gdy instancja klasy jest utworzony, ma dostęp do pól instancji klasy. Co będzie użycie konstruktora statycznego.

Konstruktor nie może być nadpisany więc co zrobisz z abstrakcją konstruktor.

 40
Author: RanRag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 06:40:15

Konstruktor Javy jest implicite finalny, statyczne / niestatyczne aspekty jego semantyki są implicite1, i jest bezsensowne aby konstruktor Javy był abstrakcyjny.

Oznacza to, że modyfikatory final i static byłyby zbędne, a słowo kluczowe abstract nie miałoby żadnego znaczenia.

Oczywiście projektanci Javy nie widzieli w żadnym punkcie dopuszczania zbędnych i / lub bezsensownych modyfikatorów dostępu do konstruktorów ... więc te nie są dozwolone przez gramatykę Javy.

Na marginesie: szkoda, że nie zrobili tego samego wywołania dla metod interfejsu, gdzie modyfikatory public i abstract są również zbędne, ale i tak dozwolone. Być może istnieje jakiś (starożytny) historyczny powód tego. Ale tak czy inaczej, nie da się tego naprawić bez renderowania (prawdopodobnie) milionów istniejących programów Java nieskompilowalnych.


1 - w rzeczywistości konstruktory mają mieszankę semantyki statycznej i niestatycznej. Ty nie można "wywołać" konstruktora na instancji i nie są one dziedziczone lub nadpisywalne. Jest to podobne do sposobu działania metod statycznych. Z drugiej strony, ciało konstruktora może odwoływać się do metod this i wywoływać instancje ... jak metoda instancji. Do tego dochodzi łańcuchowanie konstruktorów, które jest unikalne dla konstruktorów. Ale prawdziwe jest to, że te semantyki są stałe i nie ma sensu zezwalać na redundantny i prawdopodobnie mylący modyfikator static.

 16
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-04 00:17:29
  • public konstruktor : obiekty mogą być tworzone w dowolnym miejscu.

  • Konstruktor domyślny : obiekty mogą być tworzone tylko w tym samym pakiecie.

  • protected Konstruktor : obiekty mogą być tworzone przez klasy spoza pakietu tylko wtedy, gdy jest to podklasa.

  • private konstruktor : obiekt może być utworzony tylko wewnątrz klasy (np. podczas implementacji Singletona).

The static, final i abstract słowa kluczowe nie mają znaczenia dla konstruktora, ponieważ:

  • static członkowie należą do klasy, ale konstruktor jest potrzebny do utworzenia obiektu.

  • Klasa abstract jest częściowo zaimplementowaną klasą, która zawiera abstrakcyjne metody do zaimplementowania w klasie potomnej.

  • final ogranicza modyfikację: zmienne stają się stałe, metody nie mogą być nadpisywane, A klasy nie mogą być dziedziczone.

 9
Author: mahesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-02 13:23:13

Final: Ponieważ i tak nie możesz nadpisać/rozszerzyć konstruktora. Możesz rozszerzyć klasę (aby zapobiec jej ostateczności) lub nadpisać metodę( aby zapobiec jej ostateczności), ale nie ma czegoś takiego dla konstruktorów.

Static: jeśli spojrzysz na wykonanie konstruktor nie jest statyczny (może uzyskać dostęp do pól instancji), jeśli spojrzysz na stronę wywołującą jest (w pewnym sensie) statyczny (wywołujesz go bez instancji. Trudno sobie wyobrazić konstruktora będąc całkowicie statycznym lub nie statycznym i nie mając semantycznego rozdziału między tymi dwoma rzeczami, nie ma sensu odróżniać ich modyfikatorem.

Abstract : Abstract ma sens tylko w obecności nadpisywania/rozszerzenia, więc ten sam argument co dla 'final' stosuje się

 6
Author: Jens Schauder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 08:59:46

Żaden Konstruktor nie może być zadeklarowany jako ostateczny. Twój kompilator zawsze wyświetli błąd typu " modyfikator końcowy niedozwolony" Final, gdy zostanie zastosowany do metod, oznacza, że metoda nie może być nadpisana w podklasie. Konstruktory nie są zwykłymi metodami. (obowiązują różne zasady) Ponadto konstruktory nigdy nie są dziedziczone. Nie ma więc sensu ogłaszać jej ostatecznej wersji.

 6
Author: Jimit Rupani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 12:54:00
  1. konstruktory nie są zwykłymi metodami. (obowiązują różne zasady)
  2. dodatkowo konstruktory nigdy nie są dziedziczone. Nie ma więc sensu ogłaszać jej ostatecznej wersji. żaden Konstruktor nie może być uznany za ostateczny. Twój kompilator zawsze poda błąd typu "modifer final not allowed"
  3. Sprawdź JLS sekcja 8.8.3 (dokumenty JLS & API powinny być jednym z twoich głównych źródeł informacji).
 3
Author: jaskirat Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 06:46:29

JLS sekcja 8 wspomina o tym.

Konstruktory (§8.8) są podobne do metod , ale nie mogą być wywoływane bezpośrednio przez wywołanie metody; są one używane do inicjalizacji nowej klasy przypadki. Podobnie jak metody, mogą być przeciążone (§8.8.8).

Ale konstruktory na say nie są metodami regularnymi. Nie można ich porównywać.

 2
Author: Oh Chin Boon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-28 06:44:50

Dlaczego konstruktor nie może być statyczny i końcowy są dobrze zdefiniowane w powyższych odpowiedziach.

Abstract: "Abstract" oznacza brak implementacji . i może być zaimplementowany tylko poprzez dziedziczenie. Tak więc, gdy rozszerzymy jakąś klasę, wszystkie elementy klasy nadrzędnej są dziedziczone w podklasie (klasie potomnej) z wyjątkiem "Constructor". Więc, przypuśćmy, że trochę jak zdołasz zadeklarować konstruktor "Abstract", niż jak możesz dać jego implementację w podklasie, gdy konstruktor nie dostanie dziedziczenia w klasie potomnej?

Dlatego konstruktor nie może być abstrakcja .

 1
Author: Muneeb Nasir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 07:50:49

Lets see first final public K () {

*powyżej modyfikatora finał jest ograniczony, ponieważ jeśli jest ostateczny, to jakaś sytuacja, w której w innej klasie lub tej samej klasie tylko go nadpisamy, więc to się nie stanie tutaj, nie jest ostateczne eg:

we want public void(int i,String name){
//this code not allowed

Niech static,, static itz wszystko o poziomie klasy, ale tworzymy konstruktor obiektowy używając słowa kluczowego 'new', więc,,,,, thatsall

Abstract ITZ worst about here not at ' cause not have any abstract method or any declarated Metoda

 0
Author: veeresh kalyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-31 19:41:33

Niestety w PHP kompilator nie powoduje problemów zarówno dla konstruktora abstract jak i final.

<?php

abstract class AbstractClass 
{
   public abstract function __construct();
}

class NormalClass 
{
    public final function __construct() {
        echo "Final constructor in a normal class!";
    }
}

W PHP static konstruktor nie jest dozwolony i wywoła fatal wyjątek.

Tutaj w AbstractClass oczywiście konstruktor może być zadeklarowany jako abstract plus nie zaimplementowany lub może być zadeklarowany jako coś pomiędzy (final, public, private, protected) plus ciało funkcyjne .

Inne powiązane fakty na temat PHP:

  1. W PHP posiadanie konstruktora wielokrotnego __construct() nie jest możliwe.
  2. w PHP konstruktor __construct() może być zadeklarowany jako abstract, final, public, private i protected!

Ten kod został przetestowany i stał się prawdziwy w wersjach PHP od 5.6 do 7.4!

 0
Author: edam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-06 07:47:06