martes, 16 de diciembre de 2008

Operadores logicos.

El examen cubre 6 operadores logicos (&,&&,|,||,^,!)
La mayoria de los operadores logicos trabaja con dos expresiones boleanas(excepto !)
Los operadores && y & deben regresar verdadero solo si ambas expresiones son verdaderas.
Los operadores || y | deben regresar verdadero si solo una de sus expresiones es verdadera.
Los operadores || y && son conocidos como operadores "short-circuit".
Si el operador || encuentra la primera expresion como verdaera ya no verifica la segunda por que a webos la expresion es verdadera.
Si el operador && encuentra la primera expresion como falsa ya no verifica la segunda por que a webos la expresion es falsa.
Los operadores & y | evaluan siempre las dos expresiones.
El operador "^" (XOR) toma la expresion como verdadera si SOLO una de ellas es verdadera.
El operador ! regresa el valor opuesto de la expresion.

Operador terciario :D

Regresa dos posibles valores dependiendo de si una empresion booleana es verdadera o falsa.
regresa la expresion despues de ? si la expresion es verdadera.
regresa la expresion despues de : si la expresion es falsa.

ejemplo:

String a = (x>7) ? "si" : "no";

Operadores de incremento/decremento

Los operadores "--" y "++" si se usan como prefijos se ejecutan antes de que la sentencia se lleve a cabo.
Los operadores "--" y "++" si se usan como sufijos se ejecutan despues de que la sentencia se lleve a cabo.
Ambos operadores son completamente evaluados antes de que el operador es aplicado.
Una variable final no puede usar los operadores "++" ni "--".

Operador de concatenacion de Strings

Si solo uno de los operadores es un string el operador "+" concatena el string.
Si todos los operadores son numeros el operador "+" suma los numeros.

Operadores Aritmeticos

Hay 4 operadores matematicos primarios, suma(+),resta(-), multiplicacion(*) y division(/).
El operador residuo (%), nos devuelve el residuo de una division.
Los operadores son analizados de izquierda a derecha, al menos que tengan paretesis o que existan algunos operadores que tengan una precedencia mas alta que otra.
Los operadores *,/,% tienen una precedencia mas alta que +,-.

Operador instanceOf

Instance of se usa solo con variables de referencia y verifica si objeto es de un tipo especifico.
El operador instanceOf solo lo podemos usar para checar objetos(o null(siempre falso)) que se encuetran dentro del mismo arbol jerarquico.
Por el lado de las interfaces, un objeto pasa el instanceOf de "x" interfaz si implementa "x" o si cualquiera de sus padre implementan "x".

Operadores relacionales

El resultado de los operadores relacionales siempre es un valor booleano (true o false).
Existen 6 operadores delacionales (<,<=,>,>=,==,!=), los ultimos dos son comunmente llamados operadores de igualda.
Cuando comparas caracteres, java utiliza el valor 'unicode' de los caracteres como un valor numerico.
hay dos operadores de igualdad (==, !=)
cuatro tipos de cosas pueden ser probadas usando los operadores relacioneles(numeros, booleanos, caracteres y referencias a variables)
Cuando comparas dos referencias a variables regresa "true" solo si las dos referencias refieren al mismo objeto.

miércoles, 10 de diciembre de 2008

Recolector de Basura. (Garbage Collector)

Java prove un manejo de memoria automatico mediante el recolector de basura(GC).
Solo la JVM es la que decide cuando llamar al GC, nosotros solo podemos sugerirle que lo haga.
No podemos estar seguros de cual es el algoritmo del GC
Los Objetos deben de ser considerados elegible antes de que sean "tirados" por el GC.
No podemos estar seguros de como funciona el algoritmo del GC
Un objeto es elegible cuando ningun hilo(Thread) vivo puede accesar a el.
Para alcanzar un objeto deben tener una referencia viva que apunte hacia ese objeto.
Las aplicaciones en java pueden quedarse sin memoria disponible.
Haces una peticion al garbage collector con System.gc(); (solo antes de java 6)
La clase objeto tiene un metodo finalize().
El metodo finalize() solamente se ejecuta una vez por objeto, solo una vez jeje por lo mucho.
El GC no garantiza que el metodo finalize de todos los objetos se ejecute, este puede no llamarce nunca.
Puede hacer que un metodo no sea elegible para el garbage collectos si usas el metodo finalize() y este no corre(recordemos que el metodo finalize, te hae caso cuando se le pega la gana).

Overloading avanzado.

El "widening" de primitivos usa el metodo con el argumento mas pequeño que pueda ser usado.
Usados de forma individual el "boxing" y el "var-args" son compatibles con metodos sobrecargados.
No de puede hacer el widden, de una clase wrapeada a otra(la prueba IS-A falla).
No se puede hacer un "widen" y despues un "box"(un int no puede convertirse en Long).
Si se puede hacer el "box" y despues el "widen"(un int puede convertirse en Object)
No se puede convinar el var-args ni con "widening" ni con "boxing"

Boxing...

A aprtir de java 5 se puede convertir primitivos en "Wrapers" y "Wrapers" en primitivos automaticamente
usar "==" con "Wrapers" creados mediante "Boxing" es un poco tramposo, aquellos con los mismo valores que sean pequeños(tipicamente valores menores a 127) si son ==, los que son maoyres a estos nos son...

Uso de "Wrapers"

Las clases "Wraper" son equivalentes a los tipos primitivos
los "Wrapers" tienen dos funciones principales:
  • Envolver primitivos, para que puedan ser usados como objetos

  • Proveer varios metodos utiles para los primitivos

  • Existen tres metos principales para los "Wrappers"
  • xxxValue() no tiene argumento, regresa un primitivo

  • parseXxx(String st)tiene un String como argumento, regresa un primitivo

  • valueOf(String st) toma como argumento un String, regresa un "Wrapper"

  • Los costructores de "Wrapers" toman un String o un primitivo como argumento, excepto por el de Character, que toma solo un cha.
    Radix se refiere a la base, normalmete diferente a 10 por ejemplo 8 o 16

    Bloques de inicializacion.

    Los bloques estaticos de inicializacion corren una vez, cuando la clase es cargada.
    Los bloques de inicializacion de instancia corre cada vez que una instancia es creada. correan despues de todos los supercostructores ya antes de los constructores.
    Si existen multiples bloques de inicializacion siguen las reglas de arriba, pero el criterio de desempate entre estos es el orden en el que esten.

    Declaraccion, construccion e inicializacion de un arreglo

    Los arreglos pueden contener datos primitivos u objetos, pero en si mismos ellos son un objeto.
    cuando declaras un arreglo, los corchetes pueden estar a la derecha o a la izquierda del nombre del arreglo.
    Nunca se puede inclir el tamaño del arreglo en la declaracion de este.
    Debes de declarar el tamaño de este cuando llames al costructor con la palabra new, a menos que crees un arreglo anonimo.
    Los elementos dentro de un arreglo no son creados automaticamente, aunque si el arreglo es de primitivos si se les pone el valor de default.
    Obtienens un NullPointerException si tratas de acceder a un elemento que no no refiere a un objeto real.
    El indice de los arreglos comienza con 0(cero,zero,xrous,zetsfvddfffnfjbsfdchjvdptm)
    Un IndexOutOfBoundException ocurre cuando utilizas un indice incorrecto(como negativo o mayor o igual que el numero de elementos que contiene)
    Los arreglos tienen una variable lenght que nos dice el numero de elemento que tiene el arreglo.
    El ultimo index qque puedes accesar es uno menos que el valor del arreglo.
    Arreglos multidimencionales son simplemente arreglos de arreglos.
    Las dimenciones en un arreglo multidimencional pueden tener diferentes tamaños.
    Un arreglo de primitivos puede aceptar cualquier valor que pueda ser automaticamente promovido al tipo de dato del arreglo.
    Un arreglo de objetos puede acepara cualquier valor que pase la prueba IS-A con respecto a el tipo de daro del objeto.
    Si asignas un arreglo a otro, ambos arreglos deben de tener las mismas dimensiones para que la asignacion sea exitosa.
    Puedes asignar un arreglo a otro que sea un un supertipo del arreglo que estas asignando(por ejemplo puedes asignar un Honda[] a un Car[])

    martes, 9 de diciembre de 2008

    Pasar variables a metodos...

    Los metodos pueden usar valores primitivos o referencia a objetos como argumentos.
    Los argumentos de los metodos siempre son copias.
    Los argumentos de los metodos nunca son Objetos, son referencias a objetos.
    Un argumento primitivo es una copia del argumento original.
    Un argumento de referencia es una copia de la referencia de otra variable de referencia.
    Shadowing es cuando dos variable que estan en diferentes "scopes" tienen el mismo nombre, esto hace que la variable con el "scope" actual oculte al de scope mas amplio.

    Usar una variable o un elemento de un Arreglo que no ha sido inicializada ni asignada

    Cuando un arreglo de objetos es instanciado, los elementos del arreglo no son creados automaticamente, sin embargo todas la referencias obtienen el valor de null.
    Cuando un arreglo de primitivos es instanciado de llena con los valores de default.
    LAs variables de instancia son siempre inicializadas con sus valores de default.
    LAs variables locales, tambien llamadas automaticas o de metodos nunca se inicializan con sus valores de default, por lo tanto si tratamos de usar una que no este inicializada nos manda un error el compilador.

    Asignaciones Basicas.

    Las literales enteros son implicitamente int.
    Las expresiones con integer siempre regresan resultados de tamaño int, nunca menores.
    Los puntos flotantes son explicitamente doubles.
    Guardar un primitivo en un tipo de dato mas pequeño, siempre resulta en que se truncan los bits.
    Las asignaciones compuestas(ej: +=) siempre resultan en un casting automatico.
    Una variable de referencia guarda los bits que son usados para referir al objeto.
    Las variables de referencia pueden referir a subclases del tipo de objeto que esta guardando pero nunca a superclases.
    Cuando creas un nuevo objeto pasan 3 cosas(Ejemplo Button b = new Button() ).
  • Crea una variable de referencia llamada b, de tipo Button.

  • Crear un buvo objeto Button

  • Asignar la referencia b al recien creado objeto de tipo Button
  • Scope

    El scope(alcanze), se refiere al tiempo de vida de las variables.
    Ecisten basicamente 4 tipos de Scope
  • Las variables estaticas que viven tanto como vivan las clases

  • Las variables de instancia que viven el tiempo que sus objetos viven

  • Las variables locales viven el tiempo que su metodo este en el stack, aunquee si su metodo invoca a otro metodo, estas variable no estaran disponibles temporalmente

  • Las variables de bloque, existen el tiempo que su bloque tarde en terminarse
  • Casting Literal y Primitivo

    Las literales de tipo Integer pueden ser octal (ej:019) o Exadecimal (ej 0X3A7)
    Las literales para ong terminan en L o l.
    Las literales float Terminan en F o f y las double terminan en D o d.
    LAs literales para Boolean son "true" o "false"
    Las literles para char deben de estar entre comilla simples (ej: 'c')

    Stack y Heap

    Las variables locales viven en el Stack.
    Los objetos y sus variables de instancia viven en el Heap.

    Notas Mentales(no es parte de el orden original)

    xxxValue() //Regresa un primitivo de un objeto "wrapeado"
    parseXxx(String st) //Regresa un primitivo de un objeto "wrapeado"
    valueOf(String st) //Regresa un objeto de un dato primitivo.

    El compilador escoge hacer un Widening antes de hacer unBoxing.

    Una de las reglas mas importantes es que las cosas que ya existian(como en widening), sobre las nuevas caracteristicas de java 5(como el Boxing o el Var-args...)

    Ninguna de las clases wrapeadas puede hacer el boxing, por que un Short is NOT a Integer.

    Boxing --THEN----> Widening Esta BIEN.
    Widdening --THEN-> Boxing Esta MAL

    Un objeto es eligible para que lo mande a chingar a su madre el garbage collector cuando ningun hilo(Thread) vivo, puede accesar a el..

    martes, 25 de noviembre de 2008

    Acoplamiento y Cohecion.

    Acoplamiento se refiere a el grado en que una clase conoce datos acerca de los miembros de otra clase.
    Un bajo acomplamieto es deseable, puesto que las otras clases solo deben de saber cosas que realmente le interezan y los datos deben estar encapsulados.
    Cohesion se refiere al hecho de que las clases haces una funcion especifica.
    El hecho de que las clases hagan una sola y simple funcion aumenta la mantenibilidad del codigo.

    Static

    Los metodos estaticos(Static) se usan cuando queremos hacer cosas que no afectan el funcionamiento de ninguna instancia en especifico.
    Las clases estaticas se usan para guardar valores que pertenecen a la clase, no a una instancia en especifico.
    Todos los metodos estaticos pertenecen a las clases, no a las isntancias.
    Un metodo estatico no puede acceder a una variable de instancia directamente.
    Se puede acceder a una miembro estatico utilizando el nombre de la clase( Class.Metodo()), pero recuerda que acceder a una variale de estatica utilizando una instancia es una trampa, en realidad la variable sigue sin pertenecer a la instancia sino a la clase.
    Los metodos estaticos no pueden ser sobreescritos, pero pueden ser redefinidos.

    Constructores e instansacion

    Un costructor siempre es invocado cuando un objeto es creado.
    Cada una de las superclases en un arbol de herencia tiene a un constructor llamado.
    Todas las clases, incluso las clases abstractas tienen por lo meos un constructor.
    Los constructores deben tener el mismo nombre de la clase.
    Los constructores no tienen tipo alguno de retorno, si ves a un "cosntructor" con un tipo de retorno, no es un constructor es un metodo.
    LA forma en que funcionan los contructores es la siguente:
    -->Un cosntructor llama al costructor de su clase padre, este a su vez llama al costructor de su clase padre y asi sucesivamente.
    -->El super super super (el ultimo padre) costructor se executa, luego continua el que lo halla llamado y asi sucesivamente.
    Los constructores pueden usar cualquier modificador de acceso(incluso privado)
    El compilador te crea un cosntructor por default si tu no creas ningun constructor explicitamente.
    El constructor que se crea por default es un cosntructos sin argumentos, con una llamada a super();
    La primera sentencia de un cosntructor debe de ser o this() (un constructor sobrecargado) o super().
    Solo podemos acceder a los miembros de instancia luego de que el constructor se halla executado.
    Las clases abstractas tienen constructores que son llamados cuando la primer subclase concreta los llama.
    Las interfaces no tienen constructores.
    Los constructores nunca son heredados, por los tanto no pueden ser sobreescritos.
    Si una superclase no tiene un constructor sin argumentos entonces tenemos que poner un llamado a super() con argumentos a webos.
    Un constructor solo puede ser llamado dentro de otro costructor usando las palabras this() o super().
    Cosas que debemos hacer para llamar correctamente a this()
    -->Deben aparecer solo en la primera sentencia del constructor.
    -->La lista de argumentos nos dice cual constructor sobrecargado es llamado.
    -->Constructores pueden llamar a constructores, que pueden llamar a cosntructores ya asi hasta que se te de la gana, pero al final alguno de ellos tiene que hacer un llamado al super() o el Universo Java como lo conocemos implocionaria(ok, solo se acaban los recursos de tu compu y se bloqueria(tal vez eso es peor :P))
    -->llamados a this() y super() no pueden ir en el mismo constructor, puede poner cualquiera de los dos, pero no los dos al mismo tiempo.

    -->

    martes, 18 de noviembre de 2008

    Tipos de retorno

    Los metodos sobrecargados pueden cambiar su tipo de retorno, los metodos sobreescritos no pueden exceptuando los retornos covariantes(Hijos del tipo de retorno original)
    Los metodos que retornen un objeto, pueden retornar tambien null, si lo desean
    Array es un tipo de retorno valido.
    Para metodos con tipos de retorno primitivos, cualquier cosa que se pueda convertir implicitamente el tipo de retorno deseado es valido.
    Nada puede ser rettornado en un tipo de retorno void, pero pueder regresar nada, es decir puesdes escribir return; sollito.
    Los metodos que retornen una referencia a un objeto pueden retornar un subtipo.
    Metodos que retoenen una interfaz, pueden retornar cualquier implementacion de esta.

    miércoles, 12 de noviembre de 2008

    Implemento de interfaces

    Implementar una interface.
    Cuando implementas una interface, estas firmando un contrato.
    Implementas una interface al sobreescribirla propia y correctamente en todos los metodos que son definidos por la interface.
    Una sola clase puede implementar multiples interfaces

    Casting

    Casting para variables de referencia
    Hay dos tipos de casting para variable de referencia, el downcasting y el upCasting.
    Downcating: Si se tiene una variable de reque refiera a un subtipo del objeto,puedes asignarlo a una variable de referencia del suptipo en especifico.Se debe de hacer un casting especifico para poder hacer esto y el resultado es que puede acceder al nuevo subtivo con la nueva ariable de referencia
    Upcasting: Puedes asignar una variable de referencia a un supertipo de de otra variable de referencia ya sea de forma implicita o explicita. Esta es una operacion segura, por que la superclase contiene todas las cosas que tiene la subclase..

    Metodos sobrecargados(Overloaded)

    Un metodo sobrecargado significa que se va a reusar el nombre del metodo, pero con argumentos diferentes.
    caracteristicas de los Metodos sobrecargados:
    -->Deben de tener una lista de argumentos diferente.
    -->Pueden tener diferentes tipos de retorno, si la lista de argumentos es tambien diferente.
    -->Pueden tener diferentes modificadores de acceso.
    -->Metodos de usa superclase pueden ser sobrecargados en una subclase.
    El polimosfismo aplica a metodos sobreescritos, pero no a sobrecargados.
    El tipo de referencia determina cual metodo sobre cargado va a ser llamado en tiempo de compilacion.

    Metodos sobreescritos(Overriding)

    Los metodos pueden ser sobreescritos o sobrecargados, los constructores pueden ser sobrecargados pero no sobreescritos.
    Los metodos estaticos deben(obligatoriamente) ser sobreescritos por la primera clase concreta no abstracta.
    Caracteristicas de los metodos sobreescritos:
    -->Deben tener la misma lista de argumentos.
    -->Deben tener el mismo tipo de retornos, excepto por que apartir de java 5 , el tipo de retorno puede ser una subclase,esto es conocido como retorno covariante.
    -->No debe de tener un tipo de acceso mas restrictivo.
    -->No bede de lanzar nuevas excepciones o excepcionnes que no sean las excepciones ya lansadas o sus sublcases.
    -->Puede lanzar nuevas excepciones que sea subclases de las excepciones ya lanzadas o cualquier unchecked exception(excepciones en tiempo de ejecucion)

    Los metodos finales no pueden ser sobreescritos.
    Solo los metodos heredados pueden ser sobreescritos, y recuerda que los metodos privados no son sobreescritos.
    una subclase una la sintaxis super.nombreDelMetodoSobreescrito() para llamar a la version de la superclase del metodo.
    El tipo de objeto(no la variable de referencia), determina cual tipo de metodo sobreescrito es llamado en tiepo de ejecucion.

    Polimorfismo

    Polimorfismo significa muchas formas.
    Una refrencia a una variable, es siempre unica, nos se le puede cambiar el tipo, pero puede referir a un subtipo del objeto que declaro.

    Un solo objeto puede ser referiado por muchas variables de referencia de muchos tipos diferente.. siempre y cuando sean del mismo tipo o supertipo del objeto.

    La variable de referencia(no en objeto en si mismo), determina a que metodo se tiene que llamar.
    En compilador solo sabe que variable de referencia se esta usando, pero al momento de que el objeto se ejecuta ya se sabe que objeto es.
    LA invocacion polimorfica de los metodos aplica solo a metodos de instancia sobreescritos, no a variables estaticas ni a variables, solo a metodos que puedan llamarce a travez de una instancia.

    Herencia

    Las herencia permite a una clase ser una subcalse de una superclase, y por lo tanto heredar las variables public y protected y los metodos de la superclase
    Herencia es el concepto principal para entender IS-A, polimorfismo, sobreescritura, sobrecargado, y casting.

    Encapsulacion IS-A HAS-A

    LA encapsulacion ayuda a esconder la implementacion detras de una interface
    El codigo encapsulado tiene dos caracteristicas:
    Las variables de instancia se mantienen protegidas
    Los metodos getter y setter proveen acceso a las variables de instancia.
    IS-A se refuere a herencia o iplementacion
    IS-A se expresa con la palabra reservada extends.
    IS-A "hereda de" y "es un subtipo de" significan lo mismo.
    HAS-A significa que una instancia de una clase "tiene una(HAS-A)" referencia a una instancia de otra clase u otra instancia de la misma clase.

    domingo, 2 de noviembre de 2008

    Enumeradores(enums)

  • Un enum especifica una lista de constantes que son asignadas a un tipo de valor.

  • Un enum no es ni un entero ni un String, los enums tiene su propio tipo de objetos

  • Un enum puede ser declarado fuera o dentro de una clase pero nunca dentro de un metodo

  • Un enum declarado fuera de una clase no puede ser static final, abstract private o protected

  • Los enumeradores pueden incluir constructores, metodos, variables y las constantes pueden contener cuerpos

  • Los constructores amndan argumentos al constructor de elnumerado con la sintaxis GRANDE(8) donde el 8 es el valor que se manda a el constructor y grande el nombre de un valor del enumerador

  • Los contructores de los enumeradoress pueden tener a rgumentos y pueden ser sobrecargados

  • Los contructores de los enumeradores NUNCA se llaman directamente en el codigo, estos son invocados cuando el enumerador es inizializado

  • el punto y coma al final de un enumerado es opcional, podemos poner:
    --> enum Numeros{UNO,DOS,TRES} o
    --> enum Numeros{UNO,DOS,TRES}

  • myEnum.values() nos regresa un arreglo con el valor de todos los enumeradores
  • Variables y metodos estaticos

  • Las variables estaticas no perteneces a ninguna instancia de las clases

  • No se necesita tener una instancia a las clases para poder usar los miembros estaticos de esta

  • Solo existe una copia de las variables estaticas y todas las instancias la comparten

  • Los metodos estaticos no tienen acceso a miembros no estaticos
  • Declaracion de arreglos

  • Los arreglos pueden contener objetos primitivos, pero el arreglo en si mismo es un objeto

  • Cuando declaras un arreglo los corchetes pueden ir en el lado derecho o izquerdo del nombre del arreglo, en inclusive puede ir en ambos lados si es un arreglo multidimencional

  • No es legal incluir el tamaño del arreglo en la declaracion

  • Un arreglo de objetos puede contener cualquier objeto que pase la prueba IS-A con respecto al tipo de objeto declarado
  • Declaracion de variables

  • Las variables de instancia pueden
    -->Tener cualquier tipo de control de acceso
    -->Ser transient , final o volatile

  • Es legal declara a una variable local con el mismo nombre de una variable de instancia esto es llamado como "shadowing"

  • Las variables finales tienen las siguentes propiedades
    -->No pueden ser reinicializadas una ves que se les asigna un valor
    -->No pueden referir a otro objeto una ves que han sido asignadas a un objeto
    -->Las variables de referencia fginal deben de ser inicializadas antes de que el contructor se complete

  • No existe cosa alguna como un objeto final, el hecho de que la referencia a un objeto no se pueda modificar no sgnifica que el objeto en si mismo no pueda modificarse

  • Las variables transient y volatile solo aplican a variables de instancia
  • Metodos con var-args

  • En java 5 se agrego una nueva forma de argumentos que acepta de cero a muchos argumentos y se llaman var-args

  • Un var ar se declara con el tipo, depues 3 puntos y el nombre ... por ejemplo hasAlgo(int... cont){}

  • un metodo solo puede tener un parametro var arg y este tiene que ir siempre el ultimo de los parametros
  • Otros modificadores para miembros

  • Los metodos finales no deben de ser sobreescritos

  • Los metidos abstractos son declarados con nombre, argumentos y valor de retorno pero no son implementados, terminan con ";"

  • Hay tres formas de darnos cuenta que un metodo no es abstracto
    -->El metodo no esta marcado como abstracto
    -->El metodo tiene llaves "{}"
    -->El metodo tiene codigo entre las llaves

  • La primera clase no abstracta(concreta) debe implementar todos los metodos abstractos de sus padres

  • El modificador synchronized puede utilizarse solo con metodos y bloques de codigo

  • los metodos sincronizados pueden tener cualquier control de acceso y tambien pueden marcarse como final

  • Los metodos abstractos deben de ser implementados por una subclase, por eso:
    -->Los metodos abstractos no pueden ser private
    -->los metodos abstractos no pueden ser final

  • El modificador native aplica solo a metodos

  • El modificador strictfp aplica solo a clases y metodos
  • Variable Locales

  • Las variable locales no pueden tener modificadores de acceso

  • final es el unico modificador permitido para variables locales

  • Las variables locales no obtienen valores por default, por lo que tienen que ser inicializadas antes de usarse
  • Modificadores de acceso de miembros

  • Metodos y variables de instancia(no locales) son llamadas miembros

  • Los miembros pueden usar los 4 niveles de acceso (public, private, protected y default)

  • El acceso a miembros viene en 2 formas.
    -->Codigo en una clase puede aceder por medio de una instancia al codigo de otra clase.
    -->El codigo de una clase puede acceder al codigo de otra mediante herencia

  • Si una clase no puede ser accesada sus miembros tampoco pueden serlo

  • Determina la visibilidad de las clases antes de determinar la visibilidad de los metodos

  • Los miembros publicos pueden ser accedidos por otras clases, aunque esten en otros paquetes

  • Si el miembro de la superclases es publica, cualquier clase que herede esta clase tambien heredara a sus miembros publicos

  • Los metodos que no se accesan mediante el operador punto (".") se accesan mediante herencia o pertenecer a la misma clase

  • this. siempre se refiee al metodo actual

  • this.aMethod es exactamente lo mismo que escribir aMethod

  • Los miembros privados solo se pueden acceder por clases en el mismo paquete

  • Los miembros privados no son vistos por las subclases, por lo tanto no pueden ser heredados

  • Los miembros default y protected difieren solo cuando hablamos de subclases
    -->Los miembros default solo pueden ser accedidos por clases del mismo paquete
    -->Los miembros protected pueden ser accedidos por clases del mismo paquete y por medio de herencia por miembros de otras clases no importando en que paquete esten
    -->protected = paquete + hijos (subclases)
    -->Fuera del paquete un miembro protected SOLO puede ser accedido por medio de herencia y una ves que se eredan los miembros se vuelven privados para todas las demas clases

    -->



  • Implementacion de interfaces.

  • Las interfaces son contratos que te dicen que hacer, pero no te dicen nada acerca de como las clases deben de hacerlo

  • Las interfaces pueden ser implementadas por cualquier clase de cualquier arbol de herencia

  • Una interfas es como una clase 100% abstracta, es implicitamente abstracta aunque escribas explicitamente la palabra "abstract" o no

  • LAs interfaces solo pueden tener metodos abstractos, no son permitidos los metodos concretos

  • Las interfaces son por default public y abstract, no es necesario que escribamos los modificadores para que sea asi

  • LAs interfaces pueden tener constantes, las cuales son implicitamente public, final y static

  • Escribir las palabras public, static o abstract e las constantes de las interfaces es opcional y se pueden escribir en cualquier orden

  • La primera clase no abstracta que implemente legalmente a la interfaz debe de tener las siguentes caracteristicas:
    -->Provee una implementacion concreta para los metodos de la interface
    -->Debe de seguir todas las reglas para osbreescribir los metodos que implementa
    -->No debe de declarar ninguna otra "Checked exception" de un metodo implementado
    -->Puede declarar Runtime Exception(Errores en tiempo de ejecucion.
    -->Mantener la misma sintaxis, incluyendo argumentos y tipos de retorno.

  • Una clase implementado una interfaz puede ser en si misma abstracta

  • Una clase abstracta no tiene por que implementar los metodos de una interface(pero la primera subcalase concreta si)

  • Una clase puede extender solo una clase pero implementar varias interfaces

  • Una interface puede extender varias interfaces

  • Las interfaces no pueden extender clases ni implementar clases ni interfaces

  • En el examen debemos de verificar que las clases e interfaces esten bien usadas antes de verificar el codigo en si
  • Otros modificadores de clases .

  • Las clases solo pudente tener otros 3 tipos de acceso
    -->final
    -->strictfp
    -->abstract

  • Una clase no puede ser final y abstract al mismo tiempo

  • Una clase final no puede ser extendida

  • Una clase abstracta no puede ser instanciada

  • Si se tiene un solo metodo abstracto dentro de una clase, la clase completa debe de ser abstracta

  • Una clase abstracta puede tener tanto metodos abstractos como no abstractos

  • la primera clase concreta en extenbder una clase abstracta debe de implemetar todos los metodos abstractos
  • Modificadores de acceso de clases

  • Existen 3 modificadores de acceso
    -->public
    -->private
    -->protected


  • Existen 4 tipos de niveles de acceso
    -->public
    -->private
    -->protected
    -->default


  • las clases solo pueden tener acceso publico o default

  • Una clase con un acceso default solo puede ser visto por las clases dentro del mismo paquete

  • Una clase con acceso public puede ser visto por cualquier clase en cualquier paquete

  • La visibilidad nos indica que la clase puede con respecto a la otra:
    -->Crear una instancia de otra clase
    -->Extender (ser una subclase) seotra clase
    -->Acceder a los metodos y variables de la otra clase
  • Reglas de declaracion.

  • Un archivo de codigo puede tener solo una clase publica

  • Si el archivo de codigo contiene una clase publica, debe esta debe de ser la misma que la de el archivo de codigo

  • Un archivo solo puede tener una sentencia "package" pero multiples "import"s

  • La sentencia del package debe de ir al principio del archivo

  • los imports deben de ir despues del package pero antes de la eclaracion de las clases

  • El package y los imports aplican para todas las clases del archivo

  • Los comentarios son de chocolate :D, pueden ir en cualquier parte

  • Un archivo puede tener mas de una clase no publica

  • Los archivos que no contienen ninguna clase publica se pueden llamar como quieran
  • Identificadores

  • Las variables deben de empezar con una letra, un signos de "$" o un "_" despues se pueden utilizar los mismos símbolos y números

  • Las clases y las interfaces deben empezar con Mayúscula

  • Los métodos y las variables deben de escribirse con "camelCase" (primero minúscula y después mayuscula al inicio de las demás palabras)

  • Las constantes deben de ser final y static y estar COMPLETAMENTE_EN_MAYUSCULAS
  • viernes, 3 de octubre de 2008

    Miembros de las clases(Metodos y variables de instancia)

    Accesos default y protected
    El acceso default y protected sólo se diferencian cuando hablamos de subclases, hay qué pensar en el aceso default como un acceso a nivel de paquetes es decir cuando intantamos accesar a un miembro qué es protected sólo podemos hacerlo si estadentro del mismo paquete a(y lo unstanciamos. Correctamente) si intantamos entrar desde una clase fuera del paquete nos va a mandar un error de compilación dicendonos que el miembro no existe
    Por que de hecho no es siquera visible fuera del paquete, cuando intentamos acceder fuera de este nos manda una espantosa X.
    Ahora cuando hablamos de protected las reglas del juego cambian como en el big brother com protected si podemos acceder fuera del paquete pero solo por medio de herencia es decir solo los hijos de la clase pueden acceder pero no por medio de una instancia sino llamando al método directamente o lo que es lo mismo usado el operador this, si queremos instanciarlo nos va a mandar far... Far away
    VARIABLES LOCALES
    No esxiste ningún modificador de acceso que pueda usarse con las variables locales, el único modificador que permiten las variables locales es el final.
    OTROS MODIFICADORES PARA MIEMBROS
    Existen varios modificadores para miembros como son final abstract strictfp volatile transient sinchronized static y native primrero veremos laos que se aplican a loa métodos
    METODOS FINAL
    Los métodos final no pueden ser sobreeacritos, bistros podemos usarlos pero si tratamos de sobreescribirlos nos manda un error de xompilacion esto se hace cuando queremos asegurarnis que nadiie pueda cmbiar el comportamiento de nuestros metodos
    ARGUMENTOS FINAL
    UN argumento es prácticamente lo mismo que una variable local, cuando declaramos un argumeto como final nos aseguramos de que los valores que les pasemos a esos mtods no pueden ser cambiados.(o el objeto al que refiere en u caso)
    MÉTODOS ABSTRACTOS
    Un metodo abstract termina con punto y coma y no puede se definido en la clase en las que es declarada, ose no ponemos una implementación del método sólo ponemos los modificadores de acceso el nombre del método y los argumentos , pero nunca lo implementamos,.
    Un metodo abstracto debe de estar dentro de una clase abstracta, sin embargo piedra esxistir métodos comcretos dentro de una clase abstracta, va de nuevo , si un simple método es declarado abstracto la clase estera deber de ser abstracta, si no nos manda un error de compilación , sin embargo pueden existir clases abstractas con sólo métodos concretos.
    La primera clase concreta que extienda a una clase abstracta debe implementar los métodos abstractos de está y de todas sus superclases.
    El modificador abstract no lo podemos mezclar con final ni private, simplemete por que no tendríamos forma de implementarla, tampoco puede ser static.
    SYNCRONIZED
    un método sincronizado sólo puede accederse por un hilo a la vez, al acceso sinchronized sólo aplica a métodos y nada más.

    Clases

    Existen dos modificadores para las clases public y default sólo puede haber una clase pública por cada archivo de código y debe tener el mismo nombre que el archivo puede haber las clases privadas que sean, y si no existe una clase pública el archivo puede tener cualquier orden
    Otros modificadores aparte de public y default una clase puede tener otros 3 tipos de modificadores estos son final,abstract y strictfp
    Los modificadores strictfp y abstract se pueden usar juntos pero nunca podemos usar final y abstract
    El modificador strictfp sólo se puede usar con clases y metodos pero nunca con variables
    FINAL
    Una clase que es final no puede ser una subclase es decir ninguna otra clase la puede extender
    ABSTRACT
    Una clase abstracta no puede ser instanciada, su único propósito en l vida es ser extendida, es decir no podemos crear un objeti con está clase pero podemos utilizarla para crear otras clases que si pueden ser instanciadas, una clase abstracta no termina con llaves ,termina con punto y coma , no se puede marcar una clase abstracta y final por qué tienen significados opuestos
    INTERFACES
    Las interfaces son como cases 100% abstractas, es decir en ellas solo se pueden declarar metodos abtractos , las interfaces son abstractas le pongamos ese modificador o no, las interfaces pueden ser públicas o default , pero los metodos dedntro de las interfaces son implictsmente public y abstract , las interfaces no pueden ser static y al ser abstractas tampoco pueden ser final las interfaces no pueden extender ni implementar ninguna clase , pero tampoco pueden implmentar interfaces, sólo extienden interfaces, y puede estender las interfaces que quiera, ninguna, una o varias
    Las variables de las interfaces son implícitamente public, static y final lo escribamos así o no.
    MIEMBROS DE LA CLASE
    Los métodos y las variables de instancia son llamados miembros, los miembros pueden tomar todos los modificadores de acceso el public, private, default y protected
    Existen dos firmas de acceder a un método de un clase, el primero es usado el operador "." esto es instanciando la clase y utilizar el operador punto para accesar a un método o a alguna variable local.
    La segunda forma es por medio de la herencia, cuando extendéis otra clase estamos tomando todos sus métodos y variables de instancia y estamos haciendolos nuestros, por eso no ncesiramos nada para usarlos, simplemente los llamamos con su nombre.
    PUBLIC
    Cuando un miembro es public, puede ser accesado desde cualquier lado siempre y cuando clase pueda ser accesada, es decir si podemos ver l clase podemos ver cualquier método público, cuando extendemos una clase. Toda los miembros públicos son heredados sin importar el paquete en que se encuentren
    PRIVATE
    Un miembro privado no puede ser visto en ningún lugar fuera de la clase en donde es declarado, ni siquiera por herencia , es decir su una clase es privada unicamente puede ser vista por la mismo clase, si tratamos de accesarlo desde otra clase nos manda un error de compilación, podemos declarar otro metido con el mismo nombre en una subclase, pero no estamos sobrescribiendo nada, sólo es otro método.
    .

    martes, 30 de septiembre de 2008

    Star all over again

    Bueno les Cuento de rapido que el manual que me estaba leyendo es para el examen version 1.4 y actualmente el que ponen es el 1.6, ya encontre un nuevo manual para la 1.6 y estare subiendo mis apuntes en español en esta pagina.... Bueno a empezar de nuevo :D

    domingo, 28 de septiembre de 2008

    Implementacion de la interface

  • Las interfaces son como contratos que nos dicen que tenemos que hacer, pero no nos dicen como hacerlo

  • Las interfaces pueden ser implementadas por cualquier clase de cualquier arbol de herencia

  • Una interface es como una clase 100% abstracta y es implicitamente abstracta, escribas el modificador "abstract" o no

  • Una clase abstracta puede solo tener metodos abstractos, no son permitidas clases concretas

  • Las interfaces son por default public y abstract, lo escribamos implicitamente asi o no

  • Las interfaces pueden tener constantes que son implicitamente public, static y final

  • Poner el "public", "static", y/o "abstract" en las variables es opcional, pero se pongan o no se pongan siguen siendo public,static y final

  • Una clase concreta que implemente una interfaz debe de:
    -->Proveer una implementacion completa para todos los metodos de la interface.
    -->Seguir todas la reglas legales para sobreescribir los metodos que implementa.
    -->no debe declarar ninguna nueva "checked exception" para la implementacion de un metodo.
    -->No se debe declarar ninguna excepcion que no se encuentre dentro de las excepciones que ya se declararon en la interfaz.(osea que no sea una subclase o la clase misma que se declaro)
    -->Debe declarar las "runtime exception" de cualquier implementacion de los metodos de la interface, sin importar la declaracion de la interfaz
    -->Debe de conservar los mismos argumentos y tipos de retorno que ya se definieron

  • Una clase que implementa a una interfaz puede ser en si misma abstracta

  • Una clase abstracta que implementa una interfaz no esta obligada aimplementar los metodos de la interfaz(Pero la primera clase concreta si debe)

  • Una clase solo puede extender de otra clase, pero puede implementar muchas interfaces

  • Una interfaz puede extender una o mas interfaces

  • Una interfaz no puede extender una clase ni implementar clases ni interfaces

  • Cuando estemos haciendo el examen lo primero que debemos hacer es verificar si las declaraciones de las clases son validas, antes de hacer lo demas
  • java.lang.Runable

  • Tenemos que memorizar que java.lang.Runable es una interface que contiene un metodo que tenemos que implementar public void run{}
  • Propiedades del main()

  • Debe de ser estatico("static")

  • Debe de tener un "void" como tipo de retorno

  • Debe de tener un Arreglo de strings de argumento, el nombre puede ser cualquiera, aunque normalmente se pone args[]

  • solo para propisitos del examas vamos a asumir que el metodo main debe de ser publico

  • Sino llamamos correctamente al main(), nos manda un runtime exception(error al momento de la ejecucion)

  • En la declaracion del metodo main() los modificadores static y public pueden cambiarse de orden y el args puede cambiarse de nombre

  • Pueden existir otros metodos main pero el compilador solo buscara el que sea public static void main(args[])
  • Reglas de declaración

  • Solo puede existir una clase publica por archivo de codigo

  • Si el archivo de codigo contiene una clase publica, esta debe de tener el mismo nombre que el del archivo

  • Un archivo puede tener solo una sentencia "package" pero muchos imports

  • La sentencia "package"(si existe) debe de estar al principio del codigo

  • La sentencia "import"(si existe) debe de estar despues del package y antes de la declaracion de la clase

  • Los "package" y los "imports" aplican a todos los componentes de la clase

  • Un archivo puede tener mas de una clase no publica

  • Los archivos sin una clase publica no tienen restriccion en cuanto al nombre

  • En un archivo las clases pueden estar en cualquier orden

  • Las sentencias "imports" solo solo proveen una atajo para los nombres completos qualificados

  • Los imports no causan problemas de rendimiento y no incrementan el tamaño del codigo

  • Si usamos un metodo de otra clase, pero no la importamos debemos usar el nombre comppleto ej: java.util.ArrayList jua = new java.util.ArrayList()

  • Los imports y los nombres completos pueden coexistir

  • Los imports que terminan con ".*;" estan importando todas las clases del paquete

  • Los imports que terminan con ";" estan importando una sola clase

  • Debemos uasar el nombre completo cualificado cuando importamos dos clases que tienen el mismo nombre
  • Variables y metodos estaticos(static)

  • No estan "unidos" con ninguna instancia en particular

  • No necesita existir una instacia de una clase para poder usar una variable o metodo estatico

  • Solo existe una copia de una variable estatica por clase y todas las instancias los comparten

  • Las variables estaticas obtienen los misvos valores por default que las variables de instancia

  • Un metodo estatico (Como main()) no puede acceder a una variable no estatica

  • Podemos acceder a los miembros estaticos usando el nombre de la clase nombreDeLaClase.nombreDelMetodo()

  • tambien podemos acceder a un metodo estaitico utilizando una instancia de una referencia a una variable algunObjeto.nombreDelMetodo(), pero esto es una pequeña "trampa", por que no por que el metodo no va a tomar en cuenta para nada al objeto que lo esta invocando

  • Los metodos estaticos no pueden ser sobreescritos("overriden"), sin embargo pueden ser redeclarados o redefinidos por una subclase,Osea aunque aveces el metodo estatico puede aparentar estar sobreescrito, el polimorfismo no se aplica
  • Otros modificadores de acceso para miembros

  • Los metodos finales no pueden ser sobreescritos en una subclase

  • Los metodos abstractos tienen que ser declarados con un tipo de retorno y los argumentos, pero no deben de ser implementados

  • los metodos abstractos terinan con punto y coma no con llaves ejemplo: anAbstractMethod();

  • Hay 3 formas de reconocer que un metodo no es abstracto
    -->El metodo no esta marcado como abstracto
    -->El metodo tiene llaves "{}"
    -->El metodo tiene codigo entre las llaves

  • La primera clase concreta que extienda a una clase abstracta debe de implementar todos los metodos abstractos de esta clase y de sus clases padres en caso de que estas existan y sean abstractas

  • Los metodos abstractos deben de ser implementados por alguna subclase, por esta razon:
    -->Los metodos abstractos no pueden ser private
    -->Los metodos abstractos no pueden ser final

  • El modificador Synchronized aplica solo a metodos

  • Los metodos sincronizados pueden tener cualquier modificador de acceso y tambien pueden ser marcados como final

  • Los metodos sincronizados no pueden ser abstractos

  • El modificador native se aplica solo a metodos

  • El modificador strictfp aplica solo a metodos y clases

  • Las variables de instancia pueden
    -->tener cualquier modificador de control
    -->Ser marcdas como final o transient

  • LAs variables de instancia no pueden ser declaradas abstract, syncronized, native ni strictfp

  • Es legal llamar a cualquier variable local con el mismo nombre de una variable de instancia, esto se le conoce como "shadowing"

  • LAs variables finales tienen las siguientes propiedades:
    -->Las variables finales no pueden ser reinizializadas cuando se les agrega un valor
    -->Las referencias finales no pueden apuntar hacia un objeto diferente una vez que han sido asignadas a un objeto.
    -->Las referencias fiales deben de ser inicializadas antes que el constructor se complete.

  • No existe un "Objeto final", el hecho de que una referencia sea final, no sognifica que no podamos cambiar el valor del objeto

  • El modificador trancient aplica solo a variables de instancia

  • El modificador volatile aplica solo a variables de instancia
  • Variables Locales

  • Las variables locales no pueden tener modificadores de acceso

  • Final es el unico modificador de acceso que pueden tener las variables locales

  • Las variables locales no obtienen valores por default, por eso tienen que ser inicializadas antes de usarse
  • Modificadores de acceso de miembros

  • Los metodos y las variables de instancia son consideradas como miembros

  • Los miembros pueden usar los 4 modificadores de acceso: public, private, "default" y protected

  • Podemos acceder a los miembros de 2 formas:
    -->Mediante codigo dentro de la clase para acceder a un miembro de otra clase
    -->Mediante herencia cuando accedemos a los "miembros de la clase padre"

  • Si no podemos acceder a una clase, no podemos acceder a sus "miembros"

  • Hay que determinar la visibilidad de la clase antes de determinar la visibilidad del "miembro"

  • Los miembros public pueden ser accedidos por todas las clases, incluso si se encuentran en paquetes diferentes

  • Si el miembro de una superclase es publico, sus hijos lo heresan, sin importar el paquete en el que se encuentren

  • Los miembros que son accedisos sin unsar el operador punto(.) deben de pertenecer a la misma clase

  • this. Siempre se refiere al objeto que se esta ejecutando en el momento que es invocado

  • this.unMetodo() es lo mismo que simplemente escibir unMetodo()

  • Los miembros privados, pueden ser accedidos solamente por codigo en la misma clase

  • Los miembros provados no son visibles en las subclases, por lo tanto los miembros privados no son heredados

  • Los miembros default y protected solamente son diferentes cuando se esta hablando de las subclases
    -->Los miembros defult solo pueden ser accedidos por clases en el mismo paquete
    -->Los miembros protected, pueden ser accedidos por las clases en el mismo paquete y las subclases sin importar en que paquete se encuentren.

  • Protected = paquete mas hijos(osea subclases)

  • Para subclases fuera del paquete los miembros protected pueden ser accedidos solo por medio de herencia,una subclase fuera del paquete no puede acceder a un miembro protected usando una referencia a una instancia de la superclase(osea solo pueden acceder por herencia)

  • Un miembro protected heredado mediante herencia a otra subclase, se vuelve practicamente privado a las clases que accedan a la subclase

  • otros Modificadores de clases.

  • Las clases tambien pueden serfinal,abstract o strictfp

  • Una clase no puede ser final y abstract

  • una clase final no puede ser una subclase

  • Una clase abstracta no puede ser instanciada

  • Si existe un solo metodo abstracto en una clase, se debe marcar toda la clase como abstracta

  • Una clase abstracta puede tener tanto metodos abstractos como concretos(no abstractos)

  • La primera clase concreta en extender una clase abstracta debe de implementar todos sus metodos
  • Clase y modificadores de acceso

  • Existen 3 modificadores de accceso public private y protected

  • Existen 4 niveles de acceso, public, protected, "default y private

  • Las clases solo pueden tener acceso publico o default

  • Que una clase sea visible por otra significa que puede
    -->Crear una instancia de la otra clase
    -->Extender la otra clase
    -->Acceder a los metodos y las variables de la otra clase