Warum ist Java.Lang.Math nicht abstrakt?

7

Das Schlüsselwort "abstract" bedeutet, dass Sie keine Instanz der Klasse (ein Objekt) erstellen können.

Java.Lang.Math ist mit den folgenden Schlüsselwörtern vorangestellt

%Vor%

Aber kein "abstraktes" Keyword. Die Klasse bietet einfach eine Sammlung verwandter statischer Variablen und Methoden, wie PI und sin ().

Statisch bedeutet, dass diese Variablen / Methoden zwischen verschiedenen Instanzen des Objekts nicht eindeutig sein können (es gibt nur eine Kopie dieser Variablen / Methoden, die der Klasse selbst zugeordnet sind). Warum sollte der Programmierer sogar eine Instanz der Klasse erstellen? Warum nicht mit "abstrakt" vorangehen?

    
Niko Bellic 22.07.2014, 19:47
quelle

5 Antworten

10

java.lang.Math ist eine Dienstprogrammklasse (enthält nur statische Hilfsmethoden).

Die korrekte Definition der Dienstprogrammklasse besteht darin, sie so zu final zu machen, dass keine andere Klasse sie erweitern kann und privater no-args-Konstruktor ist, damit niemand sie erstellen kann eine Instanz der Klasse.

Sie können also keine Instanz der Klasse erstellen. Wenn Sie jedoch nach abstract verfahren, können Sie final nicht verwenden, und Sie können auf keinen Fall verhindern, dass es erweitert wird. Daher ist der frühere Ansatz besser.

    
Gladwin B 22.07.2014, 20:06
quelle
14
Die Schlüsselwörter

final und abstract können nicht zusammen angewendet werden, da final class nicht überschrieben werden kann und abstract classes zum Überschreiben vorgesehen sind.

  

Eine Klasse, die als final deklariert ist, kann nicht subclassed sein, die für die Erstellung einer verwendet wird immutable Klasse wie String

Es ist besser erklärt unter JSL Abschnitt - 8.1. 1. Klassenmodifikatoren

  1. Eine Klasse abstract ist eine Klasse, die unvollständig oder unvollständig ist.

  2. Eine Klasse kann als final deklariert werden, wenn ihre Definition vollständig ist und keine Unterklassen gewünscht oder benötigt werden.

beide obigen Aussagen sind widersprechend einander.

Wenn Sie mehr darüber lesen möchten, schauen Sie sich Java Tutroial unter Eine Strategie zum Definieren unveränderbarer Objekte

  1. Geben Sie keine "Setter" -Methoden an - Methoden, die Felder oder Objekte modifizieren, auf die Felder verweisen.
  2. Machen Sie alle Felder endgültig und privat.
  3. Unterklassen dürfen Methoden nicht überschreiben. Der einfachste Weg dies zu tun, ist the class as final zu deklarieren. Ein ausgefeilterer Ansatz besteht darin, the constructor private zu erstellen und Instanzen in factory methods .
  4. zu konstruieren
  5. Wenn die Instanzfelder Verweise auf veränderbare Objekte enthalten, dürfen diese Objekte nicht geändert werden:
    • Stellen Sie keine Methoden bereit, die die veränderbaren Objekte modifizieren.
    • Teilen Sie keine Referenzen auf die veränderbaren Objekte.
Braj 22.07.2014 19:48
quelle
9

Wenn es abstrakt wäre, könnte jemand

tun %Vor%

was ehrlich gesagt keinen Sinn ergibt.

Sie können jedoch keine neue Math-Instanz erstellen, da der einzige Konstruktor privat ist:

%Vor%     
Karol S 22.07.2014 19:49
quelle
2

final bedeutet, dass Sie es nicht erweitern können. Der Grund dafür, dass Sie keine Instanz erstellen können, ist, dass der Konstruktor privat ist. So definieren Sie (in Java) statische Klassen oder Factory-Klassen.

    
T McKeown 22.07.2014 19:48
quelle
0

Das Schlüsselwort Abstrakt bedeutet, dass die Klasse nicht instanziierbar sein kann, aber erweitert werden kann. Und im Falle von Utility-Klassen wie Math Class hat Extending keinen Sinn. Wenn man den Konstruktor no-args deklariert, wird es nicht-instantiierbar und endgültig macht es nicht erweiterbar ... Also ist es die perfekte Übereinstimmung .... Und wenn Sie Abstract verwenden, können Sie Final nicht verwenden ...

    
Shubham Soni 01.09.2017 07:20
quelle

Tags und Links