Was ist der Unterschied zwischen Deklaration und Definition in Java?

81

Ich bin sehr verwirrt zwischen den beiden Begriffen. Ich habe den Stackoverflow überprüft und es gibt eine ähnliche Frage für C ++, aber nicht für Java.

Kann jemand den Unterschied zwischen den beiden Begriffen für Java erklären?

Alan2
quelle
2
Die Deklaration ist das erforderliche Minimum, damit andere Codes sie aufrufen oder darauf verweisen können. Wenn Sie anderen Code kompilieren, ist dies das Minimum, das Sie benötigen. Definition ist erforderlich, damit es etwas tut, es muss nur einmal kompiliert werden (nicht einmal pro Anrufer)
Peter Lawrey
1
einprägsam über: de-finite, fin = end, "um es zu beenden"; de-clare, clarus = klar, "um es klar zu machen". Die Erklärung macht Existenz, Typ und Namen deutlich. Definition ist der "echte Arbeit" -Code, nach dem Sie "darüber reden können". Sie werden sprachunabhängig verwendet, sodass Ihre Frage bedeutet, wie Java diese allgemeinen Konzepte verwendet.
n611x007

Antworten:

99

Der konzeptionelle Unterschied ist einfach:

  • Deklaration : Sie deklarieren, dass etwas vorhanden ist, z. B. eine Klasse, eine Funktion oder eine Variable. Sie sagen nichts darüber, wie diese Klasse oder Funktion aussieht, Sie sagen nur, dass sie existiert.

  • Definition : Sie definieren, wie etwas implementiert wird, z. B. eine Klasse, Funktion oder Variable, dh Sie sagen, was es tatsächlich ist.

In Java gibt es kaum einen Unterschied zwischen den beiden, und formal gesehen enthält eine Deklaration nicht nur den Bezeichner, sondern auch deren Definition. So interpretiere ich die Begriffe persönlich im Detail:

  • Klassen : Java trennt Deklarationen und Definitionen nicht wirklich wie C / C ++ (in Header- und CPP-Dateien). Sie definieren sie an der Stelle, an der Sie sie deklarieren.

  • Funktionen : Wenn Sie eine Schnittstelle (oder eine abstrakte Klasse) schreiben, können Sie sagen, dass Sie eine Funktion deklarieren, ohne sie zu definieren. Gewöhnliche Funktionen werden jedoch immer genau dort definiert, wo sie deklariert sind. Sehen Sie sich den Hauptteil der Funktion als Definition an, wenn Sie möchten.

  • Variablen : Eine Variable Erklärung könnte wie folgt aussehen:

    int x;
    

    (Sie erklären, dass eine Variable xexistiert und einen Typ hat int), entweder wenn es sich um eine lokale Variable oder ein Mitgliedsfeld handelt. In Java gibt es keine Informationen über links xzu definieren , mit der Ausnahme möglich , welche Werte sie halten sollen, die von den Zuweisungen bestimmt wird.

Hier ist eine grobe Zusammenfassung, wie ich die Begriffe verwende:

abstract class SomeClass {                // class decl.
                                          //                           \
    int x;                                // variable decl.            |
                                          //                           |
    public abstract void someMethod();    // function decl.            |
                                          //                           |
    public int someOtherMethod() {        // function decl.            |
                                          //                           | class
        if (Math.random() > .5)           // \                         | def.
            return x;                     //  |  function definition   |
        else                              //  |                        |
            return -x;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /
aioobe
quelle
Dies wird vom JLS leider nicht unterstützt. Laut JLS enthält eine Klassendeklaration den Hauptteil der Klasse. Gleiches gilt für Methoden und Konstruktoren.
Stephen C
Richtig. Aus formaler Sicht stimme ich Ihnen voll und ganz zu (mit Ausnahme der abstrakten / Schnittstellenmethoden).
Aioobe
Ich glaube, das gilt auch für Javascript, oder? Möglicherweise sollte ein JS-Tag hinzugefügt werden.
Griffin
Gemäß den Bezeichnern im Code von javacscheinen Klassendeklarationen ein Synonym für die Klassendefinition zu sein. Betrachten Sie zum Beispiel public void visitClassDef(JCClassDecl tree).
Aioobe
@ Griffin - schlechte Idee. Die Frage bezieht sich speziell auf Java.
Stephen C
28

Die Java-Sprachspezifikation spezifiziert und verwendet den Begriff "Deklaration" ausführlich, verwendet jedoch "Definition" nur als normales englisches Wort.

Mein Beweis ist, dass der Begriff "Deklaration" im JLS-Inhaltsverzeichnis und im Index mehrmals vorkommt, aber das Wort "Definition" auch nicht.

Wenn Sie also sehen, dass jemand das Wort "Definition" im Kontext von Java verwendet, verwendet er es entweder im nicht-technischen Sinne oder er ist mit seiner Terminologie schlampig.

Im letzteren Fall könnten sie dasselbe bedeuten wie der Fachbegriff "Erklärung", oder sie könnten etwas anderes bedeuten. Und wenn sie etwas anderes bedeuten, müssen Sie sie fragen, was sie bedeuten. Wenn sie es definiert haben ... fair genug, aber es ist keine Standardterminologie.


Die Antworten, die besagen, dass "Definition" sich auf den Punkt bezieht, an dem die Variable initialisiert wird, werden speziell nicht unterstützt ... im Kontext von Java. In Java erfolgt die Initialisierung einer Variablen entweder zum Zeitpunkt der Deklaration oder in einer späteren Zuweisung. Im letzteren Fall wird außer der Zuweisung und / oder Initialisierung kein spezieller Begriff verwendet ... oder benötigt .... Es gibt keinen festgelegten Punkt, an dem Speicher für die Variable zugewiesen wird. In der Tat besteht die Möglichkeit, dass der Speicherplatz für die Variable selbst zugewiesen wird, bevor die Deklaration erreicht wird.


Der Grund dafür, dass der Begriff "Definition" in Java in der JLS-Spezifikation nicht verwendet wird, ist, dass er nicht benötigt wird.

  • Da Java die Deklaration von Mitgliedern in beliebiger Reihenfolge ermöglicht, sind keine "Weiterleitungsdeklarationen" erforderlich. In diesem Kontext muss zwischen den beiden Konzepten unterschieden werden.
  • In Java ist der für eine Variable erforderliche Stapelspeicher eine Kompilierungszeitkonstante, sodass die Stapelversatzberechnungen zur Kompilierungszeit erfolgen. (Denken Sie daran, dass in Java ein Array eine Referenz auf ein Heap-Objekt ist ... und nur die Referenz im Stapelrahmen gespeichert ist.)
  • Die Art und Weise, wie Java mit "Definition ohne Initialisierung" eines Felds oder einer Variablen umgeht, erfordert keinen einzigen "Deklarationspunkt". Wenn eine Initialisierung einer Variablen erforderlich ist, kann dies an mehreren Stellen im Quellcode geschehen.

(Der einzige Ort in Java, an dem sie möglicherweise Deklaration versus Definition verwendet haben, sind abstrakte Methoden. Wenn sie dies getan hätten, hätten sie sich aus Gründen der Konsistenz auf eine reguläre Methodendeklaration als Definition beziehen müssen ... und das wäre verwirrend. Sie nennen den "abstrakten" Unterfall einfach eine Deklaration einer abstrakten Methode.)

C und C ++ , diese Dinge anders handhaben und daher keine eindeutige „Erklärung“ und „Definition“ Begriffe in ihren technischen Beschreibungen müssen. Ich gehe davon aus, dass die Definitionen des "Sun Glossary" C / C ++ -zentriert sind.

Stephen C.
quelle
6

Aus den Definitionen des Sun-Glossars :

Deklaration: Eine Anweisung, die einen Bezeichner erstellt und ihm Attribute zuordnet, ohne den Speicher (für Daten) zu reservieren oder die Implementierung (für Methoden) bereitzustellen.

Definition: Eine Deklaration, die Speicher (für Daten) reserviert oder Implementierung (für Methoden) bereitstellt.

So würde ich das Sun-Glossar lesen:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference
Jainendra
quelle
4
1) Das JLS verwendet NICHT den Begriff "Definition", um die zweite Aussage zu beschreiben. Syntaktisch ist es eine Aufgabe. Semantisch wird es als "Initialisieren" der Variablen beschrieben. 2) Die 2. Aussage ist keine Deklaration, kann also keine Definition sein ... "Definition: Eine Deklaration, die ..." . 3) Die Verbindung ist unterbrochen ...
Stephen C
Ich habe eine Bearbeitung vorgeschlagen, um den Link zu reparieren. Die Frage und Antwort sagen nichts über die JLS aus.
Matthew Read
4

1. Deklaration bedeutet das Erstellen eines primitive or Object reference variable, jedoch ohne Zuweisung von Wert bzw. Objekt.

z.B:

          int x;   // declaration of x of type int

          Cat myCat;  //  declaration of myCat an Object of type Cat

2. Definition ist, wenn wir ihnen Werte oder Objekte zuweisen.

         int x = 5;

         Cat myCat = new Cat();

3. Im Falle der Methode ist es so ...

public abstract void go();       // Method Declaration (Abstract method)

   public void go(){               // Method Defination

            // Your code      

    }
Kumar Vivek Mitra
quelle
1
Diese Terminologie wird vom JLS NICHT unterstützt.
Stephen C
1
@ Kumar Vivek Mitra - Wenn die Definition "int x = 5" ist, was wäre dann der Unterschied zwischen Definition und Intialisierung?
Khan
@SSK Initialisierung ist Definition und umgekehrt ..... Ihre Anfrage scheint eher eine Herausforderung zu sein, als Ihre Zweifel auszuräumen ... also fügen Sie beim nächsten Mal "bitte" hinzu
Kumar Vivek Mitra
Yup ... siehe die Head First Java-Serie von Kathy Sierra und Bert Bates
Kumar Vivek Mitra
2

Ich denke, ich kann diese Frage so etwas besser erklären:

Stellen Sie sich folgendes Szenario vor:

In Ihrer Firma gibt es eine neue freie Stelle als Software-Ingenieur. Dies bedeutet, dass die Person, die Sie für die Besetzung dieser Position ausgewählt haben, ein Softwareentwickler ist (Sie können keinen Marketing-Mitarbeiter für diesen Beitrag auswählen). Das Erstellen dieses Beitrags ähnelt also der Deklaration.

Wenn Sie nun definieren, was die Person mit diesem Beitrag tun kann / nicht kann, welche Befugnisse sie hat, welche Einschränkungen sie hat, wird dies als Definition bezeichnet.

Also sagen

SoftwareEngineer se;

bedeutet Erklärung;

und

class SoftwareEngineer {

// define role and responsibilities
}

bedeutet Definition. Hoffe es hilft dir.

me_digvijay
quelle
2

Java Sprache definiert nur den Begriff Deklaration, nicht Definition verwenden.

Erklärung:

class A{}// class declaration

String str;// variable declaration
Mohammod Hossain
quelle
0

Deklaration : Eine Anweisung, die einen Bezeichner erstellt und ihm Attribute zuordnet, ohne unbedingt dessen Speicher (für Daten) zu reservieren oder die Implementierung (für Methoden) bereitzustellen.

         or

         1. Declaration means creating a primitive or Object reference variable, 
         but with no assignment of value or object respectively..

Definition : Eine Deklaration, die Speicher (für Daten) reserviert oder Implementierung (für Methoden) bereitstellt.

        or

         Defination is when we assign values or Object to them.

**Ex:** 
List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference
Shraddha Patel
quelle
-1
  1. Für ein Objekt oder Primitiv

Deklaration : Angabe des Typs eines Objekts oder Grundelements

Definition : Angabe des Werts eines Objekts oder Grundelements

  1. Für eine Methode

Deklaration : Angabe der Signatur einer Methode

Definition : Angabe der Implementierung einer Methode

was auch immer
quelle