Diferencia entre clase y tipo

105

Siendo nuevo en Java, estoy confundido entre los conceptos de clase y tipo . Por ejemplo, ¿el objeto debe "Hello World!"pertenecer al tipo String o clase String ? ¿O quizás ambos?

usuario2236096
fuente
24
Últimamente parece haber una inclinación a rechazar cualquier pregunta de estilo "principiante", ya sea que sea buena o no. Es molesto, por decir lo menos.
nico_c
9
También para rechazar cualquier pregunta que el votante no entienda ...
Marqués de Lorne
4
Estoy de acuerdo en que es un poco de mala educación rechazar las preguntas cuando dices preguntas para principiantes, pero ya sea bueno o malo, todas las preguntas para principiantes tienen sus respuestas con solo buscar en la web. El problema y la razón por la que la gente está votando negativamente es porque esto está provocando un desbordamiento de pila :)
Marko Lazić
13
Esta es una gran pregunta, y las 3 votaciones para cerrar son por qué necesitamos poder votar para mantener la apertura . Todavía recuerdo cuando estaba aprendiendo Java que la jerga de OO era el mayor impedimento.
Lawrence Dol
4
@nickecarlo Solía ​​haber un punto en las preguntas frecuentes, que parece haberse eliminado durante el último año más o menos: "la pregunta muestra una falta grave de investigación y no muestra signos de esfuerzo para resolverla antes de hacer la pregunta ". Me resulta molesto que haya MUCHAS preguntas de mierda que Google pueda resolver en lugar de que la gente de aquí pierda el tiempo explicando la "programación básica" a los demás.
TC1

Respuestas:

123

Una clase es un tipo. Una interfaz es un tipo. Un primitivo es un tipo. Una matriz es un tipo.

Por lo tanto, cada tipo es también una clase (incluida una constante de enumeración), una interfaz, una primitiva o una matriz.

Hay dos categorías distintas de tipos: tipos primitivos y tipos de referencia:

  • Una variable de tipo primitivo siempre tiene un valor primitivo del mismo tipo. Este valor solo se puede cambiar mediante operaciones de asignación en esa variable.
  • Una variable de tipo de referencia siempre tiene el valor de una referencia a un objeto. Todos los objetos, incluidas las matrices, admiten los métodos de clase Object. Los tipos de referencia son tipos de clase (incluidos tipos de enumeración), tipos de interfaz y tipos de matriz.

Cada dato tiene un tipo que define su estructura, es decir, cuánta memoria ocupa, cómo está distribuido y, lo que es más importante, cómo puede interactuar con él.

Ejemplos de tipos primitivos:

  1. int
  2. float
  3. char
  4. boolean

Ejemplos de tipos de clases:

  1. String
  2. Integer
  3. Boolean
  4. ArrayList
  5. StringBuilder

Ejemplos de tipos de interfaz:

  1. Collection
  2. List
  3. Map
  4. Serializable

Ejemplos de tipos de matrices:

  1. int[]
  2. String[]
  3. Integer[][][]

Básicamente, cualquier cosa a la que pueda referirse como variable tiene un tipo, y las clases son una especie de tipo.

Más información aquí: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html

Brandon
fuente
6
No olvide las matrices.
Paul Bellora
1
No haré la edición yo mismo porque no estoy seguro de que eso sea lo que pretendías escribir, pero podría funcionar mejor diciendo que las clases son "un tipo de un tipo" en lugar de "un tipo de un tipo".
un CV
@ MichaelKjörling Sí, esa es una mejor manera de decirlo. Lo actualizaré.
Brandon
3
Olvidó el tipo nulo (consulte JLS 4.1).
user1803551
1
@AndyDong Una clase abstracta sigue siendo una clase.
Brandon
6

TLDR : la clase es uno de los tipos en Java.

Nota: para comprender completamente la respuesta, debe tener una pequeña idea sobre los genéricos en Java.


Para comprender la diferencia, primero comprendamos qué es un tipo en Java.

Según JLS SE 10 ,

Hay dos tipos de tipos en el lenguaje de programación Java: tipos primitivos ( §4.2 ) y tipos de referencia (§4.3).

¿Qué es el tipo primitivo?

a) Los tipos integrales son byte, short, int y long , cuyos valores son enteros en complemento a dos con signo de 8 bits, 16 bits, 32 bits y 64 bits, respectivamente, y char, cuyos valores son de 16 bits enteros sin signo que representan unidades de código UTF-16 (§3.1).

b) Los tipos de coma flotante son float , cuyos valores incluyen los números de coma flotante IEEE 754 de 32 bits, y double , cuyos valores incluyen los números de coma flotante IEEE 754 de 64 bits.

c) El tipo booleano tiene exactamente dos valores: verdadero y falso.

Ahora, pasemos a lo que es el tipo de referencia.

Hay cuatro tipos de tipos de referencia: tipos de clase ( §8.1 ), tipos de interfaz ( §9.1 ), variables de tipo ( §4.4 ) y tipos de matriz ( §10.1 ).

Discutamos uno por uno.

Si ve cómo en JLS, Class se define así:

Una declaración de clase especifica un nuevo tipo de referencia con nombre.

Hay dos tipos de declaraciones de clase: declaraciones de clase normales y declaraciones de enumeración .

ClassDeclaration:
NormalClassDeclaration 
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody

Verá eso [TypeParameters], esto muestra que el tipo de clase también incluye esas clases genéricas.

class Example<T>{

}

El tipo de clase se llamará Example

En resumen, un tipo de clase cubre nuestras enumeraciones, nuestras clases regulares (no genéricas) como Stringetc. y nuestras clases genéricas también.

Del mismo modo, espero que los tipos de interfaz y matriz también sean claros. Por tipo de matriz queremos decir como int[], String[]etc.

Vayamos a la última parte: variables de tipo. Qué son ?

Una variable de tipo es un identificador no calificado que se utiliza como tipo en cuerpos de clase, interfaz, método y constructor.

Entendamos por el ejemplo en el JLS debajo.

class Test {
    <T extends C & I> void test(T t) {  
        t.mI();           // OK
        t.mCPublic();     // OK 
        t.mCProtected();  // OK 
        t.mCPackage();    // OK

    } 
}

Verá que su objeto en el parámetro de método es de tipo T. Sí, esta Tes una variable de tipo y se puede utilizar como referencia. Sí lo es. (No pude entender este extraño ejemplo: aprenda qué es el método genérico en Java)

Esto completa la respuesta.

Número945
fuente
4

"Tipo" es la categoría más inclusiva. Las variables en Java pueden tener tres tipos de tipos: los 8 tipos "primitivos" como int y float, interfaces y clases. Los valores (a diferencia de las variables) pueden ser instancias primitivas o de clase.

Lee Daniel Crocker
fuente
2

"Tipo" define "qué tipo de datos son"

Ej: "hola mundo" es una cadena -> "hola mundo" es un tipo de cadena (la cadena no es un dato preliminar a diferencia de int ... así que podemos decir que "hola mundo" es un tipo de clase de cadena)

10 es un int -> 10 es un tipo de datos entero.

Satya
fuente
5
Tenga cuidado con el uso de integer para explicar un int ya que Integer! = Int en Java.
nico_c