Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Tutorial para el Examen de certificacion:                 SCJP 1.2          Traducción del tutorial de Marcus Green.      ...
Tutorial para el examen de certificación: SCJP 1.2El presente documento es una traducción/adaptación del tutorial de Marcu...
javaHispano. Tu comunidad, tu lenguaje.Sección 1. Declaración y control de Acceso ......................7  Objetivo 1........
Tutorial para el examen de certificación: SCJP 1.2Sección 3. Recolector de basura –Garbage Collector- ............72  Obje...
javaHispano. Tu comunidad, tu lenguaje.     Primitivas como parámetros de métodos ...........................................
Tutorial para el examen de certificación: SCJP 1.2    Fijando componentes dentro de la cuadrícula............................
javaHispano. Tu comunidad, tu lenguaje.Sección 1. Declaración y control de AccesoObjetivo 1.Escribir código que declare, c...
Tutorial para el examen de certificación: SCJP 1.2Creación y Declaración Simultanea.Lo anterior puede ser compactado en un...
javaHispano. Tu comunidad, tu lenguaje.Los arreglos conocen su tamaño.Solo en caso de que te hayas saltado la comparación ...
Tutorial para el examen de certificación: SCJP 1.2Combinar declaración con inicialización.En vez de ciclarse a través de u...
javaHispano. Tu comunidad, tu lenguaje.     }     public void Claines(){     String[] names= newString[]{"Peter","John","B...
Tutorial para el examen de certificación: SCJP 1.2Preguntas.Pregunta 1)¿Cómo puedes redimensionar un arreglo con una decla...
javaHispano. Tu comunidad, tu lenguaje.Quieres encontrar una manera más elegante para llenar un arreglo que a través de un...
Tutorial para el examen de certificación: SCJP 1.2                                   Otras Fuentes de este tema:Este tema ...
javaHispano. Tu comunidad, tu lenguaje.Objetivo 2.Declarar clases, clases internas, métodos, variables de instancia estáti...
Tutorial para el examen de certificación: SCJP 1.2La clase más sencilla.Los requerimientos mínimos para definir una clase ...
javaHispano. Tu comunidad, tu lenguaje.Dando a un método la siguiente forma, esté obtiene cierta significancia (o magia) c...
Tutorial para el examen de certificación: SCJP 1.2Este código crea una nueva instancia de si mismo en la línea:           ...
javaHispano. Tu comunidad, tu lenguaje.Así en HelloWorld2 el método amethod se llamo así:                      HelloWorld ...
Tutorial para el examen de certificación: SCJP 1.2Modificadores y Encapsulamiento.                   Los modificadores de ...
javaHispano. Tu comunidad, tu lenguaje.PublicEl modificador public puede aplicarse a una variable (campo) o una clase. Esp...
Tutorial para el examen de certificación: SCJP 1.2Se dice que una variable definida sin modificador de acceso tiene visibi...
javaHispano. Tu comunidad, tu lenguaje.             //cuantas instancias de la clase se creen.             //Este código m...
Tutorial para el examen de certificación: SCJP 1.2nativos para propósitos específicos de la plataforma como acceder a algú...
javaHispano. Tu comunidad, tu lenguaje.}FinalEl modificador final indica que un método no puede ser heredado. Otra manera ...
Tutorial para el examen de certificación: SCJP 1.2Acepta que es parte del lenguaje y entonces mejor preocúpate por otras c...
javaHispano. Tu comunidad, tu lenguaje.Crea una clase publica llamada Malvern. Crea una clase interna y privada llamadaGre...
Tutorial para el examen de certificación: SCJP 1.2Preguntas.Pregunta 1)¿Qué pasará cuando intentes compilar y ejecutar est...
javaHispano. Tu comunidad, tu lenguaje.   1) El compilador indicara que main es una palabra reservada y no puede ser usada...
Tutorial para el examen de certificación: SCJP 1.2Pregunta 5)¿Para que defines un método como nativo?   1) Para conseguir ...
javaHispano. Tu comunidad, tu lenguaje.   2) Error en la compilación: método nativo debe retornar algún valor.   3) Compil...
Tutorial para el examen de certificación: SCJP 1.2Pregunta 10)¿Cuáles de las declaraciones siguientes son legales?       1...
javaHispano. Tu comunidad, tu lenguaje.^1 errorRespuesta 5)1) Para conseguir acceder a hardware desconocido por Java3) Par...
Tutorial para el examen de certificación: SCJP 1.2La opción 4 no es legal porque el tipo de datos debe aparecer después de...
javaHispano. Tu comunidad, tu lenguaje.Objetivo 3.Para una clase dada, determinar si se debe crear un constructor predefin...
Tutorial para el examen de certificación: SCJP 1.2                  Si creas tus propios constructores, Java ya no te prop...
javaHispano. Tu comunidad, tu lenguaje.El prototipo del constructor predefinidoEl objetivo te pide que estes consciente de...
Tutorial para el examen de certificación: SCJP 1.2}Solución sugerida para el ejercicio 2.public class Salwarpe {     publi...
javaHispano. Tu comunidad, tu lenguaje.PreguntasPregunta 1)Dada la siguiente definición de clase:class Base{        Base(i...
Tutorial para el examen de certificación: SCJP 1.2public class Crowle{     public static void main(String argv[]){     Cro...
javaHispano. Tu comunidad, tu lenguaje.4)El constructor predefinido no se crea si la clase contiene algún constructor prop...
Tutorial para el examen de certificación: SCJP 1.2                             Otras Fuentes de este tema:Esta tema es cub...
javaHispano. Tu comunidad, tu lenguaje.Objetivo 4Establecer los tipos de datos validos de retorno para cualquier método, d...
Tutorial para el examen de certificación: SCJP 1.2}                     El tipo de dato de retorno no contribuye a realiza...
javaHispano. Tu comunidad, tu lenguaje.       }       public void amethod(int i){}       //Here}¿Cuáles de las líneas sigu...
Tutorial para el examen de certificación: SCJP 1.22) public int amethod(int i, int j) {return 99;}3) protected void ametho...
javaHispano. Tu comunidad, tu lenguaje.Sección 2. Control de Flujo y Manejo de Excepciones.Objetivo 1.Escribir código que ...
Tutorial para el examen de certificación: SCJP 1.2boolean k=true;if(k)      System.out.println("do something");Esto a vece...
javaHispano. Tu comunidad, tu lenguaje.           La cláusula default no necesita ir al final de una sentencia case.El lug...
Tutorial para el examen de certificación: SCJP 1.2Algunos programadores dicen que el operador ternario es útil. Yo no cons...
javaHispano. Tu comunidad, tu lenguaje.     if(b=false){         System.out.println("The value of b is"+b);         }     ...
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Tutorial SCJP 1.2
Upcoming SlideShare
Loading in …5
×

Tutorial SCJP 1.2

853 views

Published on

Published in: Education
  • Be the first to like this

Tutorial SCJP 1.2

  1. 1. Tutorial para el Examen de certificacion: SCJP 1.2 Traducción del tutorial de Marcus Green. RuGI Isaac Ruiz Guerra rugi@javahispano.org javaHispano Tu lenguaje, tu comunidad. Versión Julio del 2003.
  2. 2. Tutorial para el examen de certificación: SCJP 1.2El presente documento es una traducción/adaptación del tutorial de Marcus Greencorrespondiente a la versión de diciembre del 2002. Dicho tutorial cubre los objetivoscorrespondientes al examen SCJP 1.2.La mayor parte de este documento cubre tambien los objetivos para la versión 1.4únicamente se deben pasar por alto las secciones 8 y 11, y agregar el tema de Aserciones.Esta traducción se realizó con la colaboración de:Nombre: Sección:Isaac Ruiz Guerra 1, 2, 3, 4, 6, 8, 9, 10Joslyn Flores Romero 7Francisco Fernández Miser 5Alberto Molpeceres 11Puedes hacer cualquier comentario sobre la traducción a rugi@javahispano.orgLa dirección del tutorial de Marcus Green:http://www.jchq.net/certkey/index.htmUn artículo de Emili Miedes de Elías sobre Aserciones:http://www.javahispano.org/articles.article.action?id=57Este documento forma parte del proyecto “Examen de Certificación”:http://www.javahispano.org/text.viewer.action?file=proyectosCopyright (c) 2003,Isaac Ruiz Guerra. Este documento puede ser distribuido solo bajolos términos y condiciones de la licencia de Documentación de javaHispano v1.0 oposterior (la última versión se encuentra en http://www.javahispano.org/licencias/). 2
  3. 3. javaHispano. Tu comunidad, tu lenguaje.Sección 1. Declaración y control de Acceso ......................7 Objetivo 1........................................................................................................................ 7 Arreglos................................................................................................................... 7 Declaración sin asignación. ........................................................................................ 7 Creación y Declaración Simultanea............................................................................ 8 Arreglos Java VS Arreglos C/C++ . .................................................................... 8 Los arreglos conocen su tamaño. ........................................................................... 9 Arreglos Java VS Arreglos VB............................................................................ 9 Combinar declaración con inicialización.................................................................. 10 Objetivo 2...................................................................................................................... 15 Comparando las clases de C++/VB con las de Java. ................................................ 15 El rol de las clases en Java........................................................................................ 15 La clase más sencilla................................................................................................. 16 Creando una clase sencilla- HelloWorld................................................................... 16 La magia del nombre main ....................................................................................... 16 Creando una instancia de una Clase.......................................................................... 17 Creando Métodos. ..................................................................................................... 18 Variables Automáticas .............................................................................................. 19 Modificadores y Encapsulamiento............................................................................ 20 Usando modificadores en combinación .................................................................... 26 Objetivo 3...................................................................................................................... 35 Nota de este objetivo................................................................................................. 35 ¿Qué es un constructor? ............................................................................................ 35 ¿Cuándo proporciona Java el constructor predefinido?............................................ 35 El prototipo del constructor predefinido ................................................................... 37 Objetivo 4...................................................................................................................... 43 Nota de este objetivo................................................................................................. 43 Métodos en la misma clase ....................................................................................... 43 Métodos en una subclase. ......................................................................................... 44Sección 2. Control de Flujo y Manejo de Excepciones. ...........47 Objetivo 1...................................................................................................................... 47 La sentencia if/else.................................................................................................... 47 La Sentencia switch................................................................................................... 48 Argumentos validos para las sentencias if y switch. ................................................. 49 El operador ternario ?................................................................................................ 49 Objetivo 2...................................................................................................................... 55 La sentencia for......................................................................................................... 55 Los ciclos while y do, nada inesperado................................................................. 56 La sentencia goto, ¿ciencia o religión? ..................................................................... 57 Break y Continue ...................................................................................................... 57 Saltar a una Etiqueta. ................................................................................................ 58 Objetivo 3...................................................................................................................... 64 Comparando con Visual Basic y C/C++................................................................... 64 La Cláusula finally .................................................................................................... 65 Sobrescribiendo métodos que lanzan excepciones ................................................... 66 3
  4. 4. Tutorial para el examen de certificación: SCJP 1.2Sección 3. Recolector de basura –Garbage Collector- ............72 Objetivo 1...................................................................................................................... 72 ¿Por qué querrías utilizar el recolector de basura? ................................................... 72 Java y el recolector de basura. .................................................................................. 72Sección 4. Fundamentos del lenguaje. ...........................76 Objetivo 1...................................................................................................................... 76 Nota sobre este objetivo............................................................................................ 76 La sentencia package ................................................................................................ 76 La sentencia import ............................................................................................... 77 Clases y la declaración de clases internas................................................................. 77 Clases internas declaradas dentro de métodos .......................................................... 79 Visibilidad de campos para clases definidas dentro de un método........................... 80 Creando una interface ............................................................................................... 81 Objetivo 2...................................................................................................................... 85 Objetivo 3...................................................................................................................... 87 Objetivo 4...................................................................................................................... 90 Variables ................................................................................................................... 90 Arreglos..................................................................................................................... 91 Objetivo 5...................................................................................................................... 95 Tamaño de los tipos primitivos enteros .................................................................... 95 Declarando literales enteros...................................................................................... 95 Tamaño de los tipos primitivos de coma flotante ..................................................... 96 Indicando tipos de datos con un literal sufijo ........................................................... 97 Los tipos boolean y char........................................................................................... 97 Declarando literales String ................................................................................... 99Sección 5. Operadores y Asignaciones ..........................102 Objetivo 1.................................................................................................................... 102 El operador instanceof ....................................................................................... 102 El operador + .......................................................................................................... 103 Asignando variables primitivas de tipos diferentes ................................................ 104 Asignando referencias de objetos de diferentes tipos. ............................................ 105 Operadores de desplazamiento de bits.................................................................... 106 Operadores de desplazamiento con signo << y >> ................................................. 107 Desplazamiento sin signo a la derecha >>>............................................................ 108 Applet BitShift ........................................................................................................ 108 Objetivo 2.................................................................................................................... 113 Diferencia entre el método equals y el operador = = .............................................. 113 Usando el método equals con Strings ..................................................................... 113 Usando el método equals con la Clase Boolean ..................................................... 114 Usando el método equals con objetos..................................................................... 115 Objetivo 3.................................................................................................................... 119 El efecto corto circuito con los operadores lógicos. ............................................... 119 Operadores a nivel de bits....................................................................................... 120 Pensando en binario ................................................................................................ 120 Objetivo 4.................................................................................................................... 124 Nota sobre este objetivo.......................................................................................... 124 Referencias de Objetos como parámetros de métodos. .......................................... 124 4
  5. 5. javaHispano. Tu comunidad, tu lenguaje. Primitivas como parámetros de métodos ................................................................ 125Sección 6. Sobrecarga, sobreescritura, tipos en tiempo deejecución y orientación a objetos .............................128 Objetivo 1) .................................................................................................................. 128 Relaciones “es un” y “tiene un”.............................................................................. 128 Encapsulamiento ..................................................................................................... 128 Tipos en Tiempo de ejecución ................................................................................ 130 Objetivo 2) .................................................................................................................. 135 Comentario sobre el objetivo .................................................................................. 135 Sobrecarga de métodos ........................................................................................... 135 Sobrescritura de métodos....................................................................................... 136 Invocando constructores de clases base.................................................................. 137 Invocando constructores con this() ..................................................................... 138 El constructor y la jerarquía de clases..................................................................... 139 Objetivo 3) .................................................................................................................. 146 Nota sobre este objetivo.......................................................................................... 146 Instanciando una clase ............................................................................................ 146 Clases internas ........................................................................................................ 146 Clases Anidadas de nivel Superior (Top Level) ..................................................... 147 Clases Miembro ...................................................................................................... 147 Clases creadas dentro de métodos........................................................................... 148 Clases anónimas...................................................................................................... 148Sección 7. Threads ............................................152 Objetivo 1) .................................................................................................................. 152 ¿Qué es un Thread ?................................................................................................ 152 Las dos formas de crear un Hilo (Thread) .............................................................. 152 Instanciando e Iniciando un hilo. ............................................................................ 153 Objetivo 2) .................................................................................................................. 157 Comentario de este objetivo.................................................................................... 157 Razones por las que un thread puede ser bloqueado............................................... 157 Objetivo 3) .................................................................................................................. 161 ¿Por qué necesitarías el protocolo wait/notify? ...................................................... 161 synchronized ........................................................................................................... 161 wait/notify ............................................................................................................... 162Sección 8. El paquete java.awt y su disposición ...............167 Objetivo 1.................................................................................................................... 167 Nota sobre este objetivo.......................................................................................... 167 Comparando la disposición de componentes de Java y Visual Basic..................... 167 La filosofía de los administradores de disposición ................................................. 167 Administradores de disposición que debes conocer para el examen. ..................... 169 Responsabilidades de los Administradores de Disposición VS los Contenedores . 169 Curiosidades del administrador BorderLayout ....................................................... 170 El administrador de disposición GridLayout .......................................................... 171 GridBagLayout ....................................................................................................... 172 Usando gridx y gridy para sugerir la posición de un componente.......................... 175 ipadx y ipady para controlar el relleno interior de los componentes ...................... 176 Componentes dentro de un panel utilizando GridBagLayout................................. 178 5
  6. 6. Tutorial para el examen de certificación: SCJP 1.2 Fijando componentes dentro de la cuadrícula......................................................... 180 Elementos GridBag no cubiertos por este ejercicio............................................... 182 Objetivo 2.................................................................................................................... 189 El modelo oyente -Listener- de eventos.................................................................. 189 El modelo de eventos del JDK 1.1.......................................................................... 189Sección 9. El paquete java.lang.Math ..........................196 Objetivo 1.................................................................................................................... 196 Nota sobre este objetivo.......................................................................................... 196 abs ........................................................................................................................... 196 ceil........................................................................................................................... 196 floor......................................................................................................................... 197 max y min ............................................................................................................... 197 random .................................................................................................................... 198 round ....................................................................................................................... 198 sin cos tan................................................................................................................ 199 sqrt........................................................................................................................... 199 Resumen.................................................................................................................. 199 Objetivo 2.................................................................................................................... 203 Nota sobre este objetivo.......................................................................................... 203Sección 10. El paquete java.util ..............................206 Objetivo 1.................................................................................................................... 206 Nota sobre este objetivo.......................................................................................... 206 Las colecciones antiguas......................................................................................... 206 Las nuevas colecciones ........................................................................................... 206 Set ........................................................................................................................... 207 List .......................................................................................................................... 207 Map ......................................................................................................................... 207 Usando Vectores ..................................................................................................... 208 Usando Hashtables.................................................................................................. 209 BitSet....................................................................................................................... 209Sección 11. El paquete java.io ................................214 Objetivo 1.................................................................................................................... 214 Objetivo 2.................................................................................................................... 222 Objetivo 3.................................................................................................................... 228 Objetivo 4.................................................................................................................... 229 FileInputStream and OutputStream ........................................................................ 229 BufferedInputStream y BufferedOutputStream...................................................... 230 DataInputStream y DataOutputStream ................................................................... 230 La clase File......................................................................................................... 231 RandomAccesFile ................................................................................................... 231 Objetivo 5.................................................................................................................... 235 FileInputStream and FileOutputStream .................................................................. 235 RandomAccessFile ................................................................................................. 236 6
  7. 7. javaHispano. Tu comunidad, tu lenguaje.Sección 1. Declaración y control de AccesoObjetivo 1.Escribir código que declare, construya e inicie arreglos de cualquier tipo base, usandocualquiera de las formas permitidas, para declaración y para inicialización.Arreglos.Los arreglos en Java son similares en sintaxis a los arreglos en otros lenguajescomo C/C++ y Visual Basic. Sin embargo, Java elimina la característica de C/C++mediante la cual puedes pasar los corchetes ([]) accediendo a los elementos y obteniendosus valores utilizado punteros. Esta capacidad en C/C++, aunque poderosa, propicia laescritura de software defectuoso. Debido a que Java no soporta esta manipulación directade punteros, se remueve esta fuente de errores.Un arreglo es un tipo de objeto que contiene valores llamados elementos. Esto te da unconveniente contenedor de almacenamiento para un grupo de valores que puedenmodificarse durante el programa, y permite que accedas y cambies los valores según lonecesites. A diferencia de las variables que son accedidas por un nombre, los elementosde un arreglo son accedidos por números comenzando por cero. De esta manera puedes“avanzar” a través del arreglo, accediendo a cada elemento en turno.Todos los elementos de un arreglo deben ser del mimo tipo. El tipo de elementos de unarreglo, se decide cuando se declara el arreglo.Si lo que necesitas es una manera para almacenar un grupo de elementos de tiposdiferentes, puedes usar las clases de colecciones, estas son una nueva característicaen Java 2 y son discutidas en la sección 10.Declaración sin asignación.La declaración de un arreglo no asigna almacenamiento alguno, ésta solo anuncia laintención de crear un arreglo. Una diferencia significativa con la manera en que C/C++declara un arreglo es que el tamaño no se especifica con el identificador. Por lo tanto losiguiente causara un error durante la compilaciónint num[5];El tamaño de un arreglo se da cuando este se crea realmente con el operador new:int num[];num = new int[5]; 7
  8. 8. Tutorial para el examen de certificación: SCJP 1.2Creación y Declaración Simultanea.Lo anterior puede ser compactado en una sola línea así:int num[] = new int[5];Además los corchetes pueden ser también colocados después del tipo de dato o despuésdel nombre del arreglo. Por lo tanto son legales las siguientes declaraciones:int[] num;int num[];Puedes leer esto de la siguiente manera: • Un arreglo de enteros llamado num • Un arreglo llamado num de tipo entero.Arreglos Java VS Arreglos C/C++ . Una gran diferencia entre java y C/C++ es que en java se conocen de que tamaño son los arreglos, y el lenguaje proporciona protección para no sobrepasar los limites del arreglo.Este comentario es particularmente útil si vienes de un ambiente de programación comoVisual Basic donde no es muy común iniciar el conteo de un arreglo desde 0. Tambiénayuda a evitar uno de los mas insidiosos errores de C/C++.Por lo tanto, lo siguiente causará el siguiente error en tiempo de ejecución:ArrayIndexOutOfBoundExceptionint[] num = new int [5];for (int i = 0;i<6;i++){ num[i] = i*2;}Para recorrer un arreglo, la manera mas común es a través del campo length de losarreglos, así:int [] num = new int[5];for(int i = 0;i<num.length;i++){ num[i]=i*2;} 8
  9. 9. javaHispano. Tu comunidad, tu lenguaje.Los arreglos conocen su tamaño.Solo en caso de que te hayas saltado la comparación con C/C++ -hecha anteriormente-los arreglos en Java siempre conocen cual es su tamaño, y este se representa en elcampo length. Así, puedes llenar dinámicamente un arreglo con el código siguiente:int myarray[] = new int [10];for(int j=0; j<myarray.length; j++){ myarray[j]=j;}Nota que los arreglos tienen el campo length y no el método length(). Cuandocomiences a utilizar Strings usaras el método length, de la siguiente manera:s.length();En un arreglo length es un campo (o propiedad) no un método.Arreglos Java VS Arreglos VBLos arreglos en Java siempre comienzan desde cero. Los arreglos en VB puedencomenzar desde 1 si se usa la declaración Option base. En Java no hay equivalente parael comando redim preserve a través del cual puedes cambiar el tamaño de un arreglosin borrar su contenido. Pero por supuesto puedes crear un nuevo arreglo con unnuevo tamaño y copiar los elementos actuales a ese arreglo y obtener el mismoresultado.La declaración de un arreglo puede tener múltiples conjuntos de corchetes (“[]”). Javaformalmente no soporta los arreglos multidimensionales; sin embargo si soportaarreglos de arreglos; también conocidos como arreglos anidados.Una diferencia importante entre los arreglos multidimensionales, como en C/C++ y losarreglos anidados, es que cada arreglo no tiene que ser del mismo tamaño. Si vemosun arreglo como una matriz, la matriz no tiene que ser una matriz rectángulo .De acuerdo con la Especificación del Lenguaje Java:(http://java.sun.com/docs/books/jls/html/10.doc.html#27805)“El número de corchetes indica la profundidad de un arreglo anidado”En otros lenguajes esto se conoce como la dimensión de un arreglo. Así podríasalmacenar las coordenadas de un mapa con un arreglo de 2 dimensiones:int [][];la 1ª dimensión podría ser la coordenada X y la segunda la coordenada Y. NT.: En otras palabras; cada arreglo puede tener un tamaño distinto. 9
  10. 10. Tutorial para el examen de certificación: SCJP 1.2Combinar declaración con inicialización.En vez de ciclarse a través de un arreglo para llevar a cabo la inicialización, unarreglo puede ser creado e inicializado a la vez en una sola declaración.Esto es particularmente recomendable para arreglos pequeños. La siguiente líneacreara un arreglo de enteros y lo llenara con los números 0 hasta el 4.int k[] = new int[] {0,1,2,3,4};Observa que en ninguna parte necesitas especificar el número de elementos en elarreglo. Puedes analizar esto, preguntándote si el siguiente código es correcto:Int k = new int[5]{0,1,2,3,4}; //¡¡¡ error, no compilara !!!Puedes crear y llenar arreglos simultáneamente con cualquier tipo de dato, por lo tantopuedes crear un arreglo de cadenas, de la siguiente manera:String s[] = new String [] {“Zero”,”One”,”Two”,”Three”,”Four”};Los elementos de un arreglo pueden ser direccionados como lo harías en C/C++:String s[] = new String [] {“Zero”,”One”,”Two”,”Three”,”Four”};System.out.println(s[0]);Esto mostrará la cadena Zero.Ejercicio 1)Crea una clase con un método que simultáneamente cree e inicialize un arreglo decadenas. Inicializa el arreglo con cuatro nombres, después muestra el primer nombrecontenido en el arreglo.Ejercicio 2)Crea una clase que cree un arreglo de cadenas de 5 elementos llamado Fruit en elnivel de clase, pero no lo inicializes con cualquier valor. Crea un método llamadoamethod. En amethod inicializa los primeros cuatro elementos con nombres de frutas.Crea otro método llamado modify y cambia el contenido del primer elemento delarreglo Fruit para que contenga la cadena “bicycle”. Dentro del método modifycrea un ciclo for que imprima todos los elementos del arreglo.Solución sugerida para el ejercicio 1.public class Bevere{public static void main(String argv[]){ Bevere b = new Bevere(); b.Claines(); 10
  11. 11. javaHispano. Tu comunidad, tu lenguaje. } public void Claines(){ String[] names= newString[]{"Peter","John","Balhar","Raj"}; System.out.println(names[0]); }}Nota: La sintaxis para la creación e inicialización simultanea no es evidente y vale lapena practicarla. Se preguntó por el primer nombre del arreglo para asegurar que noutilizarás names[1].Solución Sugerida para el ejercicio 2.public class Barbourne{String Fruit[]= new String[5];public static void main(String argv[]){ Barbourne b = new Barbourne(); b.amethod(); b.modify(); } public void amethod(){ Fruit[0]="Apple"; Fruit[1]="Orange"; Fruit[2]="Bannana"; Fruit[3]="Mango"; } public void modify(){ Fruit[0]="Bicycle"; for(int i=0; i< Fruit.length; i++){ System.out.println(Fruit[i]); } }}Nota: Cuando el ciclo ejecute la salida de elemento final este será null. 11
  12. 12. Tutorial para el examen de certificación: SCJP 1.2Preguntas.Pregunta 1)¿Cómo puedes redimensionar un arreglo con una declaración sencilla manteniendo elcontenido original?Pregunta 2)Quieres averiguar el valor del último elemento de un arreglo. Escribiendo el siguienteCódigo.¿Qué pasara cuando lo compiles y ejecutes?public class MyAr{public static void main(String argv[]){ int[] i = new int[5]; System.out.println(i[5]); }}Pregunta 3)Quieres hacer un ciclo a través de un arreglo y detenerte cuando llegues al ultimoelemento. Siendo un buen programador en Java, y olvidando lo que alguna vez conocistesobre C/C++, sabes que los arreglos contienen información acerca de su tamaño.¿Cuál de las siguientes sentencias puedes usar?1)myarray.length();2)myarray.length;3)myarray.size4)myarray.size();Pregunta 4)Tu jefe esta complacido por que escribiste el programa Hello World y te ha dado unaumento. Ahora te encomienda que crees un juego como el TicTacToe(o puntos y crucescomo lo conocí en mi adolescencia). Decides que para eso necesitas un arreglomultidimensional. ¿Cuál de las siguientes líneas realizan el trabajo?1) int i=new int[3][3];2) int[] i=new int[3][3];3) int[][] i=new int[3][3];4) int i[3][3]=new int[][];Pregunta 5) 12
  13. 13. javaHispano. Tu comunidad, tu lenguaje.Quieres encontrar una manera más elegante para llenar un arreglo que a través de unciclo con la sentencia for. ¿Cuál de las siguientes líneas usarías?1)myArray{ [1]="One"; [2]="Two"; [3]="Three"; end with 2)String s[5]=new String[]{"Zero","One","Two","Three","Four"}; 3)String s[]=new String[] {"Zero","One","Two","Three","Four"}; 4)String s[]=new String[]={"Zero","One","Two","Three","Four"};RespuestasRespuesta 1)No puedes redimensionar un arreglo. Necesitas crear un nuevo arreglo temporal conun tamaño diferente y llenarlo con el contenido del arreglo original. Java Proporcionacontenedores redimencionables con clases como Vector o uno de los miembros de laclase collection .Respuesta 2)Intentar avanzar mas allá del final del arreglo genera un error en tiempo de ejecución.Debido a que los arreglos son indexados desde 0, el elemento final será i[4] y noi[5].Respuesta 3)2) myarray.length;Respuesta 4)3) int[][] = new int[3][3];Respuesta 5)3) String s[] = new String[]{“Zero,”One”,”Two”,”Three”,”Four”}; 13
  14. 14. Tutorial para el examen de certificación: SCJP 1.2 Otras Fuentes de este tema:Este tema es cubierto en el Tutorial de Sun en: http://java.sun.com/docs/books/tutorial/java/data/arraysAndStrings.htmlRichard Baldwin trata este tema en:http://www.Geocities.com/Athens/Acropolis/3797/Java028.htmJyothi Krishnan en:http://www.geocities.com/SiliconValley/Network/3693/obj_sec1.html#obj1Bruce Eckel Thinking In JavaCapítulo 8 14
  15. 15. javaHispano. Tu comunidad, tu lenguaje.Objetivo 2.Declarar clases, clases internas, métodos, variables de instancia estáticas, variables yvariables automáticas(métodos locales), haciendo un uso apropiado de todos losmodificadores permitidos (como son: public, final, static, abstract, ydemás). Conocer importancia de cada uno de estos modificadores ya sea solos o encombinaciónComentario sobre este objetivoEncuentro un poco molesto que en el objetivo se use la frase “y demás”.Supongo que esto significa que debes estar consciente de los modificadores: native transient synchronized volatileComparando las clases de C++/VB con las de Java.Debido a que Java fue diseñado para facilitar que programadores C++ lo aprendieran,este tiene muchas similitudes en la manera en que ambos lenguajes trabajan con lasclases. Ambos lenguajes tienen herencia, polimorfismo, y ocultamiento de datos usandomodificadores de visibilidad. Algunas de sus diferencias fueron hechas para hacer deJava un lenguaje más fácil de aprender y usar.El lenguaje C++ implementa la herencia múltiple y así una clase puede tener más de unpadre (o clase base) Java únicamente permite la herencia simple, es decir, las clasespueden tener únicamente un padre. Para sobreponer esta limitación, Java tiene unacaracterística llamada: Interfaces, a la cual los diseñadores del lenguaje le decidieron daralgunas de las ventajas de la herencia múltiple, pero sin las desventajas. Todas las clasesen Java son descendientes de una gran clase antecesora llamada Object.El rol de las clases en JavaLas clases son el corazón de Java, todo el código en Java ocurre dentro de una clase. Nohay un concepto de código llano y de posición libre. Hasta la más sencilla aplicaciónHelloWorld involucra la creación de una clase. Para indicar que una clase desciende deotra clase se usa la palabra clave extends. Si no se usa extends, la clase descenderáde la clase Object lo cual proporciona a la clase creada, algunas funciones básicasincluyendo la habilidad para mostrar su nombre y algunas de las capacidades requeridasen los Threads. 15
  16. 16. Tutorial para el examen de certificación: SCJP 1.2La clase más sencilla.Los requerimientos mínimos para definir una clase son: la palabra clave class, elnombre de la clase y las llaves de apertura y cerradura. Entonces:class classname {}es una definición sintacticamente correcta para una clase, pero no es una claseparticularmente útil (sorprendentemente, me he encontrado definiendo clases como esta,cuando creo ejemplos para ilustrar la herencia)Normalmente una clase también incluirá un especificador de acceso antes de la palabraclave class y por supuesto, el cuerpo de la clase entre las llaves. Así, lo siguiente es unaplantilla mas sensata para definir una clase: public class classmane{ // el cuerpo de la clase va acá }Creando una clase sencilla- HelloWorldEste es un sencillo programa HelloWorld que mostrar: la cadena “hello world” en lapantalla.public class HelloWorld{public static void main(String argv[]){ System.out.println("hello world"); }}//Fin de la Definición de la claseLa palabra clave public es un modificador de visibilidad que indica que la clase deberáser visible para cualquier otra clase. Solo una clase por archivo puede ser declaradapublica. Si declaras mas de una clase en un archivo como publica, ocurrirá un error entiempo de ejecución. Observa que Java es sensible a mayúsculas en todos los aspectos. Elarchivo que contenga esta clase deberá llamarse HelloWorld.java La palabra clave class indica que una clase comienza a ser definida y HelloWorld esel nombre de la clase. Observa que la llave de cierre que finaliza la definición de la claseno involucra un punto y coma de cerradura. El comentario://Fin de la Definición de la claseUsa el estilo de comentario de una sola línea que esta disponible en C/C++. Java tambiéncomprende los comentarios multilíneas de la forma /* */.La magia del nombre main 16
  17. 17. javaHispano. Tu comunidad, tu lenguaje.Dando a un método la siguiente forma, esté obtiene cierta significancia (o magia) cuandoindica a Java que es aquí en donde el programa debe empezar a ejecutarse. (similar almain del lenguaje C).public static void main(String argv[]){Esta línea indica que esta definiéndose un método llamado main, y que toma comoparámetros (o argumentos) a un arreglo de cadenas. Este método es publico, es decir esvisible desde cualquier parte de la clase. La palabra clave static indica que este métodopuede ejecutarse sin crear una instancia de la clase. Si eso no significa nada para ti, no tepreocupes, en su momento se cubrirán con detalle los métodos estáticos (static) en otraparte de este tutorial. La palabra clave void indica el tipo de dato retornado por elmétodo cuando se llama. Usar void indica que ningún valor será retornado.El parámetro del método main:String argv[]Indica que el método toma un arreglo de tipo String. Los corchetes indican –como yavimos- un arreglo. Observa que el tipo de dato String comienza con una “S”mayúscula. Esto es importante ya que Java es totalmente sensible a las mayúsculas. Sinestas exactitudes, la Maquina virtual de Java (JVM) no reconocerá el método como ellugar en donde se debe comenzar la ejecución del programa.Creando una instancia de una ClaseLa aplicación HelloWorld, como describí anteriormente, es útil para ilustrar la mássencilla de las aplicaciones que puedes crear. Pero le falta mostrar uno de los elementosmás cruciales al usar las clases, la palabra clave new.La cual indica la creación de una nueva instancia de la clase. En la aplicaciónHelloWorld esto no era necesario ya que el único método que se llamó eraSystem.out.println que es un método estático y no requiere la creación de una clase queutilice la palabra new. Los métodos estáticos pueden acceder solo a variables estáticas, delas que sólo puede existir una instancia por la clase. La aplicación de HelloWorld puedemodificarse ligeramente para ilustrar la creación de una nueva instancia de una clase.public class HelloWorld2{ public static void main(String argv[]){ HelloWorld2 hw = new HelloWorld2(); hw.amethod(); } public void amethod(){ System.out.println("Hello world"); }} 17
  18. 18. Tutorial para el examen de certificación: SCJP 1.2Este código crea una nueva instancia de si mismo en la línea: HelloWorld2 hw = new HelloWorld2();Esta sintaxis para crear una nueva instancia de una clase es básica para el uso de clases.Observa cómo el nombre de la clase aparece dos veces. La primera vez indica el tipo dedato de la referencia a la clase. Esta necesidad no es la misma que el tipo actual de laclase puesto que ésta se indica después de usar la palabra clave new. El nombre de estainstancia de la clase es hw. Éste simplemente es un nombre escogido para una variable.Este es un nombramiento convencional (es decir, utilizando la convención para escriturade código Java)ya que una instancia de una clase empieza con una letra minúscula,considerando que la definición de una clase empieza con una letra mayúscula.El paréntesis vacío para el nombre de la clase HelloWorld() indica que la clase estácreándose sin algún parámetro en su constructor. Si estuvieras creando una instancia deuna clase que se inicializa con un valor o un arreglo como la clase Label o Button elparéntesis contendría uno o mas valores de inicialización.Creando Métodos.Como ilustro en el último ejemplo HelloWorld2, un método en Java es similar a unafunción en C/C++ y a una función o sub función en Visual Basic. El método llamadoamethod en este ejemplo se declara como:publicque indica que puede accederse desde cualquier parte. Retorna el tipo:voidIndicando que ningún valor será retornado. Y los paréntesis vacíos indican que no tomaparámetros.El mismo método se podría haber definido de estas maneras alternativas:private void amethod(String s)private void amethod(int i, String s)protected void amethod(int i)Estos ejemplos ilustran algunas otras firmas típicas de declaración de métodos. El uso delas palabras clave private y protected se cubrirá en otro apartado.La diferencia entre los métodos de Java y métodos en lenguajes no orientados a objetoscomo C es que los métodos pertenecen a una clase. Esto significa que se llaman usando laanotación del punto que indica la instancia de la clase a la que el método pertenece (Losmétodos estáticos son una excepción a esto pero no te preocupes sobre ellos por elmomento) 18
  19. 19. javaHispano. Tu comunidad, tu lenguaje.Así en HelloWorld2 el método amethod se llamo así: HelloWorld hw = new HelloWorld(); hw.amethod();Si se hubieran creado otras instancias de la clase HelloWorld el método podría llamarsedesde cada instancia de la clase. Cada instancia de la clase tendría acceso a sus propiasvariables. Así lo siguiente involucraría la llamada al código del método amethod de lasdiferentes instancias de la clase.HelloWorld hw = new HelloWorld();HelloWorld hw2 = new HelloWorld();hw.amethod();hw2.amethod();Las dos instancias de la clase: hw y hw2 podrían tener acceso a variables diferentes.Variables AutomáticasLas variables automáticas son las variables de los métodos. Estas entran en el alcance delprograma cuando empieza a ejecutarse el código del método y dejan de existir una vezque el método deja de ejecutarse. Son sólo visibles dentro del método y son útilesprincipalmente para la manipulación de datos temporales. Si quieres que un valorpermanezca entre las llamadas de un método entonces la variable necesita ser creada alnivel de la clase.Una variable automática será la "sombra" de una variable de nivel de clase.Así el código siguiente mostrará 99 y no 10:public class Shad{public int iShad=10;public static void main(String argv[]){ Shad s = new Shad(); s.amethod(); }//fin de main public void amethod(){ int iShad=99; System.out.println(iShad); }//fin de amethod} 19
  20. 20. Tutorial para el examen de certificación: SCJP 1.2Modificadores y Encapsulamiento. Los modificadores de visibilidad son parte del mecanismo de encapsulamiento para Java. El encapsulamiento permite la separación de la interfase y la implementación de métodos.A menudo estos métodos son para recuperar y actualizar los valores de una variable localprivada. Son conocidos como métodos accessor (acceder o obtener el valor de lavariable) y mutator (modificar el contenido de una variable). La convención paranombrar a estos métodos es setFoo para modificar y getFoo para obtener el contenidode una variable. Así si estuvieras almacenado una variable llamada age deberías hacerlaprivada y actualizarla con:setAgey recuperar su valor con:getAgeUsando código para modificar variables; el valor de la variable también puedeverificarse, por ejemplo: si el valor esta dentro de un rango en particular o revisar si es unnumero positivo.PrivateLas variables privadas son sólo visibles dentro de la misma clase donde se crean. Estosignifica que NO son visibles dentro de las subclases. Esto permite que la variable seaaislada de ser modificada por cualquier método, exceptuando aquellos en la clase actual.Como se dijo anteriormente, esto es útil para separar la interfase de la implementación.class Base{private int iEnc=10;public void setEnc(int iEncVal){ if(iEncVal < 1000){ iEnc=iEncVal; }else System.out.println("Enc value must be less than 1000"); //Or Perhaps thow an exception }//End if}public class Enc{public static void main(String argv[]){ Base b = new Base(); b.setEnc(1001); }//End of main} 20
  21. 21. javaHispano. Tu comunidad, tu lenguaje.PublicEl modificador public puede aplicarse a una variable (campo) o una clase. Esprobablemente el primer modificador que conociste aprendiendo Java. Si revisas elcódigo para HelloWorld.Java, que se programó en un principio, la clase se declaró como:public class HelloWorldEsto es porque para iniciar el método mágico la JVM, sólo revisa en una clase declaradacomo publica:public static void main(String argv[])Una clase pública tiene alcance global, y una instancia puede crearse desde cualquierparte dentro o fuera de un programa. Únicamente una clase en un archivo puede definirsecon la palabra clave public. Si defines más de una clase en un archivo con la palabraclave public el compilador generará un errorclass Base { public int iNoEnc=77;}public class NoEnc{public static void main(String argv[]){ Base b = new Base(); b.iNoEnc=2; System.out.println(b.iNoEnc); }//End of main}Observa que generalmente ésta no es la manera sugerida ya que no permite ningunaseparación entre la interfase y implementación del código. Si decidieras cambiar el tipode dato de iNoEnc, tendrías que modificar la implementación de cada parte del códigoexterno que lo modifica.ProtectedEl modificador protected es una pequeña rareza. Una variable protegida es visibledentro de una clase, en una subclase, y en el mismo paquete, pero no en otra parte. Lacualidad de ser visible dentro del mismo paquete puede darle más visibilidad de la quepodrías sospechar. Cualquier clase que esté en el mismo directorio se considera que estáen el paquete predefinido, y así las clases protegidas serán visibles. Esto significa que unavariable protegida tiene más visibilidad que una variable definida sin modificador deacceso. 21
  22. 22. Tutorial para el examen de certificación: SCJP 1.2Se dice que una variable definida sin modificador de acceso tiene visibilidad predefinida.La visibilidad predefinida significa que una variable puede verse dentro de la clase, ydesde otra parte dentro del mismo paquete, pero no desde una subclase que no esté en elmismo paquete.StaticStatic no es directamente un modificador de visibilidad, aunque en la práctica tieneeste efecto. El modificador static puede aplicarse a una clase, a un método y unavariable. Marcando una variable como estática se indica que sólo una copia de esavariable existirá por clase. Esto está en contraste con las variables normales donde porejemplo una copia de una variable integer pertenece a cada instancia de una clase. Asíen el ejemplo siguiente existirán tres instancias de la variable integer iMyVal y cadainstancia podra contener un valor diferente.class MyClass{ public int iMyVal=0;}public class NonStat{public static void main(String argv[]){ MyClass m1 = new MyClass(); m1.iMyVal=1; MyClass m2 = new MyClass(); m2.iMyVal=2; MyClass m3 = new MyClass(); m3.iMyVal=99; //Esto mostrará 1. Ya que cada instancia de // la clase tiene su propia copia de MyVal System.out.println(m1.iMyVal); }//End of main}El Ejemplo siguiente muestra que pasa cuando tienes múltiples instancias de una claseque contiene una variable estática, en este ejemplo la variable estática es iMyEval.class MyClass{ public static int iMyVal=0;}//End of MyClasspublic class Stat{public static void main(String argv[]){ MyClass m1 = new MyClass(); m1.iMyVal=0; MyClass m2 = new MyClass(); m2.iMyVal=1; MyClass m3 = new MyClass(); m2.iMyVal=99; //Debido a que iMyVal es static, //hay sólo una copia de él no importa 22
  23. 23. javaHispano. Tu comunidad, tu lenguaje. //cuantas instancias de la clase se creen. //Este código mostrará el valor de 99 System.out.println(m1.iMyVal); }//End of main}Ten presente que no puedes acceder a variables no estáticas desde dentro de un métodoestático. Así lo siguiente causará un error en tiempo de compilación.public class St{int i;public static void main(String argv[]){ i = i + 2;//Causará un error al compilar }} Un método estático no puede ser sobreescrito para ser no estático en una clase hija.Un método estático no puede ser sobreescrito para ser no estático en una clase hija. Nohay ninguna regla similar con referencia a la sobrecarga. El código siguiente causará unerror cuando intentes sobreescribir el método amethod de la clase Base para ser noestático.class Base{ public static void amethod(){ }}public class Grimley extends Base{ public void amethod(){}//Causa un error en tiempo decompilación}El compilador Jikes de IBM produce el siguiente error:Found 1 semantic error compiling "Grimley.java": 6. public void amethod(){} <------->*** Error: The instance method "void amethod();"cannot override the static method "void amethod();"declared in type "Base"NativeEl modificador native sólo se usa para los métodos e indica que el cuerpo del códigoesta escrito en un lenguaje que no es Java como C y C++. Se escriben a menudo métodos 23
  24. 24. Tutorial para el examen de certificación: SCJP 1.2nativos para propósitos específicos de la plataforma como acceder a algún elemento dehardware del cual la Maquina Virtual de Java no este consciente. Otra razón es utilizarlodonde se requiere mayor desempeño.Un método nativo termina con punto y coma en lugar de un bloque del código. Así losiguiente llamaría una rutina externa, escrita quizás en C++,public native fastcalc();AbstractEs fácil pasar por alto el modificador abstract y perderse algunas de susimplicaciones. Es la clase de modificador que a los examinadores les gusta para hacerpreguntas complicadas.El modificador abstracto puede aplicarse a las clases y a los métodos. Cuando seaplica a un método indica que éste no tendrá cuerpo y el código sólo puede ejecutarsecuando se implemente en una clase hija. Sin embargo hay algunas restricciones sobrecuando y donde puedes tener métodos abstractos y reglas sobre las clases que loscontienen. Cuando se aplica a una clase, indica que la clase tiene un por lo menos métodoabstracto. Si una clase tiene algún método abstracto esta debe ser asimismo declarada abstracta .Sin embargo, no te distraigas pensado que una clase abstracta no puede tener métodosno abstractos. Cualquier clase que descienda de una clase abstracta debe implementar losmétodos abstractos de la clase base o debe declararlos abstractos ella misma. ¿Tiendenestas reglas a generar la pregunta por qué querrías crear métodos abstractos?Los métodos abstractos son principalmente beneficiosos a los diseñadores de clases.Ofrecen al diseño de una clase una manera de crear un prototipo para métodos que han deser implementados, pero la implementación real queda a las personas que usan las clasesdespués. Aquí hay un ejemplo de una clase abstracta con un método abstracto. De nuevonota que la propia clase se declara abstracta, de otra manera habría ocurrido un error entiempo de compilación.La siguiente clase es abstracta y se compilará sin problemas:public abstract class abstr{public static void main(String argv[]){ System.out.println("hello in the abstract"); } public abstract int amethod(); 24
  25. 25. javaHispano. Tu comunidad, tu lenguaje.}FinalEl modificador final indica que un método no puede ser heredado. Otra manera deentender esto es que una clase final no puede ser una clase padre. Cualquier método enuna clase final es automáticamente final. Esto puede ser útil si no quieres que otrosprogramadores "hechen a perder tu código". Otro beneficio es la eficacia puesto que elcompilador tiene menos trabajo al trabajar con un método final. Esto se cubre mejor en elVolumen 1 de Core Java.El código siguiente ilustra el uso del modificador final en una clase. Este código mostrarála cadena "amethod":final class Base{public void amethod(){ System.out.println("amethod"); }}public class Fin{public static void main(String argv[]){ Base b = new Base(); b.amethod(); }}ShynchronizedLa palabra clave synchonized se usa para prevenir que más de un thread acceda a unbloque de código a la vez. Ve la sección 7 sobre threads para entender más cómofunciona esto.TransientLa palabra clave transient es uno de los modificadores frecuentemente menos usados.Indica que una variable no debe escribirse fuera cuando una clase es serializada.VolatileProbablemente no conseguirás realizar alguna pregunta sobre la palabra clave volatile. Lopeor que conseguirás es reconocer que realmente es un palabra clave de Java. SegúnBarry Boone:"le dice al compilador que una variable puede cambiar asincrónicamente debido a losthreads" 25
  26. 26. Tutorial para el examen de certificación: SCJP 1.2Acepta que es parte del lenguaje y entonces mejor preocúpate por otras cosas.Usando modificadores en combinaciónLos modificadores de visibilidad no pueden usarse en combinación, así una variable nopuede ser privada y pública, pública y protegida o protegido y privada. Puedes tenercombinaciones de los modificadores de visibilidad y los modificadores mencionados, porsupuesto, en mi lista "y demás". • native • transient • synchronized • volatileAsí puedes tener un método public static native. Donde pueden usarse los modificadores Modificador Método Variable clase public si si si private si si si(anidable) protected si si si(anidable) abstract si no si final si si si transient no si no native si no no volatile no si noEjercicio 1)Crea un archivo llamado Whitley.java. En este archivo define una clase llamada Basecon un método abstracto llamado lamprey que retorne un valor de tipo int. En elmismo archivo crea una clase llamada Whitley que descienda de la clase Base.Proporciona a la clase Whithley un método llamado lamprey con el código necesariopara mostrar en pantalla la cadena “lamprey”.Crea un método nativo para la clase llamado mynative. Ahora compila y ejecuta elcódigo.Ejercicio 2) 26
  27. 27. javaHispano. Tu comunidad, tu lenguaje.Crea una clase publica llamada Malvern. Crea una clase interna y privada llamadaGreat que tenga un método llamado show de la forma public void. Haz que estemétodo muestre en pantalla la cadena “Show”. Proporciona a la clase Malvern unmétodo publico llamado go que cree una instancia de Great y después de serinstanciada llame al método show. En el método main de la clase Malvern crea unainstancia de sí misma. Haz que esta instancia llame al método go. Compila y ejecuta elcódigo.Solución sugerida para el ejercicio 1.abstract class Base{abstract int lamprey();}public class Whitley extends Base{public static void main(String argv[]){ }public int lamprey(){ System.out.println("lamprey"); return 99; }native public void mynative();}Solución sugerida para el ejercicio 2.public class Malvern{public static void main(String argv[]){ Malvern m = new Malvern(); m.go(); } public void go(){ Great g = new Great(); g.show(); } private class Great{ public void show(){ System.out.println("Show"); } }} 27
  28. 28. Tutorial para el examen de certificación: SCJP 1.2Preguntas.Pregunta 1)¿Qué pasará cuando intentes compilar y ejecutar este código?abstract class Base{ abstract public void myfunc(); public void another(){ System.out.println("Another method"); }}public class Abs extends Base{ public static void main(String argv[]){ Abs a = new Abs(); a.amethod(); } public void myfunc(){ System.out.println("My func"); } public void amethod(){ myfunc(); }} 1) El código se compilará y se ejecutará, mostrando la cadena “My func” 2) El código indicara que la clase Base no tiene métodos abstractos. 3) El código se compilara pero indicará un error en tiempo de ejecución (run time error): la clase base no tiene métodos abstractos 4) El compilador indicara que el método myfunc en la clase Base no tiene cuerpo.Pregunta 2)¿Qué pasara cuando intentes compilar y ejecutar este código?public class MyMain{public static void main(String argv){ System.out.println("Hello cruel world"); }} 28
  29. 29. javaHispano. Tu comunidad, tu lenguaje. 1) El compilador indicara que main es una palabra reservada y no puede ser usada para nombrar una clase. 2) El código se compilará y cuando se ejecute mostrara en pantalla la cadena “Hello cruel world”. 3) El código se compilara pero indicará un error en tiempo de ejecución: el constructor no esta definido. 4) El código se compilara pero indicara que la función main no esta definida correctamente.Pregunta 3)¿De los siguientes cuales son modificadores de Java? 1) public 2) private 3) friendly 4) transientPregunta 4)¿Qué pasará cuando intentes compilar y ejecutar este código? class Base{ abstract public void myfunc(); public void another(){ System.out.println("Another method"); } } public class Abs extends Base{ public static void main(String argv[]){ Abs a = new Abs(); a.amethod(); } public void myfunc(){ System.out.println("My func"); } public void amethod(){ myfunc(); } } 1) El código se compilará y se ejecutará, mostrando la cadena “My func” 2) El compilador indicará que la clase Base no esta declarada como abstracta. 3) El código se compilará pero indicará un error en tiempo de ejecución: la clase base no tiene métodos abstractos 4) El compilador indicará que el método myfunc en la clase Base no tiene cuerpo. 29
  30. 30. Tutorial para el examen de certificación: SCJP 1.2Pregunta 5)¿Para que defines un método como nativo? 1) Para conseguir acceder a Hardware desconocido por Java 2) Para definir un nuevo tipo de dato como un entero sin signo. 3) Para escribir código optimizado para el mejor desempeño en un lenguaje como C/C++. 4) Para superar la limitación del alcance privado de un métodoPregunta 6)¿Qué pasará cuando intentes compilar y ejecutar este código?class Base{public final void amethod(){ System.out.println("amethod"); }}public class Fin extends Base{public static void main(String argv[]){ Base b = new Base(); b.amethod(); }} 1) Un error en tiempo de compilación indicando que una clase con algún método final debe ser declarado final por si misma. 2) Un error en tiempo de compilación indicará que no puedes heredar de una clase con métodos final 3) Un error en tiempo de ejecución indicando que Base no esta definida como final 4) Éxito en la compilación y al ejecutarse mostrará en pantalla “amethod”.Pregunta 7)¿Qué pasará cuando intentes compilar y ejecutar este código?public class Mod{public static void main(String argv[]){} public static native void amethod();} 1) Error en la compilación: método nativo no puede ser static. 30
  31. 31. javaHispano. Tu comunidad, tu lenguaje. 2) Error en la compilación: método nativo debe retornar algún valor. 3) Compilación correcta pero habrá un error en tiempo de ejecución a menos que hallas hecho código para hacer útil el método nativo. 4) Compilación y ejecución sin error.Pregunta 8)¿Qué pasará cuando intentes compilar y ejecutar este código?private class Base{}public class Vis{transient int iVal;public static void main(String elephant[]){ }} 1) Un error en tiempo compilación: la clase Base no puede ser privada. 2) Un error en tiempo de compilación indicando que un entero no puede ser transient 3) Un error en tiempo de compilación indicando que transient no es un tipo de dato. 4) Un error en tiempo de compilación indicando que el método main esta deformadoPregunta 9)¿Qué pasara cuando intentes compilar y ejecutar estos dos archivos en el mismodirectorio?//Archivo P1.javapackage MyPackage;class P1{void afancymethod(){ System.out.println("What a fancy method"); }}//Archivo P2.javapublic class P2 extends P1{afancymethod();} 1) Ambos se compilarán y P2 mostrará en pantalla “Wath a fancy method” cuando se ejecute. 2) No se compilará ninguno. 3) Ambos se compilarán pero P2 tendrá un error en tiempo de ejecución. 4) P1 se compilará limpiamente pero P2 tendrá un error al compilarse. 31
  32. 32. Tutorial para el examen de certificación: SCJP 1.2Pregunta 10)¿Cuáles de las declaraciones siguientes son legales? 1) public protected amethod(int i) 2) public void amethod(int i) 3) public void amethod(void) 4) void public amethod(int i)Respuestas.Respuesta 1) 1) El código se compilara y se ejecutara, mostrando la cadena “My func”Una clase abstracta puede tener métodos no abstractos, pero cualquier clase quedescienda de ella, debe implementar todos los métodos abstractos.Respuesta 2) 1) El código se compilara pero indicara que la función main no esta definida correctamente.La función main recibe un String en lugar de un arreglo de String que es locorrecto.Respuesta 3) 1) public 2) private 4) transientAunque algunos textos usan la palabra “friendly” cuando tratan el tema de visibilidad,esta no es una palabra reservada de Java. Toma en cuenta que será casi seguro que elexamen contenga problemas que te pidan que identifiques palabras claves de Java en unalista.Respuesta 4) 2) El compilador indicara que la clase Base no esta declarada como abstracta.El mensaje de error utilizando JDK 1.1. es:Abs.java:1: class Base must be declared abstract.It does not define void myfunc() from class Base.class Base{ 32
  33. 33. javaHispano. Tu comunidad, tu lenguaje.^1 errorRespuesta 5)1) Para conseguir acceder a hardware desconocido por Java3) Para escribir código optimizado para el mejor desempeño en un lenguaje como C/C++Aunque la creación de código “PURE JAVA”es altamente conveniente, particularmentepara permitir la independencia de plataforma, no debe de tomarse como una religión, yhay ocasiones en que se requiere el código nativo.Respuesta 6) 4)Éxito en la compilación y al ejecutarse mostrará en pantalla “amethod”.Este código llama a una versión de amethod de la clase Base. Si intentas implementaruna versión sustituida del método en la clase Fin conseguirás un error en tiempo decompilación.Respuesta 7) 4)Compilación y ejecución sin error.Esta línea no es una llamada a un método nativo –solo se esta declarando- y por lo tantono ocurre un error en la ejecución.Respuesta 8) 1)Un error en tiempo compilación: la clase Base no puede ser privada.Una clase de un nivel alto, al igual que una clase base, no puede ser declarada comoprivadaRespuesta 9) 4)P1 se compilará limpiamente pero P2 tendrá un error al compilarse.Aunque P2 esta en el mismo directorio que P1, debido a que P1 fue declarado como partede un paquete, P1 no esta visible para P2.Respuesta 10) 2)public void amethod(int i)Si pensaste que la opción 3 es legal utilizando como parámetro el argumento void, debesquitarte un poco de C/C++ de la cabeza. 33
  34. 34. Tutorial para el examen de certificación: SCJP 1.2La opción 4 no es legal porque el tipo de datos debe aparecer después de cualquierespecificador de acceso. Otras Fuentes para este tema.Este tema es cubierto en el tutorial de Sun como Modificadores de clases:http://java.sun.com/docs/books/tutorial/reflect/class/getModifiers.htmlControlando el acceso a los miembros de una clase:http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.htmlRichard Baldwin Cubre este tema enhttp://www.Geocities.com/Athens/Acropolis/3797/Java040.htmJyothi Krishnan en:http://www.geocities.com/SiliconValley/Network/3693/obj_sec1.html#obj2Bruce Eckel Thinking in JavaChapter 5 (aunque tiene la cabeza llena de C++ e insiste en incluir el modificador “friendly”) 34
  35. 35. javaHispano. Tu comunidad, tu lenguaje.Objetivo 3.Para una clase dada, determinar si se debe crear un constructor predefinido, y si ese es elcaso, declarar el prototipo de ese constructor.Nota de este objetivoÉste es un objetivo pequeño pero oportuno, que se concentra en un aspecto fácilmentepasado por alto en Java¿Qué es un constructor?Necesitas comprender el concepto de constructor para entender este objetivo.Brevemente, es el código que se ejecuta automáticamente cuando se crea la clase. Losconstructores a menudo se usan para iniciar valores en la clase. Los constructores tienenel mismo nombre de a clase y no retornan ningún valor. En el examen puedes encontarpreguntas sobre métodos que tengan el mismo nombre de la clase pero que retornan algúntipo, como int o String. Ten cuidado y asegúrate que cualquier método que asumasque es un constructor no debe retornar algún tipo de dato.Aquí hay un ejemplo de una clase con un constructor que muestra "Greetings fromCrowle" cuando se crea una instancia de la clase.public class Crowle{ public static void main(String argv[]){ Crowle c = new Crowle(); } Crowle(){ System.out.println("Greetings from Crowle"); }}¿Cuándo proporciona Java el constructor predefinido?Si no defines específicamente algún constructor, el compilador inserta “fuera de escena”un constructor invisible con cero parámetros, frecuentemente esto solo es de importanciateórica, pero lo verdaderamente importante es que solo recibes el constructor predefinidocon cero parámetros si no creas algún constructor propio. 35
  36. 36. Tutorial para el examen de certificación: SCJP 1.2 Si creas tus propios constructores, Java ya no te proporciona el constructor predefinido con cero parámetros. Así que tienes que especificarlo.En cuanto creas algún constructor propio, pierdes el constructor predefinido con ceroparámetros. Si intentas crear una instancia de una clase, sin pasarle algún parámetro(invocando la clase con el constructor con cero parámetros), obtendrás un error. Así,cuando crees algún constructor para una clase necesitarás crear el constructor con ceroparámetros. Esta es una de las razones por las que generadores de código comoBorland/Inprise o JBuilder, crean un constructor con cero parámetros cuando generan elesqueleto de una clase.El ejemplo siguiente muestra código que no compilará. Cuando el compilador verifica lacreación de la instancia c de la clase Base, inserta una llamada al constructor con ceroparámetros. Debido a que la clase Base tiene un constructor que recibe un entero, elconstructor con cero parámetros ya no esta disponible. Esto se puede arreglar creando enla clase Base un constructor con cero parámetros que “no haga nada”.//Advertencia: no se compilaráclass Base{Base(int i){ System.out.println("single int constructor"); }}public class Cons { public static void main(String argv[]){ Base c = new Base(); }}//Esto si se compilaráclass Base{Base(int i){ System.out.println("single int constructor"); }Base(){}}public class Cons { public static void main(String argv[]){ Base c = new Base(); }} 36
  37. 37. javaHispano. Tu comunidad, tu lenguaje.El prototipo del constructor predefinidoEl objetivo te pide que estes consciente del prototipo del constructor predefinido.Naturalmente no debe tener ningún parámetro. La predefinición más evidente es no tenerningún especificador de alcance, pero puedes definir un constructor como público oprotegido.Los constructores no pueden ser nativos, abstractos, estáticos, sincronizados ni finales.Ese pedazo de información se derivó directamente de un mensaje de error delcompilador. Parece que la calidad de los mensajes de error están mejorando con lasnuevas versiones de Java. He oído que el nuevo compilador de Java de IBM tiene unbuen informador de errores. Podrían aconsejarte que tuvieras disponible más de unaversión del compilador de Java para verificar tu código y buscar los errores.EjerciciosEjercicio 1)Crea una clase llamada Salwarpe con un método llamado hello que muestre la cadena“hello”. En el método main de la clase crea una instancia de sí misma llamada s1 yllama al método hello desde la instancia. Compila y ejecuta el programa para quepuedas ver el resultado.Ejercicio 2)Usando todavía el archivo Salwarpe.java comenta las líneas que crean la instancia yllaman al método hello. Crea un constructor publico para la clase que tome unparámetro entero y muestre el valor del entero. Crea una instancia de la clase llamada s2proporciónale el valor de 99 al constructor. Compila y ejecuta el programa para quepuedas ver mostrado el resultado.Ejercicio 3)Descomenta las líneas que crean la instancia s1 y modifica el programa para quecompile, ejecute y muestre ambos la cadena Hello y el numero 99.Solución sugerida para el ejercicio 1.public class Salwarpe { public static void main(String argv[]){ Salwarpe s1 = new Salwarpe(); s1.hello(); } public void hello(){ System.out.println("Hello"); } 37
  38. 38. Tutorial para el examen de certificación: SCJP 1.2}Solución sugerida para el ejercicio 2.public class Salwarpe { public static void main(String argv[]){ //Salwarpe s1 = new Salwarpe(); //s1.hello(); Salwarpe s2 = new Salwarpe(99); } public void hello(){ System.out.println("Hello"); } public Salwarpe(int i){ System.out.println(99); }}Solución sugerida para el ejercicio 3.public class Salwarpe { public static void main(String argv[]){ Salwarpe s1 = new Salwarpe(); s1.hello(); Salwarpe s2 = new Salwarpe(99); } public void hello(){ System.out.println("Hello"); } public Salwarpe(int i){ System.out.println(99); } public Salwarpe(){}}Observa como fue necesario crear el constructor con cero parámetros para este últimoejercicio. Una vez que has creado algún constructor para una clase, Java ya no teproporciona “tras escena” el constructor con cero parámetros que estaba disponible en elejercicio 1. 38
  39. 39. javaHispano. Tu comunidad, tu lenguaje.PreguntasPregunta 1)Dada la siguiente definición de clase:class Base{ Base(int i){}}class DefCon extends Base{DefCon(int i){ //XX }}¿Cuál se las líneas siguientes será individualmente valida si se sustituye por la líneamarcada con //XX?1) super();2) this();3) this(99);4)super(99);Pregunta 2)Dada la siguiente definición de clase:public class Crowle{ public static void main(String argv[]){ Crowle c = new Crowle(); } Crowle(){ System.out.println("Greetings from Crowle"); }}¿Cuál es el tipo de dato retornado por el constructor?1) null2) integer3) String4) no es retornado algún tipo de datoPregunta 3)¿Qué pasara cuando intentes compilar y ejecutar el siguiente código? 39
  40. 40. Tutorial para el examen de certificación: SCJP 1.2public class Crowle{ public static void main(String argv[]){ Crowle c = new Crowle(); }void Crowle(){ System.out.println("Greetings from Crowle"); }}1)Se compilara y mostrará la cadena “Greetings from Crowle”.2)Error en tiempo de compilación: un constructor no puede retornar un tipo de dato.3)Se compilara y mostrará la cadena “void”.4)Se compilara y no mostrará nada al ejecutarse.Pregunta 4)¿Qué pasara cuando intentes compilar y ejecutar el siguiente código?class Base{ Base(int i){ System.out.println("Base"); }}class Severn extends Base{public static void main(String argv[]){ Severn s = new Severn(); } void Severn(){ System.out.println("Severn"); }}1)Se compilará al ejecutarse y mostrará la cadena “Seven”.2)Error en tiempo de compilación.3)Se compilará y no mostrará nada al ejecutase4)Se compilará y mostrará la cadena “Base”Pregunta 5)¿Cuáles de las siguientes declaraciones son verdaderas?1)El constructor predefinido retorna un tipo void.2)El constructor predefinido toma como parámetro un valor tipo void.3)El constructor predefinido no toma parámetros. 40
  41. 41. javaHispano. Tu comunidad, tu lenguaje.4)El constructor predefinido no se crea si la clase contiene algún constructor propioRespuestasRespuesta 1)4)super (99)Debido a que la clase Base tiene definido un constructor, el compilador no insertará elconstructor predefinido con cero parámetros. Por consiguiente, llamar a super() causaráun error. Una llamada a this() es un intento de llamar a un constructor con ceroparámetros inexistente en la clase actual. La llamada a this(99) causará una referenciacircular y causará un error en tiempo de compilación.Respuesta 2)4) no es retornado algún tipo de datoDebe ser bastante obvio de que ningún tipo de dato se retorna, así como por definiciónlos constructores no tienen tipos de datosRespuesta 3)4)Se compilara y no mostrará nada al ejecutarse.Debido a que el método Crowle retorna un tipo de dato no es un constructor, porconsiguiente la clase se compilará y al ejecutarse el método Crowle no se ejecutará –pues no ha sido llamado-.Respuesta 4)2)Error en tiempo de compilación.Ocurre un error cuando la clase Severn intenta llamar al constructor con cero parámetrosen la clase Base.Respuesta 5)3)El constructor predefinido no toma parámetros.4)El constructor predefinido no se crea si la clase contiene algún constructor propio 41
  42. 42. Tutorial para el examen de certificación: SCJP 1.2 Otras Fuentes de este tema:Esta tema es cubierto en el Tutorial de Sun :http://java.sun.com/docs/books/tutorial/java/javaOO/constructors.htmlRichard Baldwin cubre este tema enhttp://www.Geocities.com/Athens/Acropolis/3797/Java042.htm#default constructorJyothi Krishnan en:http://www.geocities.com/SiliconValley/Network/3693/obj_sec1.html#obj3Bruce Eckel Thinking In JavaCapítulo 4 42
  43. 43. javaHispano. Tu comunidad, tu lenguaje.Objetivo 4Establecer los tipos de datos validos de retorno para cualquier método, dada lasdeclaraciones de todos lo métodos relacionados con este o con la clase padre.Nota de este objetivoLa frase del objetivo parece ser bastante obscura. Parece estar pidiéndote que entiendasla diferencia entre sobrecarga y sobrescritura.Para aprovechar mejor este objetivo necesitas una comprensión básica sobre lasobrecarga y sobrescritura de métodos. Esto se ve en la:Sección 6: Orientación a Objetos, sobrecarga y sobreescritura en tiempo de ejecuciónMétodos en la misma claseSi dos o más métodos en la misma clase tienen el mismo nombre, se dice que el métodoesta sobrecargado. Puedes tener dos métodos en una clase con el mismo nombre perodeben tener parámetros de diferente tipo y en diferente orden.Es el orden de los parámetros y los tipos de los mismos los que distinguen entrecualquiera de dos versiones de un método sobrecargado a uno en especial. El tipo de datode retorno no contribuye a la distinción entre métodos.El código siguiente generará un error en tiempo de compilación, el compilador observaen amethod un intento por definir el mismo método dos veces. Causa un error que diráalgo como lo siguiente:method redefined with different return type: void amethod(int) was int amethod(int)class Same{public static void main(String argv[]){ Over o = new Over(); int iBase=0; o.amethod(iBase); } //Las siguientes definiciones generan un error alcompilar public void amethod(int iOver){ System.out.println("Over.amethod"); } public int amethod(int iOver){ System.out.println("Over int return method"); return 0; } 43
  44. 44. Tutorial para el examen de certificación: SCJP 1.2} El tipo de dato de retorno no contribuye a realizar la distinción entre un método y otro.Métodos en una subclase.Puedes sobrecargar un método en una subclase. Todo lo que se requiere es que la nuevaversión debe tener parámetros de diferente tipo y en diferente orden. Los nombres de losparámetros o el tipo de dato retornado por el método no se toman en cuenta para lasobrecarga de métodos.Si vas a sobrescribir un método, por ejemplo para reemplazar su funcionalidadcompletamente en una subclase, la versión sobrescrita del método debe tener la mismadefinición que la versión de la clase base de la que esta descendiendo. Esto incluye el tipode dato de retorno. Si creas un método en una subclase con el mismo nombre ydefinición pero retorna un tipo de dato distinto, generarás el mismo mensaje de error queen el ejemplo anterior. Es decir:method redefined with different return type: void amethod(int)was int amethod(int)El compilador lo ve como un intento fallido por sobrecargar el método en lugar de verlocomo una sobrescritura del método.PreguntasPregunta 1)Dada la siguiente definición de clase:public class Upton{public static void main(String argv[]){ 44
  45. 45. javaHispano. Tu comunidad, tu lenguaje. } public void amethod(int i){} //Here}¿Cuáles de las líneas siguientes son válidas para ser colocadas después del comentario//Here?1) public int amethod(int z){}2) public int amethod(int i,int j){return 99;}3) protected void amethod(long l){ }4) private void anothermethod(){}Pregunta 2)Dada la siguiente definición de clase:class Base{ public void amethod(){ System.out.println("Base"); }}public class Hay extends Base{public static void main(String argv[]){ Hay h = new Hay(); h.amethod(); }}¿Cuál de los siguientes método puede ser de la clase Hay para que compile y provoqueque el programa muestre la cadena “Hay” ?1) public int amethod(){ System.out.println("Hay");}2) public void amethod(long l){ System.out.println("Hay");}3) public void amethod(){ System.out.println("Hay");}4) public void amethod(void){ System.out.println("Hay");}RespuestasRespuesta 1) 45
  46. 46. Tutorial para el examen de certificación: SCJP 1.22) public int amethod(int i, int j) {return 99;}3) protected void amethod (long l){}4) private void anothermethod(){}La opción 1 no compilara por dos razones. La primera es que obviamente exige que unentero sea retornado- y como podemos ver hace falta un return -. La otra es que esevidente un intento por redefinir un método dentro de la misma clase. El cambio denombre del parámetro de i a z no tiene efecto y un método no puede ser sobrescritodentro de la misma clase.Respuesta 2)3) public void amethod(){ System.out.println("Hay");}La opción 3 es una sobrescritura del método de la clase Base, para alguna invocación deesta versión se utilizarán cero parámetrosLa opción 1 generará un error que indicará que se está intentando redefinir un métodocon un diferente tipo de dato de retorno. Aunque la opción 2 compilará, la llamada aamethod invocará el método de la clase Base y la salida sea la cadena “Base”. Laopción 4 fue diseñada para sorprender a aquellos con una cabeza llena de C/C++, en Javano hay tal cosa: la utilización de void para indicar que no hay parámetros. Otras Fuentes de este tema:Jyothi Krishnanhttp://www.geocities.com/SiliconValley/Network/3693/obj_sec1.html#obj4En esta liga Jyothi sugiere que vayas al objetivo 19:http://www.geocities.com/SiliconValley/Network/3693/obj_sec6.html#obj19 46
  47. 47. javaHispano. Tu comunidad, tu lenguaje.Sección 2. Control de Flujo y Manejo de Excepciones.Objetivo 1.Escribir código que use sentencias if y switch e identificar los tipos validos deargumentos para estas sentencias.La sentencia if/else.Ls sentencia if/else funciona en Java tal como podrías esperar que funcione en otroslenguajes. las sentencias switch/case tienen unas peculiaridades.La sintaxis para la sentencia if/else es:if(condicion tipo_boolean){ //si el boolean es verdadero se hace esto }else { //sino, se hace esto}Java no tiene la palabra clave "then" como en Visual Basic.Las llaves son un indicador general en Java de una declaración compuesta que permiteejecutar múltiples líneas de código como resultado de alguna evaluación. Esto se conocecomo bloque de código. La parte del "else" siempre es opcional.Una idiosincrasia de Java es que la sentencia if debe tomar un valor del tipo boolean.No puedes usar la convención de C/C++ donde cualquier valor distinto de cero esverdadero y 0 es falso.Así , en Java lo siguiente simplemente no compilará:int k =-1; if(k){//no se compilará! System.out.println("do something");}Esto debido a que debes efectuar explícitamente una pregunta sobre la variable k quedevuelva un valor tipo boolean, como en el ejemplo siguiente:if(k == -1){ System.out.println("do something"); //compilación OK! }Así como en C/C++ puedes no utilizar las llaves: 47
  48. 48. Tutorial para el examen de certificación: SCJP 1.2boolean k=true;if(k) System.out.println("do something");Esto a veces es considerado un mal estilo de programación, porque si modificas el códigodespués para incluir declaraciones adicionales estas quedarán fuera del bloquecondicional (qué solo abarca una línea por no utilizar llaves) Así: if(k) System.out.println("do something"); System.out.println("also do this");La segunda línea siempre se ejecutará.La Sentencia switchLa opinión de Peter van der Lindens sobre la sentencia switch se resume cuando dice:"Muerte a la sentencia switch"Este es un asunto al que le debes prestar atención extra. El argumento de una sentenciaswitch debe ser un byte, char, short o un int. Puedes encontrar un ejercicio enel examen que use un float o un long como argumento en una sentencia switch. Unapregunta bastante común parece estar sobre el uso de la sentencia break en el procesodescendente a través de una sentencia switch. Aquí hay un ejemplo de este tipo depregunta.int k=10;switch(k){ case 10: System.out.println("ten"); case 20: System.out.println("twenty"); }El sentido común nos indicaría que después de ejecutar las instrucciones que siguen laprimera sentencia case, y habiéndose encontrado con otra sentencia case, el compiladorterminaría su descenso a través de la sentencia switch. Sin embargo, por razones mejorconocidas solo por los diseñadores del lenguaje, una sentencia case solo se detienecuando se encuentran con una sentencia break. Como resultado, en el ejemplo anteriorlas cadenas: "ten" y "twenty" son mostradas.Otra pequeña peculiaridad que puede surgir en las preguntas es donde colocar lasentencia default. 48
  49. 49. javaHispano. Tu comunidad, tu lenguaje. La cláusula default no necesita ir al final de una sentencia case.El lugar convencional para la sentencia default está al final de las opciones case. Asínormalmente el código se escribirá como sigue:int k=10;switch(k){ case 10: System.out.println("ten"); break; case 20: System.out.println("twenty"); break; default: System.out.println("This is the default output");}Esta aproximación refleja la manera en que piensa la mayoría de las personas. Una vezque se han probado todas las posibilidades, se realiza la sentencia default. Sinembargo, el código de una sentencia switch con la sentencia default hasta arriba essintácticamente correcto, pero no aconsejable.int k=10; switch(k){ default: //Coloca default hasta abajo y no acá System.out.println("This is the default output"); break; case 10: System.out.println("ten"); break; case 20: System.out.println("twenty"); break;}Argumentos validos para las sentencias if y switch.Como mencioné anteriormente una sentencia if puede tomar solo un valor tipo booleany una sentencia switch puede tomar solamente un byte, char, short o un int.El operador ternario ? 49
  50. 50. Tutorial para el examen de certificación: SCJP 1.2Algunos programadores dicen que el operador ternario es útil. Yo no considero para que.No se menciona específicamente en los objetivos así que por favor háganme saber siaparece en su examen.Pregunta 1)¿Qué pasará cuando intentes compilar y ejecutar el siguiente código?public class MyIf{boolean b;public static void main(String argv[]){ MyIf mi = new MyIf();}MyIf(){ if(b){ System.out.println("The value of b was true"); } else{ System.out.println("The value of b was false"); } }}1) Error en tiempo de compilación: la variable b no fue inicializada2) Error en tiempo de compilación: el parámetro para la sentencia if debe evaluar a unboolean3) Error en tiempo de compilación: no se puede crear y asignar un valor simultáneamentea un boolean4) Compilación y ejecución mostrando el segundo mensaje.Pregunta 2)¿Qué pasará cuando intentes compilar y ejecutar este código?public class MyIf{public static void main(String argv[]){ MyIf mi = new MyIf(); }MyIf(){ boolean b = false; 50
  51. 51. javaHispano. Tu comunidad, tu lenguaje. if(b=false){ System.out.println("The value of b is"+b); } }}1) Error en tiempo de ejecución: un boolean no puede agregarse con el operador +2) Error en tiempo de compilación: el parámetro para la sentencia if debe evaluar a unboolean3) Error en tiempo de compilación: no se puede crear y asignar un valor simultáneamentea un boolean4) Compilación y ejecución sin salida.Pregunta 3)¿Qué pasará cuando intentes compilar y ejecutar este código?public class MySwitch{public static void main(String argv[]){ MySwitch ms= new MySwitch(); ms.amethod(); }public void amethod(){ char k=10; switch(k){ default: System.out.println("This is the default output"); break; case 10: System.out.println("ten"); break; case 20: System.out.println("twenty"); break; } }}1) Ninguna de estas opciones2) Error en tiempo de compilación: el valor para el switch debe ser de tipo entero3) Se Compilará y ejecutará mostrando "This is the default output"4) Se Compilará y ejecutará mostrando "ten" 51

×