SCJP for JSE5 - 6

Posted on mayo 27, 2007 by Carlos Alexander Zuluaga

Acabo de crear una página donde reúno todos los recursos que voy encontrando con material para la certificación.
Por ahora están los links que he publicado acá mismo y adicionalmente las preguntas que hago sobre cada tema. Pero como la idea es que sea algo más o menos grande y que sirva de verdad, los recursos (links, preguntas, etc) que pongan en los comentarios o envíen a mi correo (alexander.zuluaga[arroba]gmail.com), los iré publicando. Insisto, sobre todo hacen falta preguntas.

La página completa: http://sprogramando.wikidot.com/scjp-for-jse5.

Las preguntas: http://sprogramando.wikidot.com/preguntas-scjp-for-jse5-preguntas.

Pues nada, esperemos a ver como funciona esto.

SCJP for JSE5 - 5

Posted on mayo 26, 2007 by Carlos Alexander Zuluaga

1. DECLARACIÓN DE MÉTODOS Y ATRIBUTOS (MIEMBROS)

Los atributos y métodos de las clases tienen siempre un nivel de acceso aunque éste no sea digitado. Existen cuatro niveles: public, protected, default y private, cada uno de ellos restringiendo o permitiendo el acceso a los miembros de las clases, pero, es muy importante saber que si una clase no puede "ver" a la otra, mucho menos podrá ver sus miembros; esto ocurre en el caso de una clase con modificador de acceso default (cuando no se digita nada) que se intenta acceder desde una clase en un paquete diferente. Por ejemplo:

package uno;
class Servidor{
   //muchos métodos y atributos
}

package dos;
public class Cliente{
   //otro montón de métodos tratando de acceder a Servidor
}

En este caso no importan los modificadores de acceso de los miembros de la clase Servidor, por tener esta el tipo de acceso por defecto (default), la clase Cliente nunca podrá acceder a sus atributos o métodos, a menos claro, que se modifiquen para pertenecer al mismo paquete.

Una clase solo puede invocar los métodos o ver los valores de los atributos de otra, cuando ésta última es pública o se encuentran en el mismo paquete, ahí si empiezan a aplicar los modificadores de acceso de los miembros.

Miembros public
Los miembros marcados como public pueden ser accedidos desde cualquier otra clase a través de una instancia o por herencia.
Ejemplo:

package utilidades;
public class Sumas {
    public int sumar(int num1, int num2){
        return num1 + num2;
    }
}

package operaciones;
import utilidades.Sumas;
//nivel de acceso default
class AlgoRaro {
    public void realizarCalculosCientificos(){
        Sumas s = new Sumas();
        //acceso a través de una instancia

        int resultado = s.sumar(4,4);
        System.out.println("El resultado es: " + resultado);
    }
}

En este ejemplo la clase AlgoRaro puede acceder el método sumar() de la clase Sumas por que aunque están en diferentes paquetes la clase Sumas es pública al igual que el método sumar(), y el acceso se hace a través de una instancia de la clase. Lo contrario no se podría hacer, es decir, la clase Sumas no tiene acceso a ninguno de los métodos o atributos de la clase AlgoRaro por que están en diferente paquete y AlgoRaro tiene acceso por defecto, lo que descarta de una vez cualquier tipo de visibilidad.

Miembros private
Los miembros private solo pueden ser accedidos por la clase a la que pertenecen, de ninguna forma (claro, que las hay las hay: reflection) se pueden invocar desde clases externas.
Ejemplo (modificando el anterior):

package utilidades;
public class Sumas {
   
private int sumar(int num1, int num2){
        return num1 + num2;
    }

    void cualquierOtraCosa(){
       int valor =
sumar(1,2); //se puede
    }
}

package operaciones;
import utilidades.Sumas;
class AlgoRaro {
    public void realizarCalculosCientificos(){
        Sumas s = new Sumas();
       
int resultado = s.sumar(4,4); //error de compilación!!!
        System.out.println("El resultado es: " + resultado);
    }
}

En este caso, la clase AlgoRaro no puede acceder al método sumar() por que es privado, en cambio, el método cualquierOtraCosa() si puede invocarlo por que pertenece a la misma clase.

Miembros default
Los miembros con nivel de acceso default pueden ser accedidos solo por clases que pertenezcan al mismo paquete de la clase que los contiene:

package package1;
public class Valores {
    final double PI = 3.14159;
}

package package1;
public class Circunferencia {
    public double calcularArea(double radio){
        Valores v = new Valores();
        return v.PI * radio * radio;
    }
}

El atributo de instancia PI, puede ser accedido por la clase Circunferencia por que se encuentran en el mismo paquete, sin embargo:

package package2;
public class Circunferencia {
    public double calcularArea(double radio){
        Valores v = new Valores();
        return v.PI * radio * radio; //Error de compilación!!
    }
}

Arroja un error de compilación por que los paquetes son diferentes.

Miembros protected
El nivel de acceso protected es el más particular: una clase puede acceder a los miembros protected de otra si pertenece al mismo paquete o hereda de ella. En el primer caso accede a través de una instancia y el el segundo se invoca directamente. Es decir, el nivel de acceso protected es el mismo default + herencia.
Dada la clase:

package package2;
public class ClaseConMiembroProtegido {
    protected String demeAlgo(){
        return "Tome un 5";
    }
}

El método demeAlgo() se puede acceder a través de una instancia si la clase pertenece al mismo paquete:

package package2;
class AccesoPorPaquete{
    void accederAUnMiembro(){
        ClaseConMiembroProtegido cc = new ClaseConMiembroProtegido();
        System.out.println(cc.demeAlgo());
    }
}

O se puede invocar a través de la herencia, simplemente digitando el nombre del método, pertenezca o no al mismo paquete:

package package1;
import package2.ClaseConMiembroProtegido;
class AccesoPorHerencia extends ClaseConMiembroProtegido{
    void accederPorHerencia(){
        System.out.println("Accediendo por herencia: " + demeAlgo());
    }
}

Ojo!!, nos podemos llevar una sorpresa si en el segundo caso intentamos acceder el método demeAlgo() a través de una instancia:

package package1;
import package2.ClaseConMiembroProtegido;
class AccesoPorHerencia extends ClaseConMiembroProtegido{
    void accederPorHerencia(){
        ClaseConMiembroProtegido cc = new ClaseConMiembroProtegido();
        System.out.println("Accediendo por herencia: " + cc.demeAlgo());
        //error de compilación!!!

    }
}

Esto sucede por que la clase AccesoPorHerencia no pertenece al mismo paquete de ClaseConMiembroProtegido y solo puede acceder sus miembros a través de la herencia.

El Final
Esto es todo en cuando a modificadores de acceso para los miembros de las clases. Es uno de los temas que más claros hay que tener, pues en el examen hay muchas preguntas alrededor y la "flexibilidad" de todo esto, es un punto que juega en nuestra contra.

SCJP for JSE5 - 2

Posted on mayo 23, 2007 by Carlos Alexander Zuluaga

Recursos

Comparado con lo que se encuentra para la certificación de JSE 1.4, hay muy poco para la de JSE 5, por eso voy a ir guardando todos los recursos que me encuentre en la red (gratuitos y de pago) para quizá crear una página (puede ser en sprogramando) o algo por el estilo, pero de seguro los voy a ir publicando en el Weblog a medida que los encuentre. Igualmente voy a tener en cuenta los que ingresen en los comentarios.

El Examen

Para quien no tiene una certificación previa en el lenguaje el examen a presentar es "Sun Certfied Programmer for the Java 2 Platform, Standard Edition 5.0 (CX-310-055)". Este examen incluye todos los conceptos básicos del lenguaje, es decir, desde cero. Los objetivos y temas a evaluar están claros en la página oficial (el link anterior).

Como yo ya tengo la certificación de la versión 1.4, el examen que debo presentar es "Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 Upgrade Exam (CX-310-056)", que se enfoca en las nuevas características y cambios en el lenguaje con respecto a la versión anterior: generics, autoboxing, concurrency. Adicionalmente algunos de los objetivos del examen han cambiado y en este upgrade incluye también APIs que se evaluan a partir de esta versión: Serialization, *Reader, *Writer, *Stream, Regular Expressions, entre otras, el listado completo se puede ver en la página oficial.

El Libro

Al igual que para la certificación anterior, voy a seguir el libro "SCJP Sun Certified Programmer for Java 5 Study Guide" de Katherine Sierra y Bert Bates. Sin duda el libro es excelente:

  • Abarca todo el contenido del examen.
  • Es absolutamente didáctico, si lees la entrevista verás que Kathy y Bert han estudiado mucho sobre el funcionamiento del cerebro y saben de verdad como hacer para que aprendamos sobre cualquier tema.
  • Al final de cada capítulo hay una serie de preguntas que al menos en la serie anterior, y no creo que esto haya cambiado, son o eran muy similares a las del examen, de hecho creo que hubo preguntas iguales pero diferentes valores.
  • El hecho de que Kathy y Bert trabajen en la preparación de los exámenes de certificación deja claro que saben que se debe enseñar.

Los Recursos

Como apenas empiezo no hay mucho que publicar, pero seguro esto irá cambiando a medida que avance mi estudio y el Weblog. Aunque el examen de actualización incluye menos temas, voy a estudiar como si fuera a presentar el examen "normal" para repasar todos los temas, así que los recursos son de interés general.

Los siguientes links los obtuve de una entrada en el Weblog de Diego Campodónico:

El Final

Esto es todo por ahora, solo queda decir que alguna vez leí que el mejor indicador para saber si se está preparado para presentar en examen es sacar más o menos el 90% en la mayoría de los exámenes simulados. Así lo hice antes y esa es la intención ahora.