setfont - ¿Por qué en java hay una envoltura para cada tipo primitivo
setcolor java (12)
Las subclases numéricas encierran tipos numéricos primitivos ( Byte
, Integer
, Double
, Float
, Long
y Short
).
¿Para qué sirven?
Entonces, podemos agregar tipos de datos primitivos a las colecciones. Para agregar elementos a la colección tienen que ser de tipo objects
. Por lo tanto, se introdujeron clases Wrapper que nos permiten crear objetos de primitive data types
.
Por ejemplo:
Arraylist : add(Object o)
TreeSet: add(Object o)
Esas clases de envoltura se crearon de modo que hubiera alguna forma de usar esos tipos primitivos con varias clases de contenedores como ArrayList
. Dado que los tipos primitivos no pueden ser coaccionados directamente en las referencias de Object
, se almacenan en clases de envoltura para permitir que se usen donde se requieren referencias de Object
.
Hay un tipo específico de "puntero" que puede apuntar a cualquier tipo (como el void
en C / C ++).
Me refiero a java.lang.Object
.
Por ejemplo, puedes hacer esto:
List<String> aList = new ArrayList<String>();
Object o = aList;
PERO esto no está disponible para primitivas, es decir, no hay ningún tipo de referencia de void
para primitivas. Es decir, no hay forma de que un tipo primitivo se refiera a ningún tipo de tipo primitivo.
Entonces, si desea tener un algoritmo que funcione con variables arbitrarias, puede usar variables de tipo java.lang.Object.
Si los valores arbitrarios son primitivos, utilice el objeto Wrapper apropiado para envolverlos y utilice las referencias java.lang.Object para manipularlos.
Puedes ver esto en Collections
también.
Las clases de envoltorio son los representantes de los objetos de los tipos de datos primitivos, de modo que siempre que haya una situación para usarlos como objetos, tenemos que usarlos. Uso de envoltorios cuando necesitamos objetos y primitivos cuando se requiere eficiencia.
Las clases de envoltura en la API de Java básicamente tienen dos propósitos principales:
- Para permitir que las primitivas se incluyan en actividades reservadas para objetos, como que se agreguen a Colecciones, o que se devuelvan desde un método con un valor de retorno de objeto.
- Para proporcionar una variedad de funciones de utilidad para primitivas. La mayoría de estas funciones están relacionadas con varias conversiones: la conversión de primitivas hacia y desde objetos String, y la conversión de primitivas y objetos String en y desde diferentes bases (o radix), como binario, octal y hexadecimal.
Los diseñadores de Java han elegido, por buenas o malas razones, no basar todos los tipos en Object
. Los tipos primitivos como int
, long
, char
, etc. no se basan en Object
y, debido a que tienen una semántica bastante diferente, como que se pasan por valor en lugar de por referencia.
Básicamente, los Integer
/ Long
son solo clases de envoltura para hacer que los tipos primitivos se comporten como cualquier otro tipo para poder usarlos en contextos donde las clases u objetos encajan mejor.
Por ejemplo, debido a la diferencia en la semántica, las colecciones tendrían que tener dos versiones, una para Objeto y otra para tipos primitivos. Simplemente es más fácil hacer una única versión de la colección y envolver los tipos primitivos en su lugar.
Muchos lenguajes tempranos orientados a objetos (Smalltalk, etc.) tienen un "tipo superior" común para todos los valores, lo que facilita la definición de las operaciones genéricas que son ajenas al tipo de valores a los que se dirigen.
El tipo superior en la teoría de tipos, comúnmente abreviado como símbolo de tachuela superior o inferior (⊤), es el tipo universal, el tipo que contiene todos los objetos posibles en el sistema de tipos de interés.
Java no tiene un tipo superior, pero el Object
es el más cercano que tiene. Tener una asignación de valores primitivos a instancias de Object
permite funcionar efectivamente como un tipo superior.
Las funciones del lenguaje principal java.lang.reflect
usan el Object
como un soporte para el tipo superior, cuando invocas de manera reflexiva un método que pasas en Object
y recuperas un Object
.
Para tratarlos como objetos y ponerlos en lista, mapas, etc.
Personalmente, los uso como parámetros para los métodos, por lo que no tengo que preocuparme por el tipo de número que se pasa. Luego puedo usar métodos como doubleValue () para obtener el valor y continuar sin preocuparme por lo que se pasó. en.
Esta es la razón básica para tener una Clase Base Abstracta.
Porque las envolturas son Objects
.
-
Collections
necesita objetos - Los objetos pueden ser
instantiated
a nulo. - Podemos obtener
NullPointerException
lugar de un comportamiento extraño si, por ejemplo, crea una instancia de -1 en una primitiva - La "envoltura" tiene métodos convenientes.
Según este enlace las razones del tutorial de Java son:
Hay tres razones por las que puedes usar un objeto Number en lugar de un primitivo:
- Como un argumento de un método que espera un objeto (a menudo se usa cuando se manipulan colecciones de números).
- Para usar las constantes definidas por la clase, como MIN_VALUE y MAX_VALUE, que proporcionan los límites superior e inferior del tipo de datos.
- Para usar métodos de clase para convertir valores en y desde otros tipos primitivos, para convertir hacia y desde cadenas y para la conversión entre sistemas de números (decimal, octal, hexadecimal, binario).
1º - para hacer Java totalmente orientado a objetos.
2º: no podemos pasar un tipo primitivo por una referencia a un método y muchos de la estructura de datos estándar implementada por java opera en el objeto: por ejemplo (ArrayList, HashSet, HashMap, etc.), por lo que necesitan la referencia de estos objetos