Resultados. Ejercicios Prácticos. Test 6. Conceptos avanzados

  Cuestión 1.

  Cuestión 2.


  Cuestión 3.

  Cuestión 4.

  • Solución: Sí, es correcto.

  Cuestión 5.

  • Solución: En un subdirectorio edu/uc3m/it/tsirda situado en algún lugar apuntado por por la variable de sistema CLASSPATH.
  • Feedback: La estructura física de los paquetes se caracteriza normalmente por los ficheros .class situados en un subdirectorio con el mismo nombre cualificado del mismo y que, en este caso, sería edu/uc3m/it/tsirda. Eso si, siempre TENIENDO EN CUENTA QUE ES UNA RUTA RELATIVA A LA QUE APUNTA LA VARIABLE CLASSPATH DEL SISTEMA (en este caso, habría que actualizar la variable CLASSPATH con la ruta del directorio raíz de las clases del paquete).

    NOTA:También pueden compactarse los directorios que contienen los ficheros .class de las clases para conseguir una mejor "encapsulación" del código y "optimización" de los recursos del sistema. Para ello, se pueden usar un fichero JAR (en este caso podría ser el fichero tsirda.jar) que comprimiría dicho subdirectorio de las clases edu/uc3m/it/tsirda. Lo que hay que tener presente en el caso de usar un fichero JAR como librería de clases es NO OLVIDARSE DE ACTUALIZAR LA VARIABLE CLASSPATH DEL SISTEMA CON DICHO FICHERO .JAR (en este caso, habría que actualizar la variable CLASSPATH con la ruta que apunta al fichero tsirda.jar) .

  Cuestión 6.

  • Solución: Hay que importar siempre todas las clases de un paquete para trabajar con alguna de ellas.
  • Feedback: La importación de paquetes en Java puede hacerse de dos formas:

    - Clase a clase, como en el siguiente ejemplo:

      import java.util.Vector;
      ...
      Vector notas= new Vector();
    

    - Todas las clases del paquete, como en el ejemplo siguiente:

      import java.util.*;
      ...
      Vector notas= new Vector();
    

    NOTA: Se suele recomendar la primera forma de realizar la importación de clases, es decir, clase a clase, ya que suele ser más eficiente a la hora de gestionar los recursos en tiempo de ejecución del programa.


  Cuestión 7.
  • Solución: No se puede usar niguna clase, la implementación de la librería no es correcta.
  • Feedback: A la hora de construir librerías o paquetes Java, hay que tener presente que en un fichero .java SOLO PUEDE EXISTIR UNA CLASE PÚBLICA (y cuyo nombre ha de conicidir exactamente con el nombre del fichero .java ) ya que es la única forma de poder encontrarla en la jerarquía de nombres cualificados de las clases que forman la librería o el paquete.

    Para solucionar esta cuestión, habría que crear dos ficheros, Punto.java y Linea.java que implementarían las respectivas clases de la libreria de gráficos. La anterior afirmación no implica que en un fichero .java puedan existir varias clases, sin embargo, las que no se declaren como públicas no serán visibles o accesibles desde el código de los programas.

  Cuestión 8.
  • Solución: Acceso de paquete.
  • Feedback: Ver los apuntes de la asignatura ( pag. 13 - Tema 9 )

  Cuestión 9.
  • Solución:
        Soy un atributo privado de la clase ClaseDelPaqueteAcceso: 1
        Soy un atributo de paquete de la clase ClaseDelPaqueteAcceso: 2
        Soy un atributo protegido de la clase ClaseDelPaqueteAcceso: 3
        Soy un atributo público de la clase ClaseDelPaqueteAcceso: 4
    
        Soy un método privado de la clase ClaseDelPaqueteAcceso.
        Soy un método de paquete de la clase ClaseDelPaqueteAcceso.
        Soy un método protegido de la clase ClaseDelPaqueteAcceso.
        Soy un método público de la clase ClaseDelPaqueteAcceso.
    
    
  • Feedback: Los objetos de una clase tienen acceso a todos sus atributos y sus métodos.

    RECUERDA: Los derechos de acceso a los miembros de una clase determinan QUÉ CLASES TIENEN ACCESO A DICHOS MIEMBROS Y NO QUé INSTANCIAS DE LAS MISMAS.

    Así, por ejemplo, un objeto de la clase ClaseDelPaqueteAcceso tendría acceso a los miembros privados de otro objeto de la misma clase. Por ejemplo, podríamos haber implementado un método de comparación de objetos de la clase ClaseDelPaqueteAcceso tal y como sigue:

    public boolean esIgualA( ClaseDelPaqueteAcceso otroObjeto ) {
         if (this.privado == otroObjeto.privado) {
              return true;
         } else {
              return false;
    }
    
    


  Cuestión 10
  • Solución: Al intentar compilar el código, se obtendrá una salida por pantalla parecida a esta:

    OtraClaseDePaqueteAcceso.java: metodoPrivado() has private access in acceso.ClaseDePaqueteAcceso
            a.metodoPrivado();
             ^
    OtraClaseDePaqueteAcceso.java: privado has private access in acceso.ClaseDePaqueteAcceso
    		  System.out.println("Soy el atributo privado de la ClaseDePaqueteAcceso: " + a.privado);
                                                                                                   ^
    2 errors
    

    Para ejecutar el código anterior hay que comentar las siguientes líneas de código:

    public class OtraClaseDelPaqueteAcceso {
    
        public static void main(String[] args) {
            ClaseDelPaqueteAcceso a = new ClaseDelPaqueteAcceso();
    
    // RECUERDA QUE LOS MODIFICADORES DE ACCESO SON A NIVEL DE CLASE, NO DE OBJETO        
    //System.out.println("Soy el atributo privado de la ClaseDePaqueteAcceso: " + a.privado);
    
            System.out.println("Soy el atributo de paquete de la ClaseDePaqueteAcceso: " + a.paquete);   
            System.out.println("Soy el atributo protegido de la ClaseDePaqueteAcceso: " + a.protegido);  
            System.out.println("Soy el atributo público de la ClaseDePaqueteAcceso: " + a.publico);  
    
    // RECUERDA QUE LOS MODIFICADORES DE ACCESO SON A NIVEL DE CLASE, NO DE OBJETO      
    //a.metodoPrivado();
            a.metodoDePaquete();
            a.metodoProtegido();
            a.metodoPublico();
    }
    }
      
    

    Y el resultado por pantalla sería:

    Soy el atributo de paquete de la ClaseDePaqueteAcceso: 2
    Soy el atributo protegido de la ClaseDePaqueteAcceso: 3
    Soy el atributo público de la ClaseDePaqueteAcceso: 4
    
    Soy un método de paquete de la clase ClaseDelPaqueteAcceso.
    Soy un método protegido de la clase ClaseDelPaqueteAcceso.
    Soy un método público de la clase ClaseDelPaqueteAcceso.
    
    
    
  • Feedback: En este ejemplo, se pone de manifiesto que los permisos de acceso se establecen a nivel de clase ya que, en este caso, estamos creando un objeto de otra clase, OtraClaseDelPaqueteAcceso, que intenta acceder a los miembros de un objeto de la clase ClaseDelPaqueteAcceso. Es entonces cuando se ejecutan los controles de acceso que se especifican en la declaración de los miembros ( atributos y/o métodos ) de la clase.