Escolar Documentos
Profissional Documentos
Cultura Documentos
SECCION 1
Declaración y control de Acceso..................................2
Objetivo 1............................................................................................................................2
Arrays..............................................................................................................................2
Declaración sin asignación..............................................................................................2
Creación y Declaración Simultanea................................................................................3
Arrays Java VS Arrays C/C++ .......................................................................................3
Los arrays conocen su tamaño........................................................................................4
Arrays Java VS Arrays VB.............................................................................................4
Combinar declaración con inicialización........................................................................5
Objetivo 2............................................................................................................................9
Comparando las clases de C++/VB con las de Java.......................................................9
El rol de las clases en Java..............................................................................................9
La clase mas sencilla.....................................................................................................10
Creando una clase sencilla- HelloWorld.......................................................................10
La magia del nombre main............................................................................................10
Creando una instancia de una Clase..............................................................................11
Creando Métodos..........................................................................................................12
Variables Automáticas...................................................................................................13
Modificadores y Encapsulamiento................................................................................14
Usando modificadores en combinación........................................................................19
Objetivo 3..........................................................................................................................28
Nota de este objetivo.....................................................................................................28
¿Qué es un constructor?................................................................................................28
¿Cuándo proporciona Java el constructor predefinido?................................................28
El prototipo del constructor predefinido.......................................................................30
Objetivo 4..........................................................................................................................36
Nota de este objetivo.....................................................................................................36
Métodos en la misma clase...........................................................................................36
Métodos en una subclase...............................................................................................37
1. Declaración y control de Acceso
Objetivo 1.
Escribir código que declare, construya e inicie arrays de cualquier tipo base, usando
cualquiera de las formas permitidas, ambas para declaración y para inicialización.
Arrays.
Los arrays en Java son similares en sintaxis a los arrays en otros lenguajes como 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 obteniendo sus valores utilizado
punteros. Esta capacidad en C/C++, aunque poderosa, propicia la escritura de software
defectuoso. Aunque Java no soporta esta manipulación directa de punteros, esta fuente de
errores es removida.
Todos los elementos de un array deben ser del mimo tipo. El tipo de elementos de un
array, se decide cuando el array se declara.
int num[5];
int num[];
num = new int[5];
Creación y Declaración Simultanea.
Lo anterior puede ser compactado en una sola línea así:
También los corchetes pueden ser además colocados después del tipo de dato o después
del nombre del array. Por lo tanto son legales las siguientes declaraciones:
int[] num;
int num[];
Una gran diferencia entre java y C/C++ es que en java, se conocen de que tamaño
son los arrays, y el lenguaje proporciona protección para no sobrepasar los limites
del array.
Para recorrer un array, la manera mas común es a través del campo length de los arrays,
por lo tanto:
Nota que los arrays tienen el campo length y no el método length(). Cuando comiences a
utilizar Strings usaras el método length, de la siguiente manera:
s.length();
Una diferencia importante entre los arrays multidimensionales, como en C/C++ y los
arrays anidados, es que cada array no tiene que ser del mismo tamaño. Si vemos un array
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)
En otros lenguajes esto se conoce como la dimensión de un array. Así podrías colocar los
corchetes en un mapa con un array de 2 dimensiones:
int [][];
_
NT.: En otras palabras; cada array puede tener un tamaño distinto.
Combinar declaración con inicialización.
En vez de ciclarse a través de un array para llevar a cabo la inicialización, un array puede
ser creado e inicializado a la vez en una sola declaración.
Nota que en ninguna parte necesitas especificar el número de elementos en el array. Puedes
analizar esto, preguntándote si el siguiente código es correcto:
Puedes llenar y crear arrays simultáneamente con cualquier tipo de dato, por lo tanto
puedes crear un array de cadenas, de la siguiente manera:
Ejercicio 1)
Cree una clase con un método que simultáneamente cree e inicialize un array de cadenas.
Inicializa el array con cuatro nombres, después muestra el primer nombre del array.
Ejercicio 2)
Crea una clase que cree un array de cadenas de 5 elementos llamado Fruit en el nivel de
clase, pero no lo inicializes con cualquier valor. Crea un método llamado amethod. En
amethod inicializa los primeros cuatro elementos con nombres de frutas. Crea otro método
llamado modify y cambia el contenido del primer elemento del array Fruit para que
contenga la cadena “bicycle”. Dentro del método modify crea un ciclo for que imprima
todos los elementos del array
}
}
Nota: Cuando el ciclo ejecute la salida de elemento final este será null.
Preguntas.
Pregunta 1)
¿Cómo puedes redimensionar un array en una declaración sencilla manteniendo el
contenido original?
Pregunta 2)
Quieres averiguar el valor del último elemento de un array. Escribiendo el siguiente
Código.¿Qué pasara cuando lo compiles y ejecutes?
Pregunta 3)
Quieres hacer un ciclo a través de un array y detenerte cuando llegues al ultimo elemento.
Siendo un buen programador en Java, y olvidando lo que alguna vez conociste acerca de
C/C++, sabes que los arrays contienen información acerca de su tamaño. ¿Cuál de las
siguientes sentencias puedes usar?
1)myarray.length();
2)myarray.length;
3)myarray.size
4)myarray.size();
Pregunta 4)
Tu jefe esta complacido por que escribiste el programa Hello World y te ha dado un
aumento. Ahora te encomienda que crees un juego como el TicTacToe(o puntos y cruces
como lo conocí en mi adolescencia). Decides que para eso necesitas un array
multidimensional. ¿Cuál de las siguientes líneas realizan el trabajo?
Pregunta 5)
Quieres encontrar una manera más elegante para llenar un array que a través de un ciclo
con la sentencia for. ¿Cuál de las siguientes líneas usarías?
1)
myArray{
[1]="One";
[2]="Two";
[3]="Three";
end with
Respuestas
Respuesta 1)
No puedes redimensionar un array. Necesitas crear un nuevo array temporal con un
tamaño diferente y llenarlo con el contenido del array original. Java Proporciona
contenedores redimencionables con clases como Vector o uno de los miembros de la clase
collection .
Respuesta 2)
Intentar avanzar mas allá del final del array genera un error en tiempo de ejecución. Por
que los arrays son indexados desde 0, el elemento final será i[4] y no i[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”};
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.html
Richard Baldwin trata este tema en:
http://www.Geocities.com/Athens/Acropolis/3797/Java028.htm
Jyothi Krishnan en:
http://www.geocities.com/SiliconValley/Network/3693/obj_sec1.html#obj1
Objetivo 2.
Declarar clases, clases internas, métodos, variables de instancia estáticas, variables y
variables automáticas(métodos locales), haciendo un uso apropiado de todos los
modificadores permitidos (como son: public, final, static, abstract, y demás). Conocer
importancia de cada uno de estos modificadores ya sea solos o en combinación
native
transient
synchronized
volatile
El lenguaje C++ implementa la herencia múltiple y así una clase puede tener más de un
padre (o clase) base. Java únicamente permite la herencia simple, es decir, las clases
pueden tener únicamente un padre. Para sobreponer esta limitación, Java tiene una
característica llamada: Interfaces, a la cual los diseñadores de lenguajes le decidieron dar
algunas de las ventajas de la herencia múltiple, pero sin las desventajas. Todas las clases en
Java son descendientes de una gran clase antecesora llamada Object.
class classname {}
f
NT: El termino original es keyword.
Normalmente una clase también incluirá un especificador de acceso antes de la palabra
clave class y por supuesto, el cuerpo de la clase entre las llaves. Así, lo siguiente es una
plantilla mas sensata para definir una clase:
La 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 declarada publica. Si
declaras mas de una clase en un archivo como publica, ocurrirá un error en tiempo de
ejecución. Nota que Java es sensible a mayúsculas en todos los aspectos. El archivo que
contenga esta clase deberá llamarse HelloWorld.java
La palabra clave class indica que una clase comienza a ser definida y HelloWorld es el
nombre de la clase. Nota que la llave de cierre que finaliza la definición de la clase no
involucra un punto y coma de cerradura. El comentario:
usa el estilo de comentario de una sola línea que esta disponible en C/C++. Java también
comprende los comentarios multilíneas de la forma /* */.
Esta línea indica que un método llamado main esta definiéndose, y que toma como
parámetros (o argumentos ) a un array de cadenas. Este método es publico, es decir desde
cualquier parte visible para clase. La palabra clave static indica que este método puede
ejecutarse sin crear una instancia de la clase. Si eso no significa nada para ti, no te
preocupes, en su momento los métodos estáticos (static) se cubrirán con detalle en otra
parte de este tutorial. La palabra clave void indica el tipo de dato retornado por el método
cuando es llamado. Usar void indica que no será retornado ningún valor.
String argv[]
Indica que el método toma un array de tipo String. Los corchetes indican –como ya vimos-
un array. 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. Sin estas exactitudes, la
Maquina virtual de Java (JVM) no reconocerá el método como el lugar en donde se debe
comenzar la ejecución del programa.
Esta sintaxis para crear una nueva instancia de una clase es básica para el uso de clases.
Nota cómo el nombre de la clase aparece dos veces. La primera vez indica el tipo de dato
de la referencia a la clase. Esta necesidad no es la misma que el tipo actual de la clase
puesto que ésta se indica después de usar la palabra clave new. El nombre de esta instancia
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 escritura de 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 de
una clase que se inicializa con un valor o un array como la clase Label o Button el
paré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 una
función en C/C++ y a una función o sub función en Visual Basic. El método llamado
amethod en este ejemplo se declara como:
public
que indica que puede accederse desde cualquier parte. Retorna el tipo:
void
indicando que ningún valor será retornado. Y los paréntesis vacíos indican que no toma
ningún parámetro.
Estos ejemplos ilustran algunas otras firmas típicas de declaración de métodos. El uso del
las palabras clave private y protected se cubrirá en otro apartado.
Las dos instancias de la clase hw y hw2 podrían tener acceso a variables diferentes.
Variables Automáticas
Las variables automáticas son las variables de los métodos. Estas entran en el alcance del
programa cuando el código del método empieza a ejecutarse y dejan de existir una vez que
el método deja de ejecutarse. Son sólo visibles dentro del método y son útiles
principalmente para la manipulación datos temporales. Si quieres que un valor permanezca
entre las llamadas de un método entonces la variable necesita ser creada al nivel de la clase.
Modificadores y Encapsulamiento.
setAge
getAge
Usando código para modificar variables; el valor de la variable también puede verificarse,
por ejemplo: si el valor esta dentro de un rango en particular o revisar si es un numero
positivo.
Private
Las variables privadas son sólo visibles dentro de la misma clase donde se crean. Esto
significa que NO son visibles dentro de las subclases. Esto permite que la variable sea
aislada de ser modificada por cualquier método exceptuando aquellos en la clase actual.
Como se dijo en modificadores y encapsulamiento, 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
}
Public
El modificador public puede aplicarse a una variable (campo) o una clase. Es
probablemente el primer modificador que conociste aprendiendo Java. Si revisas el código
para HelloWorld.Java, que se programó en un principio, la clase se declaró como:
Esto es porque la JVM para iniciar el método mágico, sólo revisa en una clase declarada
como publica
Una clase pública tiene alcance global, y una instancia puede crearse desde cualquier parte
dentro o fuera de un programa. Únicamente una clase en un archivo puede definirse con la
palabra clave public. Si defines más de una clase en un archivo con la palabra clave public
el compilador generará un error
class 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
}
Nota que ésta no es la manera generalmente sugerida ya que no permite ninguna separación
entre la interfase y implementación del código. Si decidieras cambiar el tipo de dato de
iNoEnc, tendrías que modificar la implementación de cada parte del código externo que lo
modifica.
Protected
El modificador protected es una pequeña rareza. Una variable protegida es visible dentro de
una clase, en una subclase, y en el mismo paquete, pero no en otra parte. La cualidad de ser
visible dentro del mismo paquete puede darle más visibilidad de la que podrías sospechar.
Cualquier clase que este en el mismo directorio se considera que está en el paquete
predefinido, y así las clases protegidas serán visibles. Esto significa que una variable
protegida es más visible que una variable definida sin modificador de acceso.
Se dice que una variable definida sin modificador de acceso tiene visibilidad predefinida.
La visibilidad predefinida significa una variable puede verse dentro de la clase, y desde otra
parte dentro del mismo paquete, pero no desde una subclase que no este en el mismo
paquete.
Static
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 clase que
contiene una variable estática integer.
class MyClass{
public static int iMyVal=0;
}//End of MyClass
public 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
//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 variables no estáticas desde dentro de un método
estático. Así lo siguiente causará un error en tiempo de compilación.
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. No hay
ninguna regla similar con referencia a la sobrecarga. El código siguiente causará un error
cuando intentes sobreescribir el método amethod de la clase Base para ser no estático.
class Base{
public static void amethod(){
}
}
public class Grimley extends Base{
public void amethod(){}//Causa un error en tiempo de
compilación
}
Native
El modificador native sólo se usa para los métodos e indica que el cuerpo del código esta
escrito en un lenguaje que no es Java como C y C++. Se escriben a menudo métodos
nativos para propósitos específicos de la plataforma como acceder a algún elemento de
hardware del cual la Maquina Virtual de Java no este consciente. Otra razón es donde se
requiere mayor performance.
Un método nativo termina con punto y coma en lugar de un bloque del código. Así lo
siguiente llamaría una rutina externa, escrita quizás en C++,
public native fastcalc();
Abstract
Es fácil pasar por alto el modificador abstract y perderse algunas de sus implicaciones. Es
la clase de modificador que a los examinadores les gusta para hacer preguntas complicadas.
El modificador abstracto puede aplicarse a las clases y a los métodos. Cuando se aplica a un
método indica que éste no tendrá cuerpo (sin llaves) y el código sólo puede ejecutarse
cuando se implemente en una clase hija. Sin embargo hay algunas restricciones sobre
cuando y donde puedes tener métodos abstractos y reglas sobre las clases que los contienen.
Cuando se aplica a una clase, indica que la clase tiene un método abstracto por lo menos.
Si una clase tiene algún método abstracto este debe ser declarado abstracto por si
mismo.
Sin embargo, no te distraigas pensado que una clase abstracta no puede tener métodos no
abstractos. Cualquier clase que descienda de una clase abstracta debe implementar los
métodos abstractos de la clase base o debe declararlos abstractos ella misma. ¿Tienden
estas reglas a pedir la pregunta por qué querrías crear métodos abstractos?
Final
El modificador final indica que un método no puede ser heredado. Otra manera de entender
esto es que una clase final no puede ser una clase padre. Cualquier método en una clase
final es automáticamente final. Esto puede ser útil si no quieres que otros programadores
"echen a perder tu código". Otro beneficio es la eficacia puesto que el compilador tiene
menos trabajo al trabajar con un método final. Esto se cubre mejor en el Volumen 1 de
Core Java.
El código siguiente ilustra el uso del modificador final en una clase. Este código mostrará la
cadena "amethod":
Shynchronized
La palabra clave synchonized se usa para prevenir que más de un threadπ acceda a un
bloque de código a la vez. Ve la sección 7 sobre threads para entender más cómo funciona
esto.
Transient
Volatile
"le dice al compilador que una variable puede cambiar asincrónicamente debido a los
threads"
Acepta que es parte del lenguaje y entonces mejor preocúpate por otras cosas.
• • native
• • transient
• • synchronized
• • volatile
p
NT. Aunque algunos documentos traducen thread como hilo o hebra, se esta haciendo común dejarlo tal
cual.
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 no
Ejercicio 1)
Crea un archivo llamado Whitley.java. En este archivo define una clase llamada Base con
un método abstracto llamado lamprey que retorne un valor de tipo int. En el mismo
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 necesario para mostrar en
pantalla la cadena “lamprey”.
Crea un método nativo para la clase llamado mynative. Ahora compila y ejecuta el código.
Ejercicio 2)
Crea una clase publica llamada Malvern. Crea una clase interna y privada llamada Great
que tenga un método llamado show de la forma public void. Haz que este método muestre
en pantalla la cadena “Show”. Proporciona a la clase Malvern un método publico llamado
go que cree una instancia de Great y después de ser instanciada llame al método show. En
el método main de Malvern crea una instancia de sí mismo. Haz que la instancia de sí
mismo llame al método go. Compila y ejecuta el código.
}
public int lamprey(){
System.out.println("lamprey");
return 99;
}
native public void mynative();
}
Solución sugerida para el ejercicio 2.
Preguntas.
Pregunta 1)
¿Qué pasará cuando intentes compilar y ejecutar este código?
}
}
1) 1) El código se compilara y se ejecutara, mostrando la cadena “My func”
2) 2) El código indicara que la clase Base no tiene métodos abstractos.
3) 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) 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?
1) 1) El compilador indicara que main es una palabra reservada y no puede ser usada
para nombrar una clase.
2) 2) El código se compilará y cuando se ejecute mostrara en pantalla la cadena
“Hello cruel world”.
3) 3) El código se compilara pero indicará un error en tiempo de ejecución: el
constructor no esta definido.
4) 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) 1) public
2) 2) private
3) 3) friendly
4) 4) transient
Pregunta 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[]){
i
NT. El verbo utilizado originalmente es complain que significa: quejarse o demandar, espero me indiquen
si con la palabra indicar se entiende mejor el enunciado.
Abs a = new Abs();
a.amethod();
}
public void myfunc(){
System.out.println("My func");
}
public void amethod(){
myfunc();
}
}
Pregunta 5)
¿Para que defines un método como nativo?
Pregunta 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();
}
}
Pregunta 7)
¿Qué pasará cuando intentes compilar y ejecutar este código?
Pregunta 8)
¿Qué pasará cuando intentes compilar y ejecutar este codigo?
Pregunta 9)
¿Qué pasara cuando intentes compilar y ejecutar estos dos archivos en el mismo directorio?
//Archivo P1.java
package MyPackage;
class P1{
void afancymethod(){
System.out.println("What a fancy method");
}
}
//Archivo P2.java
public class P2 extends P1{
afancymethod();
}
Pregunta 10)
¿Cuáles de las declaraciones siguientes son legales?
Respuestas.
Respuesta 1)
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 que descienda
de ella, debe implementar todos los métodos abstractos.
Respuesta 2)
Respuesta 3)
1) public
2) private
4) transient
Aunque 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 el examen
contenga problemas que te pidan que identifiques palabras claves de Java en una lista.
Respuesta 4)
Respuesta 5)
Respuesta 6)
Este código llama a una versión de amethod de la clase Base. Si intentas implementar una
versión sustituida del método en la clase Fin conseguirás un error en tiempo de
compilación.
Respuesta 7)
Esta línea no es una llamada a un método nativo –solo se esta declarando- y por lo tanto no
ocurre un error en la ejecución.
Respuesta 8)
Una clase de un nivel alto, al igual que una clase base, no puede ser declarada como
privada
Respuesta 9)
Respuesta 10)
Si pensaste que la opción 3 es legal utilizando como parámetro el argumento void, debes
quitarte un poco de C/C++ de la cabeza.
La opción 4 no es legal porque el tipo de datos debe aparecer después de cualquier
especificador de acceso.
Para una clase dada, determinar si un constructor predefinido debe ser creado, y si ese es el
caso, declara el prototipo de ese constructor.
¿Qué es un constructor?
Aquí hay un ejemplo de una clase con un constructor que muestra "Greetings from Crowle"
cuando una instancia de la clase es creada.
En cuanto creas algún constructor propio, pierdes el constructor predefinido con cero
pará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 cero parámetros.
Esta es una de las razones por las que generadores de código como Borland/Inprise o
JBuilder, crean un constructor con cero parámetros cuando generan el esqueleto de una
clase.
//Advertencia: no se compilará
class Base{
Base(int i){
System.out.println("single int constructor");
}
}
//Esto si se compilará
class Base{
Base(int i){
System.out.println("single int constructor");
}
Base(){}
}
El objetivo te pide que seas consciente del prototipo del constructor predefinido.
Naturalmente no debe tener ningún parámetro. La predefinición más evidente es no tener
ningún especificador de alcance, pero puedes definir un constructor como público o
protegido.
Los constructores no pueden ser nativos (native), abstractos (abstract), estáticos (static),
sincronizados (synchronized) ni final (final)
Ejercicios
Ejercicio 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 si misma llamada s1 y llama al
método hello desde la instancia. Compila y ejecuta el programa para que puedas ver el
resultado.
Ejercicio 2)
Usando todavía el archivo Salwarpe.java comenta las líneas que crean la instancia y llaman
al método hello. Crea un constructor publico para la clase que tome un parámetro entero y
muestre el valor del entero. Crea una instancia de la clase llamada s2 proporciónale el
valor de 99 al constructor. Compila y ejecuta el programa para que puedas ver mostrado el
resultado.
Ejercicio 3)
Descomenta las líneas que crean la instancia s1 y modifica el programa para que compile,
ejecute y muestre ambos la cadena Hello y el numero 99.
Nota como fue necesario crear el constructor con cero parámetros para este último
ejercicio. Una vez que has creado algún constructor para una clase, Java ya no te
proporciona “tras escena” el constructor con cero parámetros que estaba disponible en el
ejercicio 1.
Preguntas
Pregunta 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ínea
marcada con //XX?
1) super();
2) this();
3) this(99);
4)super(99);
Pregunta 2)
Dada la siguiente definición de clase:
1) null
2) integer
3) String
4) no es retornado algún tipo de dato
Pregunta 3)
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");
}
}
Pregunta 5)
Respuestas
Respuesta 1)
4)super (99)
Respuesta 2)
Debe ser bastante obvio de que ningún tipo de dato es retornado, así como por definición
los constructores no tienen tipos de datos
Respuesta 3)
Respuesta 4)
Un error ocurre cuando la clase Severn intenta llamar al constructor con cero parámetros en
la clase Base.
Respuesta 5)
Para aprovechar mejor este objetivo necesitas una comprensión básica sobre la sobrecarga y
sobrescritura de métodos. Esto se ve en la:
Es el orden de los parámetros y los tipos de los mismos los que distinguen entre cualquiera
de dos versiones de un método sobrecargado a uno en especial. El tipo de dato de retorno
no contribuye a la distinción entre métodos.
class Same{
public static void main(String argv[]){
Over o = new Over();
int iBase=0;
o.amethod(iBase);
}
//Las siguientes definiciones generan un error al compilar
public void amethod(int iOver){
System.out.println("Over.amethod");
}
public int amethod(int iOver){
System.out.println("Over int return method");
return 0;
}
}
El tipo de dato de retorno no contribuye a realizar la distinción
entre un método y otro.
Puedes sobrecargar un método en una subclase. Todo lo que se requiere es que la nueva
versión debe tener parámetros de diferente tipo y en diferente orden. Los nombres de los
parámetros o el tipo de dato retornado por el método no se toman en cuenta para la
sobrecarga de métodos.
Preguntas
Pregunta 1)
}
public void amethod(int i){}
//Here
}
¿Cuáles de las líneas siguientes son válidas para ser colocadas después del comentario
//Here?
Pregunta 2)
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 provoque que
el programa muestre la cadena “Hay” ?
Respuestas
Respuesta 1)
La opción 1 no compilara por dos razones. La primera es que obviamente exige que un
entero sea retornado- y como podemos ver hace falta un return -. La otra es que es
evidente un intento por redefinir un método dentro de la misma clase. El cambio de nombre
del parámetro de i a z no tiene efecto y un método no puede ser sobrescrito dentro de la
misma clase.
Respuesta 2)
La opción 3 es una sobrescritura del método de la clase Base, para alguna invocación de
esta versión se utilizarán cero parámetros
La opción 1 generará un error que indicará que se está intentando redefinir un método con
un diferente tipo de dato de retorno. Aunque la opción 2 compilará, la llamada a amethod( )
invocará el método de la clase Base y la salida sea la cadena “Base”. La opción 4 fue
diseñada para sorprender a aquellos con una cabeza llena de C/C++, en Java no hay tal
cosa: la utilización de void para indicar que no hay parámetros.
Jyothi Krishnan
http://www.geocities.com/SiliconValley/Network/3693/obj_sec1.html#obj4