Estoy empezando a estudiar java porque ahora en marzo empiezo la universidad y es el lenguaje que voy a tener que utilizar. Toy leyendo el libro thinking Java, esta bastante bueno, y ta, le toy haciendo resumen (si es que lo amerita) y se me ocurrio poner lo que voy teniendo... es poquito, pero capas le ahorro trabajo a alguien que esta en la misma que yo... espero le sirva a alguien. TODO ES UN OBJETO EN JAVA TODO SE TRATA COMO UN OBJETO, DE MANERA QUE HAY UNA ÚNICA SINTAXIS QUE SE TRATA DE MANERA CONSISTENTE EN TODAS PARTES. Y LO QUE SE UTILIZA COMO IDENTIFICADOR PARA MANIPULAR A LOS OBJETOS, SON LAS REFERENCIAS A ESTOS. REFERENCIAS El mero hecho de tener una referencia no implica necesariamente la existencia de un objeto conectado a la misma. Por ejemplo, si el objeto que se desea tener es una frase o una palabra, se crea una referencia de tipo String: String s; Esta sentencia, lo único que hace es crear la referencia a un objeto, y no el objeto. Si se desea mandar un mensaje a “s” en estas condiciones, se obtendrá un error (en tiempo de ejecución) porque “s” no se encuentra vinculado a nada. Una práctica segura, por consiguiente, es iniciar la referencia en el mismo momento de su creación: String s = ”asdf”; UNO DEBE CREAR TODOS LOS OBJETOS Cuando se crea una referencia, es con propósito de conectarla a un nuevo objeto. Esto se hace, por lo general, con la palabra clave new, que lo que dice es “Créame un objeto nuevo de esos”. Aplicándolo a la referencia creada anteriormente, sería así: String s = new String (“asdf”); Esta sentencia no solo creó un nuevo objeto de tipo String, sino que también le asigno un valor inicial. DÓNDE RESIDE EL ALMACENAMIENTO Es útil visualizar algunos aspectos relativos a cómo se van disponiendo los elementos al ejecutar el programa, y en particular, sobre cómo se dispone la memoria. Hay seis lugares diferentes en los que almacenar información: Registros. Son el elemento de almacenamiento más rápido porque existen en un lugar distinto al de cualquier otro almacenamiento: dentro del procesador. Sin embargo, el número de registros está severamente limitado, de forma que los registros los va asignando el compilador en función de sus necesidades. No se tiene control directo sobre ellos, y tampoco hay ninguna evidencia en los programas de que los registros siquiera existan. La pila. Reside en la memoria RAM (memoria de acceso directo) general, pero tiene soporte directo del procesador a través del puntero de pila. Éste se mueve hacia abajo para crear más memoria y de nuevo hacia arriba para liberarla. Ésta es una manera extremadamente rápida y eficiente de asignar espacio de almacenamiento, antecedido sólo por los registros. El compilador de Java debe saber, mientras está creando el programa, el tamaño exacto y la vida de todos los datos almacenados en la pila, pues debe generar el código necesario para mover el puntero hacia arriba y hacia abajo. Esta limitación pone límites a la flexibilidad de nuestros programas, de forma que mientras existe algún espacio de almacenamiento en la pila –referencias a objetos en particular- los propios objetos Java no serán ubicados en la pila. El montículo. Se trata de un espacio de memoria de propósito general (ubicado también en el área RAM) en el que residen los objetos Java. Lo mejor del montículo es que, a diferencia de la pila, el compilador no necesita conocer cuánto espacio de almacenamiento necesita asignar al montículo o durante cuánto tiempo debe permanecer ese espacio dentro del montículo. Por consiguiente, manejar este espacio de almacenamiento proporciona una gran flexibilidad. Cada vez que se desee crear un objeto, simplemente se escribe el código, se crea utilizando la palabra new, y se asigna el espacio de almacenamiento en el montículo en el momento en que este código se ejecuta. Por supuesto hay que pagar un precio a cambio de esta flexibilidad: lleva más tiempo asignar espacio de almacenamiento del montículo que lo que lleva hacerlo en la pila (es decir, si se pudieran crear objetos en la pila en Java, como se hace en C++). Almacenamiento estático. El término "estático" se utiliza aquí con el sentido de "con una ubicación/posición fija" (aunque también sea en RAM). El almacenamiento estático contiene datos que están disponibles durante todo el tiempo que se esté ejecutando un programa. Podemos usar la palabra clave static para especificar que un elemento particular de un objeto sea estático, pero los objetos en sí nunca se sitúan en el espacio de almacenamiento estático. Almacenamiento constante. Los valores constantes se suelen ubicar directamente en el código del programa, que es seguro, dado que estos valores no pueden cambiar. En ocasiones, las constantes suelen ser acordonadas por sí mismas, de forma que puedan ser opcionalmente ubicadas en memoria de sólo lectura (ROM). Almacenamiento no-RAM. Si los datos residen completamente fuera de un programa, pueden existir mientras el programa no se esté ejecutando, fuera del control de dicho programa. Los dos ejemplos principales de esto son los objetos de flujo de datos (stream), que se convierten en flujos o corrientes de bytes, generalmente para ser enviados a otra máquina, y los objetos persistentes, que son ubicados en el disco para que mantengan su estado incluso cuando el programa ha terminado. El truco con estos tipos de almacenamiento es convertir los objetos en algo que pueda existir en otro medio, y que pueda así recuperarse en forma de objeto basado en RAM cuando sea necesario. Java proporciona soporte para persistencia ligera, y las versiones futuras de Java podrían proporcionar soluciones aún más complejas para la persistencia. UN CASO ESPECIAL: LOS TIPOS PRIMITIVOS Hay un grupo de tipos al cual se le da un tratamiento especial, este grupo es el grupo de los tipos “primitivos”, los cuales son usados frecuentemente en los programas. La razón para tal tratamiento es que crear un objeto con new - especialmente variables pequeñas y simples - no es eficiente, porque este coloca el objeto creado en el montículo. Para estos tipos, Java en vez de crear objetos con new, crea automáticamente una variable - la cual no es una referencia – y guarda el valor, colocándola luego en la pila para que sea más eficiente. Java determina el tamaño de cada tipo primitivo. Estos tamaños no varían de una plataforma a otra, lo cual hace de Java un lenguaje tan llevadero. Todos los tipos numéricos tienen signo, lo cual hace el trato sin signo algo no existente. El tamaño del tipo boolean no está explícitamente definido; solo se especifica que debe tomar los valores true o false. Los tipos de datos “primitivos” también tienen clases “envoltura”. Esto quiere decir que si se desea no hacer un objeto primitivo en el montículo para representar ese tipo primitivo, se hace uso del envoltorio asociado. Por ejemplo: char c = ‘x’; Character C = New Character (c); O tambien se podria utilizar: Character C = new Character (‘x’); NÚMEROS DE ALTA PRECISIÓN Java incluye dos clases para llevar a cabo aritmetica de alta precision: BigInteger y BigDecimal. Aunque estos tipos vienen a encajar en la misma categoria que las clases “envoltorio”, ninguna de ellas tiene un tipo primitivo. Ambas clases tienen metodos que proporcionan operaciones analogicas que se lleven a cabo con tipos primitivos. Es decir, uno puede hacer con BigInteger y BigDecimal cualquier cosa que pueda hacer con un int o con un float, simplemente utilizando llamadas a metodos en vez de operadores. Las operaciones seran mas lentas dado que hay mas elementos involucrados. Se sacrificala velocidad en favor de la exactitud. BigInteger soporta enteros de precisión arbitraria. Esto significa que uno puede representar valores enteros exactos de cualquier tamaño y sin perder información en distintas operaciones. BigDecimal es para números de coma flotante de precisión arbitraria. Estos, pueden usarse, por ejemplo, para calculos monetarios exactos. Para conocer los detalles de los constructores y metodos que pueden invocarse para estas dos clases, puede recurrirse a la documentación existente en linea. ARRAYS EN JAVA Esta garantizado, que un array en Java estara siempre inicializado, y que no se podra acceder mas alla de su rango. La comprobación de rangos se resuelve con una pequeña sobrecarga de memoria en cada array, ademas de verificar el indice en tiempo de ejecución, pero se asume que es un costo valorable en seguridad y productividad. Cuando se crea un array de objetos, en realidad se esta creando un arreglo de referencias a los objetos, y cada una de estas se inicializa automaticamente con un valor especial representado por la palabra clave null. Cuando Java ve un null, reconoce que la referencia en cuestión no esta señalando ningun objeto. Debe asignarse un objeto a cada referencia antes de utilizarla, en caso de que esta igualmente valga null, se informara de que se ha dado un problema en tiempo de ejecución. Por tanto, en Java se evitan los problemas tipicos de los arrays. Uno tambien puede crear un array de tipos primitivos. De nuevo, es el compilador quien garantiza la inicialización al poner a cero la memoria que ocupara ese array. NUNCA ES NECESARIO DESTRUIR UN OBJETO En la mayoria de los lenguajes de programación, el concepto de tiempo de vida de una variable una parte importante del esfuerzo de programación. ¿Cuanto dura una variable? Si se supone que uno va a destruirla. ¿Cuando es que debe hacerlo? La confución relativa a la vida de las variables puede conducir a un monton de fallos, y esta sección muestra como Java simplifica esto al hacer el trabajo de limpieza por ti. ÁMBITO La mayoria de los lenguajes procedurales manejan el concepto de alcance o ambito. Este determina tanto la visibilidad como los nombres definidos dentro de ese ambito. En Java, el ambito se determina por la ubicación de llaves {}. Así, por ejemplo: { int x = 12; /* SOLO x DISPONIBLE */ { int q = 96; /* TANTO q COMO x ESTAN DISPONIBLES */ } /* SOLO x DISPONIBLE */ /* q ESTA FUERA DEL "AMBITO" O ALCANCE */ } Una variable definida dentro de un ambito solo esta disponible hasta que finalice su ámbito. Fijese que uno NO puede hacer lo siguiente, a pesar de que es legal en C/C++: { int x = 12; { int x= 96; /* ILEGAL */ } } El compilador comuncara que la variable x ya ha sido definida. Mostrando rechazo a la capacidad de C y C++ de "esconder" una variable de un ambito mayor. ÁMBITO DE LOS OBJETOS Los objetos en Java no tienen la misma vida que los primitivos. Cuando se crea un objeto Java haciendo uso de new, este perdura hasta el final del ámbito. Por consiguiente, si se escribe: { String s = new String ('' un string ''); } /*FIN DEL AMBITO */ la referencia s desaparece al final del ambito. Sin embargo, el objeto String al que apunta s sigue ocupando memoria. En este fragmento de código, no hay forma de acceder al objeto, pues la unica referencia al mismo se encuentra fuera del ámbito. Mas adelante se vera como puede pasarse la referencia al objeto y duplicarla durante el transcurso del programa. Si Java deja los objetos vivos por ahi, ¿que evita que se llene la memoria provocando que se detenga la ejecución del programa? Java tiene un recolector de basura, que recorre todos los objetos que fueron creados con new y averigua cuales no seran referenciados mas. Luego, libera la memoria de los que han dejado de ser referenciados, de forma que la memoria pueda ser utilizada por otros objetos. Esto quiere decir que no es necesario que uno se preocupe por reivindicar ninguna memoria. CREAR NUEVOS TIPOS DE DATOS: CLASES La palabra clave class siempre va seguida del nombre del nuevo tipo. Por ejemplo: class UnNombreDeTipo { /* Aqui va el cuerpo de la clase */ } Esto introduce un nuevo tipo, de forma que ahora es posible crear un objeto de este tipo utilizando la palabra clave new: UnNombreDeTipo u = new UnNombreDeTipo () ; En UnNombreDeTipo, el cuerpo de la clase sólo consiste en un comentario (los asteriscos, las barras inclinadas y lo que hay dentro, que se discutirán más adelante en este capítulo), con lo que no hay demasiado que hacer con él. De hecho, uno no puede indicar que se haga mucho de nada (es decir, no se le puede mandar ningún mensaje interesante) hasta que se definan métodos para ella. CAMPOS Y METODOS Cuando se define una clase, es posible poner dos tipos de elementos en ella: datos miembros (denominados generalmente campos) y funciones miembros (tipicamente llamadas metodos). Un dato miembro es un objeto de cualquier tipo con el que te puedes comunicar a travez de su referencia. Tambien puede ser algun tipo primitivo. Si es una referencia a un objeto, hay que inicializar esa referencia para conectarla a algun objeto real (utilizando new como se ha visto antes) en una funcion especial denominada constructor. Si se trata de un tipo primitivo es posible inicializarla directamente en el momento de definir la clase. Cada objeto mantiene el espacio de almacenamiento necesario para todos sus datos miembro; éstos no son compartidos con otros objetos. He aquí un ejemplo de una clase y algunos de sus datos miembro: class SoloDatos { int i; float f; boolean b; } Esta clase no hace absolutamente nada, pero es posible crear un objeto de esta: SoloDatos s = new SoloDatos (); Es posible asignar valores a los datos miembro, pero primero es necesario saber como hacer referencia a un miembro de un objeto dado. Esto se logra escribiendo el nombre de la referencia al objeto, seguido de un punto, y a continuacion el nombre del miembro del objeto: ReferenciaAObjeto.miembro Por ejemplo: s.i = 47; s.f = 1.1f; s.b = false; Tambien es posible que un miembro tenga otros datos que se puedan modificar. Para ello, es necesario seguir separando por puntos. Por ejemplo: miAvion.tanqueIzquierdo.capacidad = 100; La clase SoloDatos no puede hacer mas nada que guardar datos, dado que no tiene funciones miembro (metodos). Para entender como funcionan estos, primero es necesario entender los parametros y valores de retorno. VALORES POR DEFECTO PARA LOS MIEMBROS PRIMITIVOS Cuando un tipo de dato primitivo es miembro de una clase, se garantiza que tenga un valor por defecto siempre que no se inicialice: Esta garantia no se aplica a las variables "locales" - aquellas que no sean campos de clases. Por consiguiente, si dentro de una definicion de funciones se tiene una variable dada y esta no se inicializa manualmente, Java se encarga de darnos un error de compilación indicando que dica variable deberia haber sido inicializada. MÉTODOS, PARÁMETROS Y VALORES DE RETORNO Los metodos en Java determinan los mensajes que puede recibir un objeto. Las partes fundamentales de un metodo son su nombre, sus parametros, el tipo de retorno y el cuerpo. He aquí su forma basica: tipoRetorno nombreMetodo ( /* lista de parametros */ ) { /* Cuerpo del metodo */ } POR AHORA ESO NOMAS CHE... GUSTO?
Datos archivados del Taringa! original
25puntos
0visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
10visitas
0comentarios
Dar puntos: