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?
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:
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.
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
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.
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
classSoftwareEngineer{
// define role and responsibilities
}
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
Antworten:
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
x
existiert und einen Typ hatint
), entweder wenn es sich um eine lokale Variable oder ein Mitgliedsfeld handelt. In Java gibt es keine Informationen über linksx
zu 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; // / | // | } // | } // /
quelle
javac
scheinen Klassendeklarationen ein Synonym für die Klassendefinition zu sein. Betrachten Sie zum Beispielpublic void visitClassDef(JCClassDecl tree)
.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.
(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.
quelle
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
quelle
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 }
quelle
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
bedeutet Erklärung;
und
class SoftwareEngineer { // define role and responsibilities }
bedeutet Definition. Hoffe es hilft dir.
quelle
Java
Sprache definiert nur den Begriff Deklaration, nicht Definition verwenden.Erklärung:
class A{}// class declaration String str;// variable declaration
quelle
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
quelle
Deklaration : Angabe des Typs eines Objekts oder Grundelements
Definition : Angabe des Werts eines Objekts oder Grundelements
Deklaration : Angabe der Signatur einer Methode
Definition : Angabe der Implementierung einer Methode
quelle