¿Cuál es la diferencia entre declaración y definición en Java?

81

Estoy muy confundido entre los dos términos. Revisé stackoverflow y hay una pregunta similar para C ++ pero no para java.

¿Alguien puede explicar la diferencia entre los dos términos de Java?

Alan2
fuente
2
La declaración es el mínimo requerido para que otro código pueda llamarlo o hacer referencia a él. Cuando está compilando otro código, este es el mínimo que necesita. Se requiere una definición para que haga algo, solo tiene que compilarse una vez (no una vez por persona que llama)
Peter Lawrey
1
memorizable a través de: de-finite, fin = end, "para terminar"; de-clare, clarus = claro, "dejarlo claro". La declaración aclara la existencia, el tipo y el nombre. La definición es el código de "trabajo real" después del cual puede "terminar de hablar de ello". Se utilizan independientemente del lenguaje, por lo que su pregunta significa, ¿cuál es el uso de Java de estos conceptos generales?
n611x007

Respuestas:

99

La diferencia conceptual es simple:

  • Declaración : estás declarando que algo existe, como una clase, función o variable. No dice nada sobre cómo se ve esa clase o función, solo dice que existe.

  • Definición : Tú defines cómo se implementa algo, como una clase, función o variable, es decir, dices qué es realmente.

En Java , hay poca diferencia entre los dos y, formalmente, una declaración incluye no solo el identificador, sino también su definición. Así es como yo personalmente interpreto los términos en detalle:

  • Clases : Java realmente no separa declaraciones y definiciones como lo hace C / C ++ (en archivos de encabezado y cpp). Los define en el punto en el que los declara.

  • Funciones : cuando está escribiendo una interfaz (o una clase abstracta), podría decir que está declarando una función, sin definirla. Sin embargo, las funciones ordinarias siempre se definen justo donde se declaran. Vea el cuerpo de la función como su definición si lo desea.

  • Variables : una declaración de variable podría verse así:

    int x;
    

    (está declarando que una variable xexiste y tiene tipo int) ya sea si es una variable local o un campo miembro. En Java, no queda información xpor definir , excepto los posibles valores que tendrá, lo que está determinado por las asignaciones.

Aquí hay un resumen aproximado de cómo uso los términos:

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
fuente
Desafortunadamente, esto no es compatible con JLS. Según JLS, una declaración de clase INCLUYE el cuerpo de la clase. Y lo mismo se aplica a los métodos y constructores.
Stephen C
Derecha. Desde un punto de vista formal, estoy completamente de acuerdo con usted (excepto en el caso de métodos abstractos / de interfaz).
aioobe
Creo que esto también se aplica a JavaScript, ¿verdad? Quizás debería agregarse una etiqueta JS.
Griffin
Según los identificadores en el código de javac, las declaraciones de clase parecen ser sinónimo de definición de clase. Considere, por ejemplo public void visitClassDef(JCClassDecl tree).
aioobe
@Griffin - Mala idea. La pregunta es específicamente sobre Java.
Stephen C
28

La Especificación del lenguaje Java especifica y usa el término "declaración" extensamente, pero no usa "definición" excepto como una palabra inglesa normal.

Mi evidencia es que el término "declaración" aparece varias veces en la tabla de contenido de JLS y en el índice, pero la palabra "definición" no aparece en ninguno.

Entonces, cuando ve a alguien usar la palabra "definición" en el contexto de Java, o lo está usando en un sentido no técnico, o está siendo descuidado con su terminología.

En el último caso, pueden significar lo mismo que el término técnico "declaración", o pueden significar algo más. Y si quieren decir algo más, debes preguntarles qué quieren decir. Si lo han definido ... bastante justo, pero no es una terminología estándar.


Las respuestas que afirman que la "definición" se refiere al punto en el que se inicializa la variable no son específicamente compatibles ... en el contexto de Java. En Java, la inicialización de una variable ocurre en el punto de declaración o en una asignación posterior. En el último caso, no se utiliza ningún término especial ... o necesario ... aparte de la asignación y / o inicialización. No hay un punto específico en el que se asigne almacenamiento para la variable. De hecho, lo más probable es que el espacio para la propia variable se asigne antes de que se alcance la declaración.


La razón por la que el término "definición" no se utiliza en Java en la especificación JLS es que no es necesario.

  • Dado que Java permite que los miembros se declaren en cualquier orden, no hay necesidad de "declaraciones de avance". Ese es el contexto donde es necesario distinguir entre los dos conceptos.
  • En Java, el espacio de pila requerido para una variable es una constante de tiempo de compilación, por lo que los cálculos de desplazamiento de pila ocurren en tiempo de compilación. (Recuerde que en Java, una matriz es una referencia a un objeto de pila ... y solo la referencia se mantiene en el marco de pila).
  • La forma en que Java maneja la "definición sin inicialización" de un campo o variable no requiere un solo punto de "declaración". Si se requiere la inicialización de una variable, puede ocurrir en varios puntos del código fuente.

(El único lugar en Java donde podrían haber usado declaración versus definición es en métodos abstractos. Excepto que si lo hubieran hecho, habrían tenido que referirse a una declaración de método regular como una definición ... por consistencia ... y eso sería confuso. Por lo tanto, simplemente llaman al subcaso "abstracto" una declaración de un método abstracto).

C y C ++ manejan estas cosas de manera diferente y, por lo tanto , necesitan términos distintos de "declaración" y "definición" en sus descripciones técnicas. Mi opinión sobre las definiciones del "Glosario de Sun" es que están centradas en C / C ++.

Esteban C
fuente
6

De las definiciones del glosario de Sun :

declaración: Enunciado que establece un identificador y le asocia atributos, sin reservar necesariamente su almacenamiento (para datos) o proporcionar la implementación (para métodos).

definición: Declaración que reserva almacenamiento (para datos) o proporciona implementación (para métodos).

La forma en que leo el glosario de Sun sería así:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference
Jainendra
fuente
4
1) La JLS NO usa el término "definición" para describir la segunda declaración. Sintácticamente, es una asignación. Semánticamente se describe como "inicializar" la variable. 2) La segunda declaración no es una declaración, por lo que no puede ser una definición ... "definición: Una declaración que ..." . 3) El vínculo está roto ...
Stephen C
Propuse una edición para arreglar el enlace. La pregunta y la respuesta no dicen nada sobre el JLS.
Matthew Read
4

1. Declaración significa crear un primitive or Object reference variable, pero sin asignación de valor u objeto, respectivamente.

p.ej:

          int x;   // declaration of x of type int

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

2. La definición es cuando les asignamos valores u objetos.

         int x = 5;

         Cat myCat = new Cat();

3. En el caso del Método, es así ...

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

   public void go(){               // Method Defination

            // Your code      

    }
Kumar Vivek Mitra
fuente
1
Esta terminología NO es compatible con JLS.
Stephen C
1
@Kumar Vivek Mitra - si la definición es "int x = 5", ¿cuál sería la diferencia entre definición e inicialización?
khan
@SSK Initialization es definición y viceversa ..... su consulta parece un gran desafío en lugar de aclarar su duda ... así que la próxima vez agregue "por favor"
Kumar Vivek Mitra
Sí ... vea la serie Head First Java de Kathy Sierra y Bert Bates
Kumar Vivek Mitra
2

Creo que puedo explicar mejor esta pregunta algo como esto:

Piense en el siguiente escenario:

Hay un nuevo puesto vacante de ingeniero de software en su empresa.Esto significa que la persona que elegirá para ocupar este puesto será un ingeniero de software (no puede elegir un tipo de marketing para esta publicación). Entonces, crear esta publicación es similar a la declaración.

Ahora bien, cuando se define lo que la persona con este puesto puede / no puede hacer, qué autoridades tiene, cuáles son sus limitaciones, entonces esto se llama definición.

Diciendo asi

SoftwareEngineer se;

significa Declaración;

y

class SoftwareEngineer {

// define role and responsibilities
}

significa definición. Espero que te ayude.

me_digvijay
fuente
2

Java el lenguaje define solo la declaración de término, no la definición de uso.

Declaración:

class A{}// class declaration

String str;// variable declaration
Mohammod Hossain
fuente
0

declaración : Enunciado que establece un identificador y le asocia atributos, sin reservar necesariamente su almacenamiento (para datos) o proporcionar la implementación (para métodos).

         or

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

definición : Declaración que reserva almacenamiento (para datos) o proporciona implementación (para métodos).

        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
fuente
-1
  1. Para un objeto o primitivo

Declaración : especificando el tipo de objeto o primitiva

Definición : especificar el valor de un objeto o primitiva

  1. Por un método

Declaración : especificando la firma de un método

Definición : especificar la implementación de un método

lo que sea
fuente