Sei sulla pagina 1di 60

JavaNivelBsico

ConceptosbsicosdeProgramacionOrientadaaObjetos
Qusonlosobjetos?
Qusonlasclases?
Qusonlosmensajes?
Queslaherencia?
Conceptos bsicos de Programacion Orientada
aObjetos
Qusonlosobjetos?
En informtica, un OBJETO es un conjunto de variables y de los mtodos relacionados con esas
variables.
Un poco ms sencillo: un objeto contiene en s mismo la informacin y los mtodos o funciones
necesariosparamanipularesainformacin.
Lo ms importante de los objetos es que permiten tener un control total sobre 'quin' o 'qu' puede
acceder a sus miembros, es decir, los objetos pueden tener miembros pblicos a los que podrn acceder
otros objetos o miembros privados a los que slo puede acceder l. Estos miembros pueden ser tanto
variablescomofunciones.
El gran beneficio de todo esto es la encapsulacin, el cdigo fuente de un objeto puede escribirse y
mantenersedeformaindependientealosotrosobjetoscontenidosenlaaplicacin.
Qusonlasclases?
Una CLASE es un proyecto, o prototipo, que define las variables y los mtodos comunes a un cierto tipo
deobjetos.
Un poco ms sencillo: las clases son las matrices de las que luego se pueden crear mltiples objetos del
mismo tipo. La clase define las variables y los mtodos comunes a los objetos de ese tipo, pero luego,
cadaobjetotendrsuspropiosvaloresycompartirnlasmismasfunciones.
Primerodeberemoscrearunaclaseantesdepodercrearobjetosoejemplaresdeesaclase.
Qusonlosmensajes?
Para poder crear una aplicacin necesitars ms de un objeto, y estos objetos no pueden estar aislados
unosdeotros,puesbien,paracomunicarseesosobjetosseenvanmensajes.
Los mensajes son simples llamadas a las funciones o mtodos del objeto con el se quiere comunicar
paradecirlequehagacualquiercosa.
Queslaherencia?
Qu significa esto la herencia, quen hereda qu bueno tranquilo, esto slo significa que puedes crear
unaclasepartiendodeotraqueyaexista.
Es decir, puedes crear una clase a travs de una clase existente, y esta clase tendr todas las variables
ylosmtodosdesu'superclase',yademsselepodrnaadirotrasvariablesymtodospropios.
Se llama 'Superclase' a la clase de la que desciende una clase, puedes ver ms sobre la declaracin de
clasesenlapginaDeclararClases.
VariablesyTiposdeDatos
TiposdeVariables
NombresdeVariables
VariablesyTiposdeDatos
Las variables son las partes importantes de un lenguaje de programacin: ellas son las entidades
(valores,datos)queactanysobrelasqueseacta.
Unadeclaracindevariablesiemprecontienedoscomponentes,eltipodelavariableysunombre.
tipoVariablenombre
TiposdeVariables
Todas las variables en el lenguaje Java deben tener un tipo de dato. El tipo de la variable determina los
valoresquelavariablepuedecontenerylasoperacionesquesepuedenrealizarconella.
Existen dos categorias de datos principales en el lenguaje Java: los tipos primitivos y los tipos
referenciados.
Los tipos primitivos contienen un slo valor e incluyen los tipos como los enteros, coma flotante, los
caracteres, etc... La tabla siguiente muestra todos los tipos primitivos soportados por el lenguaje Java,
suformato,sutamaoyunabrevedescripcindecadauno.
Tipo Tamao/Formato Descripcin
(Nmeros
enteros)
byte 8bitcomplementoa2 EnterodeunByte
short
16bit complemento a
2
Enterocorto
int
32bit complemento a
2
Entero
long
64bit complemento a
2
Enterolargo
(Nmerosreales)
float 32bitIEEE754 Comaflotantedeprecisinsimple
double 64bitIEEE754 Comaflotantedeprecisindoble
(otrostipos)
char 16bitCaracter Unslocarcter
boolean trueofalse
Un valor booleano (verdadero o
falso)
Los tipos referenciados se llaman as porque el valor de una variable de referencia es una referencia (un
puntero) hacia el valor real. En Java tenemos los arrays, las clases y los interfaces como tipos de datos
referenciados.
NombresdeVariables
Un programa se refiere al valor de una variable por su nombre. Por convencin, en Java, los nombres de
las variables empiezan con una letra minscula (los nombres de las clases empiezan con una letra
mayscula).
UnnombredevariableJava.
1. debe ser un identificador legal de Java comprendido en una serie de caracteres Unicode. Unicode
es un sistema de codificacin que soporta texto escrito en distintos lenguajes humanos.Unicode
perminte la codificacin de 34.168 caracteres. Esto le permite utilizar en sus programas Java varios
alfabetos como el Japons, el Griego, el Ruso o el Hebreo. Esto es importante para que los
programadorespuedenescribircdigoensulenguajenativo.
2. nopuedeserelmismoqueunapalabraclaveoelnombredeunvalorbooleano(trueorfalse)
3. no deben tener el mismo nombre que otras variables cuyas declaraciones aparezcan en el mismo
mbito.
La regla nmero 3 implica que podra existir el mismo nombre en otra variable que aparezca en un
mbitodiferente.
Por convencin, los nombres de variables empiezan por un letra minscula. Si una variable est
compuesta de ms de una palabra, como 'nombreDato' las palabras se ponen juntas y cada palabra
despusdelaprimeraempiezaconunaletramayscula.

OperadoresdeJava
o OperadoresAritmticos
o OperadoresRelacionalesyCondicionales
o OperadoresdeDesplazamiento
o OperadoresdeAsignacin
OperadoresdeJava
Los operadores realizan algunas funciones en uno o dos operandos. Los operadores que requieren un
operador se llaman operadores unarios. Por ejemplo, ++ es un operador unario que incrementa el valor
suoperandoenuno.
Los operadores que requieren dos operandos se llaman operadores binarios. El operador = es un
operadorbinarioqueasignaunvalordeloperandoderechoaloperandoizquierdo.
Los operadores unarios en Java pueden utilizar la notacin de prefijo o de sufijo. La notacin de prefijo
significaqueeloperadorapareceantesdesuoperando.
operadoroperando
Lanotacindesufijosignificaqueeloperadoraparecedespusdesuoperando:
operandooperador
Todos los operadores binarios de Java tienen la misma notacin, es decir aparencen entre los dos
operandos:
op1operatorop2
Adems de realizar una operacin tambin devuelve un valor. El valor y su tipo dependen del tipo del
operador y del tipo de sus operandos. Por ejemplo, los operadores aritmticos (realizan las operaciones
de aritmtica bsica como la suma o la resta) devuelven nmeros, el resultado tpico de las operaciones
aritmtcias. El tipo de datos devuelto por los operadores aritmticos depende del tipo de sus operandos:
sisumasdosenteros,obtendrsunentero.Sedicequeunaoperacinevalasuresultado.
Es muy til dividir los operadores Java en las siguientes categoras: aritmticos, relacionales y
condicionales.lgicosydedesplazamientoydeasignacin.
OperadoresAritmticos
El lenguaje Java soporta varios operadores aritticos incluyendo + (suma), (resta), *
(multiplicacin), / (divisin), y % (mdulo) en todos los nmeros enteros y de coma flotante. Por
ejemplo,puedesutilizarestecdigoJavaparasumardosnmeros:
sumaEsto+aEsto
Oestecdigoparacalcularelrestodeunadivisin:
divideEsto%porEsto
EstatablasumarizatodaslasoperacionesaritmticasbinariasenJava.
Operado
r
Uso Descripcin
+ op1+op2 Sumaop1yop2
op1op2 Restaop2deop1
* op1*op2 Multiplicaop1yop2
/ op1/op2 Divideop1porop2
% op1%op2
Obtiene el resto de dividir op1 por
op2
Nota:EllenguajeJavaextiendeladefinicindeloperador+paraincluirlaconcatenacindecadenas.
Losoperadores+ytienenversionesunariasqueseleccionanelsignodeloperando.
Operado
Uso Descripcin
r
+ +op
Indica un valor
positivo
op Niegaeloperando
Adems, existen dos operadores de atajos aritmticos, ++ que incrementa en uno su operando, y
quedecrementaenunoelvalordesuoperando.
Operado
r
Uso Descripcin
++ op++ Incrementaopen1evalaelvalorantesdeincrementar
++ ++op
Incrementa op en 1 evala el valor despus de
incrementar
op Decrementaopen1evalaelvalorantesdedecrementar
op
Decrementa op en 1 evala el valor despus de
decrementar
OperadoresRelacionalesyCondicionales
Los valores relacionales comparan dos valores y determinan la relacin entre ellos. Por ejemplo, !=
devuelvetruesilosdosoperandossondistintos.
EstatablasumarizalosoperadoresrelacionalesdeJava.
Operado
r
Uso Devuelvetruesi
&gt op1&gtop2 op1esmayorqueop2
&gt= op1&gt=op2
op1 es mayor o igual que
op2
&lt op1&ltop2 op1esmenorqueop2
&lt= op1&lt=op2
op1 es menor o igual que
op2
== op1==op2 op1yop2soniguales
!= op1!=op2 op1yop2sondistintos
Frecuentemente los operadores relacionales se utilizan con otro juego de operadores, los operadores
condicionales, para construir expresiones de decisin ms complejas. Uno de estos operadores es &&
que realiza la operacin Y booleana . Por ejemplo puedes utilizar dos operadores relacionales diferentes
junto con && para determinar si ambas relaciones son ciertas. La siguiente lnea de cdigo utiliza esta
tcnica para determinar si un indice de un array est entre dos lmites esto es, para determinar si el
indice es mayor que 0 o menor que NUM_ENTRIES (que se ha definido prviamente como un valor
constante):
0&ltindex&&index&ltNUM_ENTRIES
Observa que en algunas situaciones, el segundo operando de un operador relacional no ser evaluado.
Consideremosestasentencia:
((count&gtNUM_ENTRIES)&&(System.in.read()!=1))
Si count es menor que NUM_ENTRIES, la parte izquierda del operando de && evala a false. El operador
&& slo devuelve true si los dos operandos son verdaderos. Por eso, en esta situacin se puede
deteminar el valor de && sin evaluar el operador de la derecha. En un caso como este, Java no evala
el operando de la derecha. As no se llamar a System.in.read() y no se leer un carcter de la entrada
estandard.
Aqutienestresoperadorescondicionales.
Operado
r
Uso Devuelvetruesi
&& op1&&op2 op1yop2sonverdaderos
|| op1||op2
uno de los dos es
verdadero
! !op opesfalso
El operador & se puede utilizar como un sinnimo de && si ambos operadores son booleanos.
Similarmente,|esunsinonimode||siambosoperandossonbooleanos.
OperadoresdeDesplazamiento
Los operadores de desplazamiento permiten realizar una manipualcin de los bits de los datos. Esta
tablasumarizalosoperadoreslgicosydedesplazamientodisponiblesenellenguajeJava.
Operador Uso Descripcin
&gt&gt op1&gt&gtop2 desplazaaladerechaop2bitsdeop1
&lt&lt op1&lt&ltop2 desplazaalaizquierdaop2bitsdeop1
&gt&gt&gt op1&gt&gt&gtop2
desplaza a la derecha op2 bits de op1(sin
signo)
& op1&op2 bitwiseand
| op1|op2 bitwiseor
^ op1^op2 bitwisexor
~ ~op bitwisecomplemento
Los tres operadores de desplazamiento simplemente desplazan los bits del operando de la izquierda el
nmero de posiciones indicadas por el operador de la derecha. Los desplazamientos ocurren en la
direccinindicadaporelpropiooperador.Porejemplo:
13&gt&gt1
desplaza los bits del entero 13 una posicin a la derecha. La representacin binaria del nmero 13 es
1101. El resultado de la operacin de desplazamiento es 110 o el 6 decimal. Observe que el bit situado
ms a la derecha desaparece. Un desplazamiento a la derecha de un bit es equivalente, pero ms
eficiente que, dividir el operando de la izquierda por dos. Un desplazamiento a la izquierda es
equivalenteamultiplicarpordos.
Los otros operadores realizan las funciones lgicas para cada uno de los pares de bits de cada
operando.Lafuncin"y"activaelbitresultantesilosdosoperandosson1.
op1 op2
resultad
o
0 0 0
0 1 0
1 0 0
1 1 1
Suponquequieresevaluarlosvalores12"and"13:
12&13
El resultado de esta operacin es 12. Por qu? Bien, la representacin binaria de 12 es 1100 y la de 13
es 1101. La funcin "and" activa los bits resultantes cuando los bits de los dos operandos son 1, de otra
forma el resultado es 0. Entonces si colocas en lnea los dos operandos y realizas la funcin "and",
puedes ver que los dos bits de mayor peso (los dos bits situados ms a la izquierda de cada nmero)
son 1 as el bit resultante de cada uno es 1. Los dos bits de menor peso se evalan a 0 poque al menos
unodelosdosoperandoses0:
1101
& 1100

1100
El operador | realiza la operacin O inclusiva y el operador ^ realiza la operacin O exclusiva. O
inclusivasignificaquesiunodelosdosoperandoses1elresultadoes1.
op1 op2
resultad
o
0 0 0
0 1 1
1 0 1
1 1 1
O exclusiva significa que si los dos operandos son diferentes el resultado es 1, de otra forma el
resultadoes0.
op1 op2
resultad
o
0 0 0
0 1 1
1 0 1
1 1 0
Y finalmente el operador complemento invierte el valor de cada uno de los bites del operando: si el bit
deloperandoes1elresultadoes0ysielbitdeloperandoes0elresultadoes1.
OperadoresdeAsignacin
Puedes utilizar el operador de asignacin =, para asignar un valor a otro. Adems del operador de
asignacin bsico, Java proporciona varios operadores de asignacin que permiten realizar operaciones
aritmtcias, lgicas o de bits y una operacin de asignacin al mismo tiempo. Especificamente, supon
que quieres a&ntildeadir un nmero a una variable y asignar el resultado dentro de la misma variable,
comoesto:
i=i+2
Puedesordenarestasentenciautilizandoeloperador+=.
i+=2
Lasdoslneasdecdigoanterioressonequivalentes.
Estatablalistalosoperadoresdeasignacinysusequivalentes.
Operador Uso Equivalea
+= op1+=op2 op1=op1+op2
= op1=op2 op1=op1op2
*= op1*=op2 op1=op1*op2
/= op1/=op2 op1=op1/op2
%= op1%=op2 op1=op1%op2
&= op1&=op2 op1=op1&op2
|= op1|=op2 op1=op1|op2
^= op1^=op2 op1=op1^op2
&lt&lt= op1&lt&lt=op2 op1=op1&lt&ltop2
&gt&gt= op1&gt&gt=op2 op1=op1&gt&gtop2
&gt&gt&gt= op1&gt&gt&gt=op2 op1=op1&gt&gt&gtop2
ExpresionesJava
o DefiniciondeExpresin
o PrecedenciadeOperadoresenJava
ExpresionesJava
DefiniciondeExpresin
Las expresiones realizan el trabajo de un programa Java. Entre otras cosas, las expresiones se utilizan
para calcular y asignar valores a las variables y para controlar el flujo de un programa Java. El trabajo de
una expresin se divide en dos partes: realizar los clculos indicados por los elementos de la expresin
ydevolveralgnvalor.
Definicin:Una expresin es una serie de variables, operadores y llamadas a mtodos (construida de
acuerdoalasintaxisdellenguaje)queevalaaunvalorsencillo.
El tipo del dato devuelto por una expresin depende de los elementos utilizados en la expresin. La
expresincount++devuelve un entero porque++devuelve un valor del mismo tipo que su operando
ycountesunentero.Otrasexpresionesdevuelvenvaloresbooleanos,cadenas,etc...
Una expresin de llamada a un mtodo devuelve el valor del mtodo as el tipo de dato de una
expresin de llamada a un mtodo es el mismo tipo de dato que el valor de retorno del mtodo. El
mtodoSystem.in.read()se ha declarado como un entero, por lo tanto, la
expresinSystem.in.read()devuelveunentero.
LasegundaexpresincontenidaenlasentenciaSystem.in.read()!=1utilizaeloperador!=.
Recuerda que este operador comprueba si los dos operandos son distintos. En esta sentencia los
operandossonSystem.in.read()y1.
System.in.read()es un operando vlido para!=porque devuelve un entero. AsSystem.in.read()
!=1comparadosenteros,elvalordevueltoporSystem.in.read()y1.
Elvalordevueltopor!=estrueofalsedependiendodelasalidadelacomparacin.
Como has podido ver, Java te permite construir expresiones compuestas y sentencias a partir de varias
expresiones pequeas siempre que los tipos de datos requeridos por una parte de la expresin
correspondanconlostiposdedatosdelaotra.
Tamben habrs podido concluir del ejemplo anterior, el orden en que se evalan los componentes de
unaexpresincompuesta.
Porejemplo,tomalasiguienteexpresincompuesta.
x*y*z
En este ejemplo particular, no importa el orden en que se evale la expresin porque el resultado de la
multiplicacin es independiente del orden. La salida es siempre la misma sin importar el orden en que
se apliquen las multiplicaciones. Sin embargo, esto no es cierto para todas las expresiones. Por ejemplo,
estaexpresinobtieneunresultadodiferentedependiendodesiserealizaprimerolasumaoladivisin.
x+y/100
Puedes decirle directamente al compilador de Java cmo quieres que se evale una expresin utilizando
losparntesis(y).
Porejemplo,paraaclararlasentenciaanterior,sepodraescribir:(x+y)/100.
Si no le dices explcitamente al compilador el orden en el que quieres que se realicen las operaciones, l
decide basndose en laprecedenciaasignada a los operadores y otros elementos que se utilizan
dentrodeunaexpresin.
Los operadores con una precedencia ms alta se evalan primero. Por ejemplo. el operador divisin tiene
una precedencia mayor que el operador suma, por eso, en la expresin anteriorx + y / 100, el
compiladorevaluarprimeroy/100.As
x+y/100
esequivalentea.
x+(y/100)
Para hacer que tu cdigo sea ms fcil de leer y de mantener deberas explicar e indicar con partesis
losoperadoresquesedebenevaluarprimero.
La tabla siguiente muestra la precedencia asignada a los operadores de Java. Los operadores se han
listado por orden de precedencia de mayor a menor. Los operadores con mayor precedencia se evalan
antes que los operadores con un precedencia relativamente menor. Lo operadores con la misma
precedenciaseevalandeizquierdaaderecha.
PrecedenciadeOperadoresenJava
operadoressufijo [].(params)expr++expr
operadoresunarios ++exprexpr+exprexpr~!
creacinotipo new(type)expr
multiplicadores */%
suma/resta +
desplazamiento <<>>>>>
relacionales <><=>=instanceof
igualdad ==!=
bitwiseAND &
bitwise exclusive
OR
^
bitwiseinclusiveOR |
ANDlgico &&
ORlgico ||
condicional ?:
asignacin
= += = *= /= %= ^= &= |= <<= >>=
>>>=
SentenciasdeControldeFlujoenJava
o Lasentenciaifelse
o Lasentenciaswitch
o SentenciasdeBucle
o SentenciasdeManejodeExcepciones
o SentenciasdeRuptura
SentenciasdeControldeFlujoenJava
Las sentencias de control de flujo determinan el orden en que se ejecutarn las otras sentencias dentro
delprograma.EllenguajeJavasoportavariassentenciasdecontroldeflujo,incluyendo.
Sentencias palabrasclave
toma de
decisiones
ifelse,switchcase
bucles for,while,dowhile
excepciones trycatchfinally,throw
miscelaneas
break, continue, label:,
return
Nota:Aunquegotoes una palabra reservada, actualmente el lenguaje Java no la soporta. Podemos
utilizarlasrupturasetiquetadasensulugar.
Lasentenciaifelse
La sentenciaifelsede java proporciona a los programas la posibilidad de ejecutar selectivamente
otrassentenciasbasndoseenalgncriterio.
Por ejemplo, supon que tu programa imprime informacin de depurado basndose en el valor de una
variable booleana llamada DEBUG. Si DEBUG fuera verdaderatrue, el programa imprimira la
informacin de depurado, como por ejemplo, el valor de una variable comox. Si DEBUG esfalseel
programa proceder normalmente. Un segmento de cdigo que implemente esto se podra parecer a
este.
...
if(DEBUG)
System.out.println("DEBUG:x="+x)
...
Esta es la versin ms sencilla de la sentenciaif: la sentencia gobernada porifse ejecuta si alguna
codicinesverdadera.Generalmente,laformasencilladeifsepuedeescribiras.
if(expresin)
sentencia
Pero, y si quieres ejecutar un juego diferente de sentencias si la expresin es falsa? Bien, puedes
utilizar la sentenciaelse. Echemos un vistazo a otro ejemplo. Supon que tu programa necesita realizar
diferentes acciones dependiendo de que el usuario pulse el botn OK o el botn Cancel en un ventana
dealarma.Sepodrahacerestoutilizandounasentenciaif.
...
//Respuestadependientedelbotonquehayapulsadoelusuario
//OKoCancel
...
if(respuesta==OK){
...
//CdigoparalaaccinOK
...
}else{
...
//cdigoparalaaccinCancel
...
}
Esteusoparticulardelasentenciaelseeslaformadecapturarlotodo.
Existe otra forma de la senteciaelse,else ifque ejecuta una sentencia basada en otra expresin. Por
ejemplo, supon que has escrito un programa que asigna notas basadas en la puntuacin de un examen,
un Sobresaliente para una puntuacin del 90% o superior, un Notable para el 80% o superior y dems.
odras utilizar una sentenciaifcon una serie de comparacioneselse ify una setenciaelsepara
escribirestecdigo.
intpuntuacion
Stringnota
if(puntuacion>=90){
nota="Sobresaliente"
}elseif(puntuacion>=80){
nota="Notable"
}elseif(puntuacion>=70){
nota="Bien"
}elseif(puntuacion>=60){
nota="Suficiente"
}else{
nota="Insuficiente"
}
Unasentenciaifpuedetenercualquiernmerodesentenciasdeacompaamientoelseif.
Podras haber observado que algunos valores depuntuacionpueden satisfacer ms una de las
expresiones que componen la sentenciaif. Por ejemplo, una puntuacin de 76 podra evaluarse como
trueparadosexpresionesdeestasentencia:puntuacion>=70ypuntuacion>=60.
Sin embargo, en el momento de ejecucin, el sistema procesa una sentenciaifcompuesta como una
sla una vez que se ha satisfecho una condicin (76 >= 70), se ejecuta la sentencia apropiada (nota
="Bien"),yelcontrolsalefueradelasentenciaifsinevaluarlascondicionesrestantes.
Lasentenciaswitch
La sentenciaswitchse utiliza para realizar sentencias condicionalmente basadas en alguna expresin.
Por ejemplo, supon que tu programa contiene un entero llamadomescuyo valor indica el mes en
alguna fecha. Supon que tambin quieres mostrar el nombre del mes basndose en su nmero entero
equivalente.PodrasutilizarlasentenciaswitchdeJavapararealizarestatarea.
intmes
...
switch(mes){
case1:System.out.println("Enero")break
case2:System.out.println("Febrero")break
case3:System.out.println("Marzo")break
case4:System.out.println("Abril")break
case5:System.out.println("May0")break
case6:System.out.println("Junio")break
case7:System.out.println("Julio")break
case8:System.out.println("Agosto")break
case9:System.out.println("Septiembre")break
case10:System.out.println("Octubre")break
case11:System.out.println("Noviembre")break
case12:System.out.println("Diciembre")break
}
La sentenciaswitchevala su expresin, en este caso el valor demes, y ejecuta la
sentenciacaseapropiada.
Decidir cuando utilizar las sentenciasifoswitchdependen del juicio personal. Puedes decidir cual
utilizarbasndoseenlabuenalecturadelcdigooenotrosfactores.
Cada sentenciacasedebe ser nica y el valor proporcionado a cada sentenciacasedebe ser del
mismotipoqueeltipodedatodevueltoporlaexpresinproporcionadaalasentenciaswitch.
Otropuntodeinteresenlasentenciaswitchsonlassentenciasbreakdespusdecadacase.
Lasentenciabreakhacequeelcontrolsalgadelasentenciaswitchycontineconlasiguientelnea.
La sentenciabreakes necesaria porque las sentenciascasese siguen ejecutando hacia abajo. Esto
es, sin unbreakexplcito, el flujo de control seguira secuencialmente a travs de las
sentenciascasesiguientes.
En el ejemplo anterior, no se quiere que el flujo vaya de una sentenciacasea otra, por eso se han
tenidoqueponerlassentenciasbreak.
Sin embargo, hay ciertos escenario en los que querrs que el control proceda secuencialmente a travs
de las sentenciascase. Como este cdigo que calcula el nmero de das de un mes de acuerdo con el
ritmicorefrnquedice"TreintadiastieneSeptiembre...".
intmes
intnumeroDias
...
switch(mes){
case1.
case3.
case5.
case7.
case8.
case10.
case12.
numeroDias=31
break
case4.
case6.
case9.
case11.
numeroDias=30
break
case2.
if(((ano%4==0)&&!(ano%100==0))||ano%400==0))
numeroDias=29
else
numeroDias=28
break
}
Finalmente, puede utilizar la sentenciadefaultal final de la sentenciaswitchpara manejar los
valoresquenosehanmanejadoexplcitamenteporunadelassentenciascase.
intmes
...
switch(mes){
case1:System.out.println("Enero")break
case2:System.out.println("Febrero")break
case3:System.out.println("Marzo")break
case4:System.out.println("Abril")break
case5:System.out.println("Mayo")break
case6:System.out.println("Junio")break
case7:System.out.println("Julio")break
case8:System.out.println("Agosto")break
case9:System.out.println("Septiembre")break
case10:System.out.println("Octubre")break
case11:System.out.println("Noviembre")break
case12:System.out.println("Diciembre")break
default:System.out.println("Ee,noesunmesvlido!")
break
}
SentenciasdeBucle
Generalmente hablando, una sentenciawhilerealiza una accinmientrasse cumpla una cierta
condicin.Lasintaxisgeneraldelasentenciawhilees.
while(expresin)
sentencia
Estoes,mientraslaexpresinseaverdadera,ejecutarlasentencia.
sentencia puede ser una sla sentencia o puede ser un bloque de sentencias. Un bloque de sentencias
esunjuegodesentenciaslegalesdejavacontenidasdentrodecorchetes('{'y'}').
Por ejemplo, supon que adems de incrementarcontadordentro de un buclewhiletambin quieres
imprimirelcontadorcadavezqueseleauncarcter.Podrasescribirestoensulugar.
...
while(System.in.read()!=1){
contador++
System.out.println("Sehaleidounelcarcter="+contador)
}
...
Por convencin el corchete abierto '{' se coloca al final de la misma lnea donde se encuentra la
sentenciawhiley el corchete cerrado '}' empieza una nueva lnea indentada a la lnea en la que se
encuentraelwhile.
AdemsdewhileJavatieneotrosdosconstructoresdebuclesquepuedesutilizarentusprogramas.
elbucleforyelbucledowhile.
Primero el buclefor. Puedes utilizar este bucle cuando conozcas los lmites del bucle (su instruccin de
inicializacin, su criterio de terminacin y su instruccin de incremento). Por ejemplo, el bucleforse
utilizafrecuentementeparaiterarsobreloselementosdeunarray,oloscaracteresdeunacadena.
//aesunarraydecualquiertipo
...
inti
intlength=a.length
for(i=0i<lengthi++){
...
//hacealgoenelelementoidelarraya
...
}
Si sabes cuando estas escribiendo el programa que quieres empezar en el inicio del array, parar al final
y utilizar cada uno de los elementos. Entonces la sentenciafores una buena eleccin. La forma
generaldelbucleforpuedeexpresarseasi.
for(inicializacinterminacinincremento)
sentencias
inicializacineslasentenciaqueinicializaelbucleseejecutaunavezaliniciarelbucle.
terminacin es una sentecia que determina cuando se termina el bucle. Esta expresin se evala al
principiodecadaiteraccinenelbucle.Cuandolaexpreinseevalaafalseelbuclesetermina.
Finalmente, incremento es una expresin que se invoca en cada interaccin del bucle. Cualquiera (o
todos)deestoscomponentespudenserunasentenciavaca(unpuntoycoma).
Java proporciona otro bucle, el bucledowhile,que es similar al buclewhileque se vi al principio,
exceptoenquelaexpresinseavalalfinaldelbucle.
do{
sentencias
}while(ExpresinBooleana)
La sentenciadowhilese usa muy poco en la construccin de bucles pero tiene sus usos. Por ejemplo,
es conveniente utilizar la sentenciadowhilecuando el bucle debe ejecutarse al menos una vez. Por
ejemplo,paraleerinformacindeunfichero,sabemosquealmenosdebeleeruncarcter.
intc
InputStreamin
...
do{
c=in.read()
...
}while(c!=1)
SentenciasdeManejodeExcepciones
Cuando ocurre un error dentro de un mtodo Java, el mtodo puede lanzar una excepcin para indicar a
sullamadorquehaocurridounerroryqueelerrorestutilizandolasentenciathrow.
El mtodo llamador puede utilizar las sentenciastry,catch, yfinallypara capturar y manejar la
excepcin.
Puedes verManejar Errores Utilizando Excepcionespara obtener ms informacin sobre el
lanzamientoymanejodeexcepciones.
SentenciasdeRuptura
Ya has visto la sentenciabreaken accin dentro de la sentenciaswitchanteriormente. Como se
observ anteriormente, la sentenciabreakhace que el control del flujo salte a la sentencia siguiente a
laactual.
Hayotraformadebreakquehacequeelflujodecontrolsalteaunasentenciaetiquetada.
Se puede etiquetar una sentencia utilizando un identificador legal de Java (la etiqueta) seguido por dos
puntos(:)antesdelasentencia.
SaltaAqui:algunaSentenciaJava
Parasaltaralasentenciaetiquetadautiliceestaformadelasentenciabreak.
breakSaltaAqui
Las rupturas etiquetadas son una alternativa a la sentenciagotoque no est soportada por el lenguaje
Java.
Se puede utiliza la sentenciacontinuedentro de un bucle para saltar de la sentencia actual hacia el
principiodelbucleoaunasentenciaetiquetada.
Considera esta implementacin del mtodoindexOf()de la clase String que utiliza la forma
decontinuequecontinaenunasentenciaetiquetada.
publicintindexOf(Stringstr,intfromIndex){
char[]v1=value
char[]v2=str.value
intmax=offset+(countstr.count)
test.
for(inti=offset+((fromIndex<0)?0:fromIndex)i<=maxi++){
intn=str.count
intj=i
intk=str.offset
while(n!=0){
if(v1[j++]!=v2[k++]){
continuetest
}
}
returnioffset
}
return1
}
Nota:Slosepuedellamaralasentenciacontinuedesdedentrodeunbucle.
Yfinalmentelasentenciareturn.
Esta sentencia se utiliza para salir del mtodo actual y volver a la sentencia siguiente a la que origin la
llamadaenelmtodooriginal.
Existendosformasdereturn:unaquedevuelveunvaloryotraquenolohace.
Para devolver un valor, simplemente se pone el valor (o una expresin que calcule el valor) detrs de la
palabrareturn.
return++count
El valor devuelto porreturndebe corresponder con el tipo del valor de retorno de la declaracin del
mtodo.
Cuandounmtodosedeclaracomovoidutilizalaformadereturnquenodevuelveningnvalor.
return
ArraysyCadenasenJava
o Arrays
o Strings
o ConcatenacindeCadenas
ArraysyCadenasenJava
Al igual que otros lenguajes de programacin, Java permite juntar y manejar mltiples valores a travs
de un objeto array (matriz). Tambin se pueden manejar datos compuestos de mltiples caracteres
utilizandoelobjetoString(cadena).
Arrays
EstaseccinteenseartodoloquenecesitasparacrearyutilizararraysentusprogramasJava.
Como otras variables, antes de poder utilizar un array primero se debe declarar. De nuevo, al igual que
otras variables, la declaracin de un array tiene dos componentes primarios: el tipo del array y su
nombre. Un tipo de array incluye el tipo de dato de los elementos que va contener el array. Por ejemplo,
el tipo de dato para un array que slo va a contener elementos enteros es un array de enteros. No
puede existir un array de tipo de datos genrico en el que el tipo de sus elementos est indefinido
cuandosedeclaraelarray.Aqutienesladeclaracindeunarraydeenteros.
int[]arrayDeEnteros
La parteint[]de la declaracin indica quearrayDeEnteroses un array de enteros. La declaracin
noasignaningunamemoriaparacontenerloselementosdelarray.
Si se intenta asignar un valor o acceder a cualquier elemento dearrayDeEnterosantes de haber
asignadolamemoriaparal,elcompiladordarunerrorcomoesteynocompilarelprograma.
testing.java:64:Variablearraydeenterosmaynothavebeeninitialized.
Para asignar memoria a los elementos de un array, primero se debe ejemplarizar el array. Se puede
hacer esto utilizando el operadornewde Java. (Realmente, los pasos que se deben seguir para crear
un array son similares a los se deben seguir para crear un objeto de una clase: declaracin,
ejemplarizacineinicializacin.
La siguiente sentencia asigna la suficiente memoria para quearrayDeEnterospueda contener diez
enteros.
int[]arraydeenteros=newint[10]
En general, cuando se crea un array, se utiliza el operadornew, ms el tipo de dato de los elementos
delarray,mselnmerodeelementosdeseadosencerradoentrecochetescuadrados('['y']').
TipodeElemento[]NombredeArray=newTipodeElementos[tamanoArray]
Ahora que se ha asignado memoria para un array ya se pueden asignar valores a los elemetos y
recuperaresosvalores.
for(intj=0j<arrayDeEnteros.lengthj++){
arrayDeEnteros[j]=j
System.out.println("[j]="+arrayDeEnteros[j])
}
Como se puede ver en el ejemplo anterior, para referirse a un elemento del array, se aade corchetes
cuadrados al nombre del array. Entre los corchetes caudrados se indica (bien con una variable o con una
expresin) el ndice del elemento al que se quiere acceder. Observa que en Java, el ndice del array
empiezaen0yterminaenlalongituddelarraymenosuno.
Hay otro elemento interesante en el pequeo ejemplo anterior. El bucleforitera sobre cada elemento
dearrayDeEnterosasignndole valores e imprimiendo esos valores. Observa el uso
dearrayDeEnteros.lengthpara obtener el tamao real del array.lengthes una propiedad
proporcionadaparatodoslosarraysdeJava.
Los arrays pueden contener cualquier tipo de dato legal en Java incluyendo los tipos de referencia como
son los objetos u otros array. Por ejemplo, el siguiente ejemplo declara un array que puede contener
diezobjetosString.
String[]arrayDeStrings=newString[10]
Los elementos en este array son del tipo referencia, esto es, cada elemento contiene una referencia a
un objeto String. En este punto, se ha asignado suficiente memoria para contener las referencias a los
Strings, pero no se ha asignado memoria para los propios strings. Si se intenta acceder a uno de los
elementos dearraydeStringsobtendr una excepcin 'NullPointerException' porque el array est vacio
y no contiene ni cadenas ni objetos String. Se debe asignar memoria de forma separada para los objetos
String.
for(inti=0i<arraydeStrings.lengthi++){
arraydeStrings[i]=newString("Hello"+i)
}
Strings
Una secuencia de datos del tipo carcter se llama un string (cadena) y en el entorno Java est
implementadaporlaclaseString(unmiembrodelpaquetejava.lang).
String[]args
Este cdigo declara explcitamente un array, llamadoargs, que contiene objetos del tipo String. Los
corchetes vacios indican que la longitud del array no se conoce en el momento de la compilacin,
porqueelarraysepasaenelmomentodelaejecucin.
ElsegundousodeStringeselusodecadenasliterales(unacadenadecaracteresentrecomillas"y").
"Holamundo!"
ElcompiladorasignaimplicitamenteespacioparaunobjetoStringcuandoencuentraunacadenaliteral.
LosobjetosStringsoninmutablesesdecir,nosepuedenmodificarunavezquehansidocreados.
El paquete java.lang proporciona una clase diferente, StringBuffer, que se podr utilizar para crear y
manipularcaracteresalvuelo.
ConcatenacindeCadenas
Java permite concatenar cadenas facilmente utilizando el operador+. El siguiente fragmento de cdigo
concatenatrescadenasparaproducirsusalida.
"Laentradatiene"+contador+"caracteres."
Dos de las cadenas concatenadas son cadenas literales: "La entrada tiene" y "caracteres.". La
tercera cadena la del medio es realmente un entero que primero se convierte a cadena y luego se
concatenaconlasotras.

CrearObjetosenJava
o DeclararunObjeto
o EjemplarizarunaClase
o InicializarunObjeto
CrearObjetosenJava
En Java, se crea un objeto mediante la creacin de un objeto de una clase o, en otras palabras,
ejemplarizandounaclase.AprenderscmocrearunaclasemsadelanteenCrearClases.
Hasta entonces, los ejemplos contenidos aqu crean objetos a apartir de clases que ya existen en el
entornoJava.
Frecuentemente,severlacreacindeunobjetoJavaconunsentenciacomoesta.
Datehoy=newDate()
Esta sentencia crea un objeto Date (Date es una clase del paquete java,util). Esta sentencia realmente
realizatresacciones:declaracin,ejemplarizacineinicializacin.
Date hoyes una declaracin de variable que slo le dice al compilador que el nombrehoyse va a
utilizar para referirse a un objeto cuyo tipo es Date, el operadornewejemplariza la clase Date (creando
unnuevoobjetoDate),yDate()inicializaelobjeto.
DeclararunObjeto
Ya que la declaracin de un objeto es una parte innecesaria de la creacin de un objeto, las
declaraciones aparecen frecuentemente en la misma lnea que la creacin del objeto. Como cualquier
otradeclaracindevariable,lasdeclaracionesdeobjetospuedenaparecersolitariascomoesta.
Datehoy
De la misma forma, declarar una variable para contener un objeto es exactamente igual que declarar
unavariablequevaaconteneruntipoprimitivo.
tiponombre
donde tipo es el tipo de dato del objeto y nombre es el nombre que va a utilizar el objeto. En Java, las
clases e interfaces son como tipos de datos. Entonces tipo puede ser el nombre de una clase o de un
interface.
Las declaraciones notifican al compilador que se va a utilizar nombre para referirse a una variable cuyo
tipo es tipo.Las declaraciones no crean nuevos objetos.Date hoyno crea un objeto Date,
slo crea un nombre de variable para contener un objeto Date. Para ejemplarizar la clase Date, o
cualquierotraclase,seutilizaeloperadornew.
EjemplarizarunaClase
El operadornewejemplariza una clase mediante la asignacin de memoria para el objeto nuevo de
ese tipo.newnecesita un slo argumento: una llamada al mtodo constructor. Los mtodos
constructores son mtodos especiales proporcionados por cada clase Java que son reponsables de la
inicializacin de los nuevos objetos de ese tipo. El operadornewcrea el objeto, el constructor lo
inicializa.
Aqu tienes un ejemplo del uso del operadornewpara crear un objeto Rectangle (Rectangle es una
clasedelpaquetejava.awt).
newRectangle(0,0,100,200)
Enelejemplo,Rectangle(0,0,100,200)esunallamadaalconstructordelaclaseRectangle.
El operadornewdevuelve una referencia al objeto recien creado. Esta referencia puede ser asignada a
unavariabledeltipoapropiado.
Rectanglerect=newRectangle(0,0,100,200)
(Recuerda que una clase esencialmente define un tipo de dato de referencia. Por eso, Rectangle puede
utilizarse como un tipo de dato en los programas Java. El valor de cualquier variable cuyo tipo sea un
tipo de referencia, es una referencia (un puntero) al valor real o conjunto de valores representado por la
variable.
InicializarunObjeto
Como mencion anteriormente, las clases porporcionan mtodos constructores para incializar los
nuevos objetos de ese tipo. Una clase podra proporcionar mltiples constructores para realizar diferentes
tiposdeinicializacinenlosnuevosobjetos.
Cuando veas la implementacin de una clase, reconocers los constructores porque tienen el mismo
nombre que la clase y no tienen tipo de retorno. Recuerda la creacin del objeto Date en el seccin
inicial.Elconstructorutilizadonotenaningnargumento.
Date()
Un constructor que no tiene ningn argumento, como el mostrado arriba, es conocido como constructor
por defecto. Al igual que Date, la mayora de las clases tienen al menos un constructor, el constructor
pordefecto.
Si una clase tiene varios constructores, todos ellos tienen el mismo nombre pero se deben diferenciar en
el nmero o el tipo de sus argumentos. Cada constructor inicializa el nuevo objeto de una forma
diferente. Junto al constructor por defecto, la clase Date proporciona otro constructor que inicializa el
nuevoobjetoconunnuevoao,mesyda.
Datecumpleaos=newDate(1963,8,30)
Elcompiladorpuedediferenciarlosconstructoresatravsdeltipoydelnmerodesusargumentos.

roduciendounpuntoenelmedio('.').
objetoReferenciado.variable
Supn que tienes un rectngulo llamadorecten tu programa. puedes acceder a las
variablesxeyconrect.xyrect.y,respectivamente.
Ahora que ya tienes un nombre para las variables derect, puedes utilizar ese nombre en sentencias y
expresiones Java como si fueran nombres de variables "normales". As, para mover el rectngulo a una
nuevaposicinpodrasescribir.
rect.x=15//cambialaposicinx
rect.y=37//cambialaposiciny
La clase Rectangle tiene otras dos variableswidthyheightque son accesibles para objetos fuera
de Rectangle. Se puede utilizar la misma notacin con ellas:rect.widthyrect.height. Entonces se
puedecalcularelreadelrectnguloutilizandoestasentencia.
area=rect.height*rect.width
Cuando se accede a una variable a travs de un objeto, se est refiriendo a las variables de un objeto
particular. Sicubofuera tambin un rectngulo con una altura y anchura diferentes derect, esta
instruccin.
area=cubo.height*cubo.width
calcula el rea de un rectngulo llamadocuboy dar un resultado diferente que la instruccin anterior
(quecalculabaelreadeunrectngulollamadorect).
Observa que la primera parte del nombre de una variable de un objeto
(elobjetoReferenciadoenobjetoReferenciado.variable) debe ser una referencia a un objeto.
Como se puede utilizar un nombre de variable aqu, tambin se puede utilizar en cualquier expresin
que devuelva una referencia a un objeto. Recuerda que el operadornewdevuelve una referencia a un
objeto. Por eso, se puede utilizar el valor devuelto pornewpara acceder a las variables del nuevo
objeto.
height=newRectangle().height
LlamaraMtodosdeunObjeto
Llamar a un mtodo de un objeto es similar a obtener una variable del objeto. Para llamar a un mtodo
del objeto, simplemente se aade al nombre del objeto referenciado el nombre del mtodo, separados
por un punto ('.'), y se proporcionan los argumentos del mtodo entre parntesis. Si el mtodo no
necesitaargumentos,seutilizanlosparntesisvacios.
objetoReferenciado.nombreMtodo(listaArgumentos)
o
objetoReferenciado.nombreMtodo()
Veamos que significa esto en trminos de movimiento del rectngulo. Para moverrecta una nueva
posicinutilizandoelmtodomove()escribeesto.
rect.move(15,37)
Esta sentencia Java llama al mtodomove()derectcon dos parmetros enteros, 15 y 37. Esta
sentencia tiene el efecto de mover el objetorectigual que se hizo en las sentencias anteriores en las
quesemoficabandirectamentelosvaloresxeydelobjeto.
rect.x=15
rect.y=37
Sisequieremoverunrectngulodiferente,unollamadocubo,lanuevaposicinsepodraescribir.
cubo.move(244,47)
Como se ha visto en estos ejemplos, las llamadas a mtodos se hacen directamente a un objeto
especficoelobjetoespecificadoenlallamadaalmtodoeselquerespondealainstruccin.
Lasllamadasamtodostambinseconocencomomensajes.
Comoenlavidareal,losmensajessedebendirigiraunreceptorparticular.
Sepuedenobtenerdistintosresultadosdependiendodelreceptordesumensaje.
En el ejemplo anterior, se ha enviado el mensajemove()al objeto llamadorectpara que ste mueva
suposicin.
Cuando se enva el mensajemove()al objeto llamadocubo, el que se mueve escubo. Son
resultadosmuydistintos.
Una llamada a un mtodo es una expresin (puedes verExpresionespara ms informacin) y evala a
algnvalor.Elvalordeunallamadaaunmtodoessuvalorderetorno,sitienealguno.
Normalmente se asignar el valor de retorno de un mtodo a una variable o se utilizar la llamada al
mtododentrodelmbitodeotraexpresinosentencia.
El mtodomove()no devuelve ningn valor (est declarado comovoid). Sin embargo, el
mtodoinside()de Rectangle si lo hace. Este mtodo toma dos coordendas x e y, y devueltetruesi
estepuntoestdentrodelrectngulo.
Se puede utilizar el mtodoinside()para hacer algo especial en algn punto, como decir la posicin
delratncuandoestdentrodelrectangulo.
if(rect.inside(mouse.x,mouse.y)){
...
//ratndentrodelrectngulo
...
}else{
...
//ratnfueradelrectngulo
...
}
Recuerda que una llamada a un mtodo es un mensaje al objeto nombrado. En este caso, el objeto
nombradoesrect.Entonces.
rect.inside(mouse.x,mouse.y)
le pregunta arectsi la posicin del cursor del ratn se encuentra entre las
coordenadasmouse.xymouse.y. Se podra obtener una respuesta diferente si enva el mismo
mensajeacubo.
Como se explic anteriormente, elobjetoReferenciadoen la llamada al
mtodoobjetoReferenciado.metodo()debe ser una referencia a un objeto. Como se puede
utilizar un nombre de variable aqu, tambin se puede utilizar en cualquier expresin que devuelva una
referencia a un objeto. Recuerda que el operadornewdevuelve una referencia a un objeto. Por eso, se
puedeutilizarelvalordevueltopornewparaaccederalasvariablesdelnuevoobjeto.
newRectangle(0,0,100,50).equals(anotherRect)
La expresinnew Rectangle(0, 0, 100, 50)evala a una referencia a un objeto que se refiere a un
objetoRectangle.
Entonces, como vers, se puede utilizar la notacin de punto ('.') para llamar al mtodoequals()del
nuevo objeto Rectangle para determinar si el rectanglo nuevo es igual al especificado en la lista de
argumentosdeequals().


EliminarObjetosJava
o RecolectordeBasura
o Finalizacin
EliminarObjetosJava
Muchos otros lenguajes orientados a objetos necesitan que se siga la pista de los objetos que se han
creado y luego se destruyan cuando no se necesiten. Escribir cdigo para manejar la memoria de esta
esformaesaburridoypropensoaerrores.
Java permite ahorrarse esto, permitindo crear tantos objetos como se quiera (slo limitados por los
que el sistema pueda manejar) pero nunca tienen que ser destruidos. El entorno de ejecucin Java
borra los objetos cuando determina que no se van autilizar ms. Este proceso es conocido como
recoleccindebasura.
Un objeto es elegible para la recoleccin de basura cuando no existen ms referencias a ese objeto. Las
referencias que se mantienen en una variable desaparecen de forma natural cuando la variable sale de
su mbito. O cuando se borra explcitamente un objeto referencia mediante la seleccin de un valor
cuyotipodedatoesunareferenciaanull.
RecolectordeBasura
El entorno de ejecucin de Java tiene un recolector de basura que peridicamente libera la memoria
ocupadaporlosobjetosquenosevananecesitarms.
El recolector de basura de Java es un barredor de marcas que escanea dinmicamente la memoria de
Java buscando objetos, marcando aquellos que han sido referenciados. Despus de investigar todos los
posibles paths de los objetos, los que no estn marcados (esto es, no han sido referenciados) se les
conocecomobasuraysoneliminados.
El colector de basura funciona en un thread (hilo) de baja prioridad y funciona tanto sncrona como
asncronamente dependiendo de la situacin y del sistema en el que se est ejecutando el entorno
Java.
El recolector de basura se ejecuta sncronamente cuando el sistema funciona fuera de memoria o en
respuesta a una peticin de un programa Java. Un programa Java le puede pedir al recolector de basura
queseejecuteencualquiermomentomedianteunallamadaaSystem.gc().
Nota:Pedirqueseejecuteelrecolectordebasuranogarantizaquelosobjetosseanrecolectados.
En sistemas que permiten que el entorno de ejecucin Java note cuando un thread a empezado a
interrumpir a otro thread (como Windows 95/NT), el recolector de basura de Java funciona
asncromamente cuando el sistema est ocupado. Tan pronto como otro thread se vuelva activo, se
pediraalrecolectordebasuraqueobtengaunestadoconsistenteytermine.
Finalizacin
Antes de que un objeto sea recolectado, el recolector de basura le da una oportunidad para limpiarse l
mismo mediante la llamada al mtodofinalize()del propio objeto. Este proceso es conocido como
finalizacin.
Durante la finalizacin de un objeto se podran liberar los recursos del sistema como son los ficheros,
etc.yliberarreferenciasenotrosobjetosparahacerseelegibleporlarecoleccindebasura.
El mtodofinalize()es un miembro de la clase java.lang.Object. Una clase debe sobreescribir el
mtodofinalize()pararealizarcualquierfinalizacinnecesariaparalosobjetosdeesetipo.

DeclararClasesJava
o LaDeclaracindelaClase
o DeclararlaSuperclasedelaClase
o ListarlosInterfacesImplementadosporlaClase
o ClasesPublic,Abstract,yFinal
o SumariodelaDaclaracindeunaClase
DeclararClasesJava
Ahora que ya sabemos como crear, utilizar y destruir objetos, es hora de aprender cmo escribir clases
delasquecrearesosobjetos.
Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La
implementacindeunaclasecomprendedoscomponentes:ladeclaracinyelcuerpodelaclase.
DeclaracinDeLaClase{
CuerpoDeLaClase
}
LaDeclaracindelaClase
Como mnimo, la declaracin de una clase debe contener la palabra claveclassy el nombre de la clase
queestdefiniendo.Asladeclaracinmssencilladeunaclasesepareceraaesto.
classNombredeClase{
...
}
Porejemplo,estaclasedeclaraunanuevaclasellamadaNumeroImaginario.
classNumeroImaginario{
...
}
Los nombres de las clases deben ser un identificador legal de Java y, por convencin, deben empezar
por una letra mayscula. Muchas veces, todo lo que se necesitar ser una declaracin mnima. Sin
embargo, la declaracin de una clase puede decir ms cosas sobre la clase. Ms especificamente,
dentrodeladeclaracindelaclasesepuede.
declararcualeslasuperclasedelaclase.
listarlosinterfacesimplementadosporlaclase
declararsilaclaseespblica,abstractaofinal
DeclararlaSuperclasedelaClase
En Java, todas las clases tienen una superclase. Si no se especifica una superclase para una clase, se
asume que es la clase Object (declarada en java.lang). Entonces la superclase de NumeroImaginario es
Object porque la declaracin no explicit ninguna otra clase. Para obtener ms informacin sobre la
claseObject,puedeverLaclaseObject.
Para especificar explcitamente la superclase de una clase, se debe poner la palabra claveextendsms
el nombre de la superclase entre el nombre de la clase que se ha creado y la llave abierta que abre el
cuerpodelaclase,as.
classNombredeClaseextendsNombredeSuperClase{
...
}
Por ejemplo, supon que quieres que la superclase de NumeroImaginario sea la clase Number en vez de
laclaseObject.Sepodraescribiresto.
classNumeroImaginarioextendsNumber{
...
}
Esto declara explcitamente que la clase Number es la superclase de NumeroImaginario. (La clase
Number es parte del paquete java.lang y es la base para los enteros, los nmeros en coma flotante y
otrosnmeros).
Declarar que Number es la superclase de NumeroImaginario declara implcitamente que
NumeroImaginario es una subclase de Number. Una subclase hereda las variables y los mtodos de su
superclase.
Crear una subclase puede ser tan sencillo como incluir la clausulaextendsen su declaracin de clase.
Sin embargo, se tendrn que hacer otras provisiones en su cdigo cuando se crea una subclase, como
sobreescribir mtodos. Para obtener ms informacin sobre la creacin de subclases, puede
verSubclases,Superclases,yHerencia.
ListarlosInterfacesImplementadosporlaClase
Cuando se declara una clase, se puede especificar que interface, si lo hay, est implementado por la
clase. Pero, Qu es un interface? Un interface declara un conjunto de mtodos y constantes sin
especificar su implementacin para ningn mtodo. Cuando una clase exige la implementacin de un
interface,debeproporcionarlaimplementacinparatodoslosmtodosdeclaradosenelinterface.
Para declarar que una clase implementa uno o ms interfaces, se debe utilizar la palabra
claveimplementsseguida por una lista de los interfaces implementados por la clase delimitados por
comas. Por ejemplo, imagina un interface llamado Aritmetico que define los mtodos
llamadossuma(),resta(), etc... La clase NumeroImaginario puede declarar que implementa el
interfaceAritmeticodeestaforma.
classNumeroImaginarioextendsNumberimplementsAritmetico{
...
}
se debe garantizar que propociona la implementacin para los mtodossuma(),resta()y dems
mtodos declarados en el interface Aritmetico. Si en NumeroImaginario falta alguna implementacin de
los mtodos definidos en Aritmetico, el compilador mostrar un mensaje de error y no compilar el
programa.
nothing.java:5: class NumeroImaginario must be declared abstract. It does
notdefine
java.lang.Number add(java.lang.Number, java.lang.Number) from interface
Aritmetico.
classNumeroImaginarioextendsNumberimplementsAritmetico{
^
Porconvencin,laclausulaimplementssiguealaclausulaextendssistaexiste.
Observa que las firmas de los mtodos declarados en el interface Aritmetico deben corresponder con las
firmas de los mtodos implementados en la clase NumeroImaginario. Tienes ms informacin sobre
cmocrearyutilizarinterfacesenCrearyUtilizarInterfaces.
ClasesPublic,Abstract,yFinal
Se puede utilizar uno de estos tres modificadores en una declaracin de clase para declarar que esa
clase es pblica, abstracta o final. Los modificadores van delante de la palabra claveclassy son
opcionales.
El modificadorpublicdeclara que la clase puede ser utilizada por objetos que estn fuera del paquete
actual. Por defecto, una clase slo puede ser utilizada por otras clases del mismo paquete en el que
estndeclaradas.
publicclassNumeroImaginarioextendsNumberimplementsAritmetico{
...
}
Por convencin, cuando se utiliza la palabrapublicen una declaracin de clase debemos asegurarnos
dequeeselprimeritemdeladeclaracin.
El modificadorabstractdeclara que la clase es una clase abstracta. Una clase abstracta podra
contener mtodos abstractos (mtodos sin implementacin). Una clase abstracta est diseada para ser
una superclase y no puede ejemplarizarse. Para una discusin sobre las clases abstractas y cmo
escribirlaspuedesverEscribirClasesyMtodosAbstractos.
Utilizando el modificadorfinalse puede declarar que una clase es final, que no puede tener subclases.
Existen (al menos) dos razones por las que se podra querer hacer esto: razones de seguridad y
razones de diseo. Para una mejor explicacin sobre las clases finales puedes verEscribir Clases y
MtodosFinales.
Observa que no tiene sentido para una clase ser abstracta y final. En otras palabras, una clase que
contenga mtodos no implementados no puede ser final. Intentar declarar una clase como final y
abstractaresultarenunerrorentiempodecompilacin.
SumariodelaDaclaracindeunaClase
Ensuma,unadeclaracindeclasesepareceraaesto.
[modificadores]classNombredeClase[extendsNombredeSuperclase]
[implementsNombredeInterface]{
...
}
Los puntos entre [ y ] son opcionales. Una declaracin de clase define los siguientes aspectos de una
clase.
modificadoresdeclaransilaclaseesabstracta,pblicaofinal.
NombredeClaseseleccionaelnombredelaclasequeestdeclarando
NombredeSuperClaseeselnombredelasuperclasedeNombredeClase
NombredeInterfacees una lista delimitada por comas de los interfaces implementados por
NombredeClase
De todos estos items, slo la palabra claveclassy el nombre de la clase son necesarios. Los otros son
opcionales. Si no se realiza ninguna declaracin explcita para los items opcionales, el compilador Java
asume ciertos valores por defecto (una subclase de Object no final, no pblica, no obstracta y que no
implementainterfaces).
DeclararClasesJava
o LaDeclaracindelaClase
o DeclararlaSuperclasedelaClase
o ListarlosInterfacesImplementadosporlaClase
o ClasesPublic,Abstract,yFinal
o SumariodelaDaclaracindeunaClase
DeclararClasesJava
Ahora que ya sabemos como crear, utilizar y destruir objetos, es hora de aprender cmo escribir clases
delasquecrearesosobjetos.
Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La
implementacindeunaclasecomprendedoscomponentes:ladeclaracinyelcuerpodelaclase.
DeclaracinDeLaClase{
CuerpoDeLaClase
}
LaDeclaracindelaClase
Como mnimo, la declaracin de una clase debe contener la palabra claveclassy el nombre de la clase
queestdefiniendo.Asladeclaracinmssencilladeunaclasesepareceraaesto.
classNombredeClase{
...
}
Porejemplo,estaclasedeclaraunanuevaclasellamadaNumeroImaginario.
classNumeroImaginario{
...
}
Los nombres de las clases deben ser un identificador legal de Java y, por convencin, deben empezar
por una letra mayscula. Muchas veces, todo lo que se necesitar ser una declaracin mnima. Sin
embargo, la declaracin de una clase puede decir ms cosas sobre la clase. Ms especificamente,
dentrodeladeclaracindelaclasesepuede.
declararcualeslasuperclasedelaclase.
listarlosinterfacesimplementadosporlaclase
declararsilaclaseespblica,abstractaofinal
DeclararlaSuperclasedelaClase
En Java, todas las clases tienen una superclase. Si no se especifica una superclase para una clase, se
asume que es la clase Object (declarada en java.lang). Entonces la superclase de NumeroImaginario es
Object porque la declaracin no explicit ninguna otra clase. Para obtener ms informacin sobre la
claseObject,puedeverLaclaseObject.
Para especificar explcitamente la superclase de una clase, se debe poner la palabra claveextendsms
el nombre de la superclase entre el nombre de la clase que se ha creado y la llave abierta que abre el
cuerpodelaclase,as.
classNombredeClaseextendsNombredeSuperClase{
...
}
Por ejemplo, supon que quieres que la superclase de NumeroImaginario sea la clase Number en vez de
laclaseObject.Sepodraescribiresto.
classNumeroImaginarioextendsNumber{
...
}
Esto declara explcitamente que la clase Number es la superclase de NumeroImaginario. (La clase
Number es parte del paquete java.lang y es la base para los enteros, los nmeros en coma flotante y
otrosnmeros).
Declarar que Number es la superclase de NumeroImaginario declara implcitamente que
NumeroImaginario es una subclase de Number. Una subclase hereda las variables y los mtodos de su
superclase.
Crear una subclase puede ser tan sencillo como incluir la clausulaextendsen su declaracin de clase.
Sin embargo, se tendrn que hacer otras provisiones en su cdigo cuando se crea una subclase, como
sobreescribir mtodos. Para obtener ms informacin sobre la creacin de subclases, puede
verSubclases,Superclases,yHerencia.
ListarlosInterfacesImplementadosporlaClase
Cuando se declara una clase, se puede especificar que interface, si lo hay, est implementado por la
clase. Pero, Qu es un interface? Un interface declara un conjunto de mtodos y constantes sin
especificar su implementacin para ningn mtodo. Cuando una clase exige la implementacin de un
interface,debeproporcionarlaimplementacinparatodoslosmtodosdeclaradosenelinterface.
Para declarar que una clase implementa uno o ms interfaces, se debe utilizar la palabra
claveimplementsseguida por una lista de los interfaces implementados por la clase delimitados por
comas. Por ejemplo, imagina un interface llamado Aritmetico que define los mtodos
llamadossuma(),resta(), etc... La clase NumeroImaginario puede declarar que implementa el
interfaceAritmeticodeestaforma.
classNumeroImaginarioextendsNumberimplementsAritmetico{
...
}
se debe garantizar que propociona la implementacin para los mtodossuma(),resta()y dems
mtodos declarados en el interface Aritmetico. Si en NumeroImaginario falta alguna implementacin de
los mtodos definidos en Aritmetico, el compilador mostrar un mensaje de error y no compilar el
programa.
nothing.java:5: class NumeroImaginario must be declared abstract. It does
notdefine
java.lang.Number add(java.lang.Number, java.lang.Number) from interface
Aritmetico.
classNumeroImaginarioextendsNumberimplementsAritmetico{
^
Porconvencin,laclausulaimplementssiguealaclausulaextendssistaexiste.
Observa que las firmas de los mtodos declarados en el interface Aritmetico deben corresponder con las
firmas de los mtodos implementados en la clase NumeroImaginario. Tienes ms informacin sobre
cmocrearyutilizarinterfacesenCrearyUtilizarInterfaces.
ClasesPublic,Abstract,yFinal
Se puede utilizar uno de estos tres modificadores en una declaracin de clase para declarar que esa
clase es pblica, abstracta o final. Los modificadores van delante de la palabra claveclassy son
opcionales.
El modificadorpublicdeclara que la clase puede ser utilizada por objetos que estn fuera del paquete
actual. Por defecto, una clase slo puede ser utilizada por otras clases del mismo paquete en el que
estndeclaradas.
publicclassNumeroImaginarioextendsNumberimplementsAritmetico{
...
}
Por convencin, cuando se utiliza la palabrapublicen una declaracin de clase debemos asegurarnos
dequeeselprimeritemdeladeclaracin.
El modificadorabstractdeclara que la clase es una clase abstracta. Una clase abstracta podra
contener mtodos abstractos (mtodos sin implementacin). Una clase abstracta est diseada para ser
una superclase y no puede ejemplarizarse. Para una discusin sobre las clases abstractas y cmo
escribirlaspuedesverEscribirClasesyMtodosAbstractos.
Utilizando el modificadorfinalse puede declarar que una clase es final, que no puede tener subclases.
Existen (al menos) dos razones por las que se podra querer hacer esto: razones de seguridad y
razones de diseo. Para una mejor explicacin sobre las clases finales puedes verEscribir Clases y
MtodosFinales.
Observa que no tiene sentido para una clase ser abstracta y final. En otras palabras, una clase que
contenga mtodos no implementados no puede ser final. Intentar declarar una clase como final y
abstractaresultarenunerrorentiempodecompilacin.
SumariodelaDaclaracindeunaClase
Ensuma,unadeclaracindeclasesepareceraaesto.
[modificadores]classNombredeClase[extendsNombredeSuperclase]
[implementsNombredeInterface]{
...
}
Los puntos entre [ y ] son opcionales. Una declaracin de clase define los siguientes aspectos de una
clase.
modificadoresdeclaransilaclaseesabstracta,pblicaofinal.
NombredeClaseseleccionaelnombredelaclasequeestdeclarando
NombredeSuperClaseeselnombredelasuperclasedeNombredeClase
NombredeInterfacees una lista delimitada por comas de los interfaces implementados por
NombredeClase
De todos estos items, slo la palabra claveclassy el nombre de la clase son necesarios. Los otros son
opcionales. Si no se realiza ninguna declaracin explcita para los items opcionales, el compilador Java
asume ciertos valores por defecto (una subclase de Object no final, no pblica, no obstracta y que no
implementainterfaces).

ElCuerpodeunaClaseJava
ElCuerpodeunaClaseJava
Anteriormenteseviunadescripcingeneraldelaimplementacindeunaclase.
DeclaraciondeClase{
CuerpodeClase
}
Lapgina anteriordescribe todos los componentes de la declaracin de una clase. Esta pgina
describelaestructurageneralylaorganizacindelcuerpodelaclase.
El cuerpo de la clase compone la implementacin de la propia clase y contiene dos secciones diferentes:
la declaracin de varibles y la de mtodos. Una variable miembro de la clase representa un estado de la
clase y sus mtodos implemetan el comportamiendo de la clase. Dentro del cuerpo de la clase se
definentodaslasvariablesmiembroylosmtodossoportadosporlaclase.
Tpicamente, primero se declaran las variables miembro de la clase y luego se porporcionan las
declaracioneseimplementancionesdelosmtodos,aunqueesteordennoesnecesario.
DeclaracindeClase{
DeclaracionesdeVariablesMiembros
DeclaracionesdeMtodos
}
Aqutienesunapequeaclasequedeclaratresvariablesmiembroyunmtodo.
classTicket{
Floatprecio
Stringdestino
DatefechaSalida
voidfirma(FloatforPrecio,StringforDestino,DateforFecha){
precio=forPrecio
destino=forDestino
fechaSalida=forFecha
}
}
Para ms informacin sobre cmo declarar variables miembro, puedes verDeclarar Variables
Miembro. Y para obtener ms informacin sobre cmo implementar mtodos, puedes verImplementar
Mtodos.
Adems de las variables miembro y los mtodos que se declaran explcitamente dentro del cuerpo de la
clase, una clase puede heredar algo de su superclase. Por ejemplo, todas las clases del entorno Java
son una descendencia (directa o indirecta) de la clase Object. La clase Object define el estado bsico y
el comportamieto que todos los objetos deben tener como habilidad para comparar unos objetos con
otros, para convertir una cadena, para esperar una condicin variable, para notificar a otros objetos que
una condicin variable ha cambiado, etc... As, como descendentes de esta clase,todoslos objetos del
entornoJavaheredansuscomportamientosdelaclaseObject.

DeclararVariablesJava
o DeclararConstantes
o DeclararVariablesTransitorias
o DeclararVariablesVolatiles
DeclararVariablesJava
Como mnimo, una declaracin de variable miembro tiene dos componentes: el tipo de dato y el nombre
delavariable.
tiponombreVariable//Declaracinmnimadeunavariablemiembro
Una declaracin mnima de variable miembro es como la declaracin de variables que se escribe en
cualquier otro lugar de un programa Java, como las variables locales o los parmetros de los mtodos.
El siguiente cdigo declara una variable miembro entera llamadaunEnterodentro de la
claseClaseEnteros.
classClaseEnteros{
intunEntero
...
//definelosmtodosaqu
...
}
Observa que la declaracin de variables miembro aparece dentro de la implementacin del cuerpo de la
clase pero no dentro de un mtodo. Este posicionamiento dentro del cuerpo de la clase determina que
unavariableesunavariablemiembro.
Al igual que otras variables en Java, las variables miembro deben tener un tipo. Un tipo de variable
determina los valores que pueden ser asignados a las variables y las operaciones que se pueden
realizar con ellas. Ya deberas estar familiarizado con los tipos de datos en Java mediante la lectura de
laleccinanterior:VariablesyTiposdeDatos.
Un nombre de una variable miembro puede ser cualquier identificador legal de Java y por convencin
empieza con una letra minscula (los nombres de clase tpicamente empiezan con una letra
mayscula). No se puede declarar ms de una variable con el mismo nombre en la misma clase. Por
ejemplo,elsiguientecdigoeslegal.
classClaseEnteros{
intunEntero
int unEntero() { // un mtodo con el mismo nombre que una
variable
...
}
}
Junto con el nombre y el tipo, se pueden especificar varios atributos para las variables miembro cuando
se las declara: incluyendo si los objetos pueden acceder a la variable, si la variable es una variable de
claseounavariabledeejemplar,ysilavariableesunaconstante.
Unadeclaracindevariablesepodrapareceraesto.
[especificadordeAcceso] [static] [final] [transient] [volatile] tipo
nombredeVaraible
Los puntos entre [ y ] son opcionales. Los items en negrita se deben reemplazar por palabras clave o por
nombres.
Unadeclaracindevariablemiembrodefinelossiguientesaspectosdelavariable.
especificadordeAccesodefine si otras clases tienen acceso a la variable. Se puede controlar
el acceso a los mtodos utilizando los mismos especificadores, por esoControlar el Acceso a
Variables Miembro de una Clasecubre cmo se puede controlar el acceso a las variables
miembroolosmtodos.
staticindica que la variable es una variable miembro de la clase en oposicin a una variable
miembro del ejemplar. Se puede utilizarstaticpara declarar mtodos de clase.Miembros de
Clase y de Ejemplarexplica la declaracin de variables de clase y de ejemplar y escribir mtodos
deejemplarodeclase.
finalindicaquelavariableesunaconstante
transientlavariablenoesunapartepersistentedelestadodelobjeto
volatilesignificaquelavariableesmodificadadeformaasncrona.
Laexplicacindelasvariablesfinal,transient,yvolatilevieneahora.
DeclararConstantes
Para crear una variable miembro constante en Java se debe utilizar la palabra clavefinalen su
declaracin de variable. La siguiente declaracin define una constante llamada AVOGADRO cuyo valor es
elnmerodeAvogadro(6.023x10^23)ynopuedesercambiado.
classAvo{
finaldoubleAVOGADRO=6.023e23
}
Por convencin, los nombres de los valores constantes se escriben completamene en maysculas. Si un
programa intenta cambiar una variable, el compilador muestra un mensaje de error similar al siguiente,
yrehusaacompilarsuprograma.
AvogadroTest.java:5:Can'tassignavaluetoafinalvariable:AVOGADRO
DeclararVariablesTransitorias
Por defecto, las variables miembro son una parte persistente del estado de un objeto, Las variables que
forman parte persistente del estado del objeto deben guardarse cuando el objeto se archiva. Se puede
utilizar la palabra clavetransientpara indicar a la mquina virtual Java que la variable indicadanoes
unapartepersistentedelobjeto.
Al igual que otros modificadors de variables en el sistema Java, se puede utilizartransienten una
claseodeclaracindevariabledeejemplarcomoesta.
classTransientExample{
transientinthobo
...
}
Este ejemplo declara una variable entera llamadahoboque no es una parte persistente del estado de
laclaseTransientExample.
DeclararVariablesVolatiles
Si una clase contiene una variable miembro que es modificada de forma asncrona, mediante la
ejecucin de threads concurrentes, se puede utilizar la palabra clavevolatilede Java para notificar
estoalsistemaJava.
La siguiente declaracin de variable es un ejemplo de como declarar que una variable va a ser
modificadadeformaasncronaporthreadsconcurrentes.
classVolatileExample{
volatileintcontador
...
}

ImplementarMtodosJava
LaDeclaracindeMtodo
DevolverunValordesdeunMtodo
UnNombredeMtodo
CaractersticasAvanzadasdelaDeclaracindeMtodos
ImplementarMtodosJava
Similarmente a la implementacin de una clase, la implementacin de un mtodo consiste en dos
partes,ladeclaracinyelcuerpodelmtodo.
declaracindeMtodo{
cuerpodeMtodo
}
LaDeclaracindeMtodo
Una declaracin de mtodo proporciona mucha informacin sobre el mtodo al compilador, al sistema
entiempodeejecucinyaotrasclasesyobjetos.
Junto con el nombre del mtodo, la declaracin lleva informacin como el tipo de retorno del mtodo, el
nmeroyeltipodelosargumentosnecesarios,yquotrasclasesyobjetospuedenllamaralmtodo.
Los nicos elementos necesarios para una declaracin de mtodo son el nombre y el tipo de retorno del
mtodo. Por ejemplo, el cdigo siguiente declara un mtodo llamadoestaVacio()en la clase Pila que
devuelveunvalorbooleano(trueofalse).
classPila{
...
booleanestaVacio(){
...
}
}
DevolverunValordesdeunMtodo
Java necesita que un mtodo declare el tipo de dato del valor que devuelve. Si un mtodo no devuelve
ningnvalor,debeserdeclaradoparadevolvervoid(nulo).
Los mtodos pueden devolver tipos de datos primitivos o tipos de datos de referencia. El
mtodoestaVacio()delaclasePiladevuelveuntipodedatoprimitivo,unvalorbooleano.
classPila{
staticfinalintPILA_VACIA=1
Object[]stackelements
inttopelement=PILA_VACIA
...
booleanestaVacio(){
if(topelement==PILA_VACIA)
returntrue
else
returnfalse
}
}
Sinembargo,elmtodopopdelaclasePILAdevuelveuntipodedatodereferencia:unobjeto.
classPila{
staticfinalintPILA_VACIA=1
Object[]stackelements
inttopelement=PILA_VACIA
...
Objectpop(){
if(topelement==PILA_VACIA)
returnnull
else{
returnstackelements[topelement]
}
}
}
Los mtodos utilizan el operadorreturnpara devolver un valor. Todo mtodo quenosea declarado
comovoiddebecontenerunasentenciareturn.
El tipo de dato del valor devuelto por la sentenciareturndebe corresponder con el tipo de dato que el
mtodo tiene que devolver no se puede devolver un objeto desde un mtodo que fue declarado para
devolverunentero.
Cuando se devuelva un objeto, el tipo de dato del objeto devuelto debe ser una subclase o la clase
exacta indicada. Cuando se devuelva un tipo interface, el objeto retornado debe implementar el
interfaceespecificado.
UnNombredeMtodo
Un nombre de mtodo puede ser cualquier indentificador legal en Java. Existen tres casos especiales a
tenerencuentaconlosnombresdemtodos.
1. Java soporta la sobrecarga de mtodos, por eso varios mtodos pueden compartir el mismo
nombre. Por ejemplo, supon que se ha escrito una clase que puede proporcionar varios tipos de
datos (cadenas, enteros, etc...) en un rea de dibujo. Se podra escribir un mtodo que supiera
como tratar a cada tipo de dato. En otros lenguajes, se tendra que pensar un nombre distinto para
cada uno de los mtodos.dibujaCadena(),dibujaEntero, etc... En Java, se puede utilizar el
mismo nombre para todos los mtodos pasndole un tipo de parmetro diferente a cada uno de
los mtodos. Entonces en la clase de dibujo, se podrn declarar tres mtodos llamadosdraw()y
quecadaunoaceptarauntipodeparmetrodiferente.
2. classDibujodeDatos{
3. voiddraw(Strings){
4. ...
5. }
6. voiddraw(inti){
7. ...
8. }
9. voiddraw(floatf){
10....
11.}
12.}
Nota:La informacin que hay dentro de los parntesis de la declaracin son los argumentos del
mtodo.Losargumentossecubrenenlasiguientepgina:PasarInformacinaunMtodo.
Los mtodos son diferenciados por el compilador basndose en el nmero y tipo de sus
argumentos. Asdraw(String s)ydraw(int i)son mtodos distintos y nicos. No se puede
declarar un mtodo con la misma firma:draw(String s)ydraw(String t)son idnticos y darn
unerrordelcompilador.
Habrs observado que los mtodos sobrecargados deben devolver el mismo tipo de dato, por
esovoid draw(String s)eint draw(String t)declarados en la misma clase producirn un
errorentiempodecompilacin.
13. Todo mtodo cuyo nombre sea igual que el de su clase es unconstructory tiene una tarea
especial que realizar. Los constructores se utilizan para inicializar un objeto nuevo del tipo de la
clase. Los constructores slo pueden ser llamados con el operadornew. Para aprender cmo
escribirunconstructor,puedesverEscribirunMtodoConstructor.
14. Una clase puede sobreescribir un mtodo de sus superclases. El mtodo que sobreescribe debe
tener el mismo, nombre, tipo de retorno y lista de parmetros que el mtodo al que ha
sobreescrito.Sobreescribir Mtodoste ensear como sobreescribir los mtodos de una
superclase.

CaractersticasAvanzadasdelaDeclaracindeMtodos
Junto con los dos elementos necesarios, una declaracin de mtodo puede contener otros elementos.
Estos elementos declaran los argumentos aceptados por el mtodo, si el mtodo es un mtodo de
clase,etc...
Juntndolotodo,unadeclaracindemtodosepareceraaesto.
[especificadordeAcceso] [static] [abstract] [final] [native]
[synchronized]
tipodeRetorno nombredelMtodo ([listadeparmetros]) [throws
listadeExcepciones]
Cadaunodeestoselementosdeunadeclaracinsecubreenalgunapartedeestetutorial.
PasarInformacinaunMtodo
o TiposdeArgumentos
o NombresdeArgumentos
o PasoporValor
PasarInformacinaunMtodo
Cuando se escribe un mtodo, se declara el nmero y tipo de los argumentos requeridos por ese
mtodo. Esto se hace en la firma del mtodo. Por ejemplo, el siguiente mtodo calcula el pago mensual
de una hipoteca basndose en la cantidad prestada, el inters, la duracin de la hipoteca (nmero de
meses) y el valor futuro de la hipoteca (presumiblemente el valor futuro sea cero, porque al final de la
hipoteca,yalahabrspagado).
double hipoteca(double cantidad, double interes, double valorFinal, int numPeriodos)
{
doubleI,parcial1,denominador,respuesta
I=interes/100.0
parcial1=Math.pow((1+I),(0.0numPeriodos))
denominador=(1parcial1)/I
respuestar = ((1 * cantidad) / denominador) ((valorFinal * parcial1) /
denominador)
returnrespuesta
}
Este mtodo toma cuatro argumentos: la cantidad prestada, el inters, el valor futuro y el nmero de
meses.Lostresprimerossonnmerosdecomaflotantededobleprecisinyelcuartoesunentero.
Al igual que este mtodo, el conjunto de argumentos de cualquier mtodo es una lista de declaraciones
devaribalesdelimitadasporcomasdondecadadeclaracindevariableesunpartipo/nombre.
tiponombre
Como has podido ver en el ejemplo anterior, slo tienes que utilizar el nombre del argumento para
referirtealvalordelargumento.
TiposdeArgumentos
En Java, se puede pasar como argumento a un mtodo cualquier tipo de dato vlido en Java. Esto
incluyetiposprimitivos,comoenteros,dobles,etc..ytiposdereferenciacomoarrays,objetos,etc...
Aqu tienes un ejemplo de un constructor que acepta un array como argumento. En este ejemplo el
constructor inicializa un objeto Polygon a partir de una lista de puntos (Point es una clase del paquete
java.awtquerepresentaunacoordenadaxy).
PolygonpolygonFrom(Point[]listadePuntos){
...
}
Al contrario que en otros lenguajes, no se puede pasar un mtodo a un mtodo Java. Pero si se podra
pasarunobjetoaunmtodoyluegollamaralosmtodosdelobjeto.
NombresdeArgumentos
Cuando se declara un argumento para un mtodo Java, se proporciona el nombre para ese argumento.
Estenombreesutilizadodentodelcuerpodelmtodoparareferirsealvalordelargumento.
Un argumento de un mtodo puede tener el mismo nombre que una variable de la clase. En este caso,
se dice que el argumento oculta a la variable miembro. Normalmente los argumentos que ocultan una
variable miembro se utilizan en los constructores para inicializar una clase. Por ejemplo, observa la clase
Circleysuconstructor.
classCircle{
intx,y,radius
publicCircle(intx,inty,intradius){
...
}
}
La clase Circle tiene tres variables miembrox,yyradius. Adems, el constructor de la clase Circle
acepta tres argumentos cada uno de los cuales comparte el nombre con la variable miembro para la que
elargumentoproporcionaunvalorinicial.
Los nombres de argumentos ocultan los nombres de las variables miembro. Por eso
utilizarx,yoradiusdentro del cuerpo de la funcin, se refiere a los argumentos,noa las variables
miembro. Para acceder a las variables miembro, se las debe referenciar a travs dethisel objeto
actual.
classCircle{
intx,y,radius
publicCircle(intx,inty,intradius){
this.x=x
this.y=y
this.radius=radius
}
}
Los nombres de los argumentos de un mtodo no pueden ser el mismo que el de otros argumentos del
mismo mtodo, el nombre de cualquier variable local del mtodo o el nombre de cualquier parmetro a
unaclausulacatch()dentrodelmismomtodo.
PasoporValor
En los mtodos Java, los argumentos son pasados por valor. Cuando se le llama, el mtodo recibe el
valor de la variable pasada. Cuando el argumento es de un tipo primitivo, pasar por valor significa que el
mtodo no puede cambiar el valor. Cuando el argumento es del tipo de referencia, pasar por valor
significa que el mtodo no puede cambiar el objeto referenciado, pero si puede invocar a los mtodos
delobjetoypuedemodificarlasvariablesaccesiblesdentrodelobjeto.
Consideremos esta serie de sentencias Java que intentan recuperar el color actual de un objeto Pen en
unaaplicacingrfica.
...
intr=1,g=1,b=1
pen.getRGBColor(r,g,b)
System.out.println("red="+r+",green="+g+",blue="+b)
...
En el momento que se llama al mtodogetRGBColor(), las variablesr,g, ybtienen un valor de 1.
El llamador espera que el mtodogetRGBColor()le devuelva los valores de rojo, verde y azul para el
coloractualenlasvariablesr,g,yb.
Sin embargo, el sistema Java pasa los valores de las variables(1) al mtodogetRGBColor()nouna
referenciaalasvariablesr,g,yb.
ConestosepodravisualizarlallamadaagetRGBColor()deestaforma.
getRGBColor(1,1,1)
Cuando el control pasa dentro del mtodogetRGBColor(), los argumentos entran dentro del mbito
(selesasignaespacio)ysoninicializadosalosvalorespasadosalmtodo.
classPen{
intvalorRojo,valorVerde,valorAzul
voidgetRGBColor(introjo,intverde,intazul){
//rojo,verdeyazulhansidocreadosysusvaloresson1
...
}
}
Con estogetRGBColor()obtiene acceso a los valores der,g, ybdel llamador a tavs de sus
argumentosrojo,verde,yazul,respectivamente.
El mtodo obtiene su propia copia de los valores para utilizarlos dentro del mbito del mtodo. Cualquier
cambiorealizadoenestascopiaslocalesnoserareflejadoenlasvariablesoriginalesdelllamador.
Ahora veremos la implementacin degetRGBColor()dentro de la clase Pen que implicaba la firma de
mtodoanterior.
classPen{
intvalorRojo,valorVerde,valorAzul
...
//Estemtodonotrabajacomoseespera
voidgetRGBColor(introjo,intverde,intazul){
rojo=valorRojo
verde=valorVerde
azul=valorAzul
}
}
Este mtodo no trabajar como se espera. Cuando el control llega a la sentenciaprintln()en el
siguiente fragmento de cdigo, los argumentosrojo,verdeyazuldegetRGBColor()ya no
existen. Por lo tanto las asignaciones realizadas dentro del mtodo no tendrn efector,g, ybseguiran
siendoiguala1.
...
intr=1,g=1,b=1
pen.getRGBColor(r,g,b)
System.out.println("rojo="+r+",verde="+g+",azul="+b)
...
El paso de las varibales por valor le ofrece alguna seguridad a los programadores: los mtodos no puede
modificardeformanointencionadaunavariablequeestfueradesumbito.
Sin embargo, alguna vez se querr que un mtodo modifique alguno de sus argumentos. El
metodogetRGBColor()es un caso apropiado. El llamador quiere que el mtodo devuelva tres valores
a travs de sus argumentos. Sin embargo, el mtodo no puede modificar sus argumentos, y, adems,
un mtodo slo puede devolver un valor a travs de su valor de retorno. Entonces, cmo puede un
mtododevolvermsdeunvalor,oteneralgnefecto(modificaralgnvalor)fueradesumbito?
Para que un mtodo modifique un argumento, debe ser un tipo de referencia como un objeto o un array.
Los objetos y arrays tambin son pasados por valor, pero el valor de un objeto es una referencia.
Entonces el efecto es que los argumentos de tipos de referencia son pasados por referencia. De aqu el
nombre. Una referencia a un objeto es la direccin del objeto en la memoria. Ahora, el argumento en el
mtodoserefierealamismaposicindememoriaqueelllamador.
Reescribamos el mtodogetRGBColor()para que haga lo que queremos. Primero introduzcamos un
nuevo objeto RGBColor, que puede contener los valores de rojo, verde y azul de un color en formato
RGB.
classRGBColor{
publicintrojo,verde,azul
}
Ahora podemos reescribirgetRGBColor()para que acepte un objeto RGBColor como argumento. El
mtodogetRGBColor()devuelve el color actual de lpiz, en los valores de las variables
miembrorojo,verdeyazuldesuargumentoRGBColor.
classPen{
intvalorRojo,valorVerde,valorAzul
voidgetRGBColor(RGBColorunColor){
unColor.rojo=valorRojo
unColor.verde=valorVerde
unColor.azul=valorAzul
}
}
Yfinalmente,reescribimoslasecuenciadellamada.
...
RGBColorpenColor=newRGBColor()
pen.getRGBColor(penColor)
System.out.println("ojo="+penColor.rojo+",verde="+penColor.verde+",
azul="+penColor.azul)
...
Las modificaciones realizadas al objeto RGBColor dentro del mtodogetRGBColor()afectan al objeto
creado en la secuencia de llamada porque los nombrespenColor(en la secuencia de llamada)
yunColor(enelmtodogetRGBColor())serefierenalmismoobjeto.

ElCuerpodeunMtodo
o this
o super
o VariablesLocales
ElCuerpodeunMtodo
En el siguiente ejemplo, el cuerpo de mtodo para los mtodosestaVacio()yponer()estn en
negrita.
classStack{
staticfinalintPILA_VACIA=1
Object[]elementosPila
intelementoSuperior=PILA_VACIA
...
booleanestaVacio(){
if(elementoSuperior==PILA_VACIA)
returntrue
else
returnfalse
}
Objectponer(){
if(elementoSuperior==PILA_VACIA)
returnnull
else{
returnelementosPila[elementoSuperior]
}
}
}
Junto a los elementos normales del lenguaje Java, se puede utilizarthisen el cuerpo del mtodo para
referirsealosmiembrosdelobjetoactual.
El objeto actual es el objeto del que uno de cuyos miembros est siendo llamado. Tambin se puede
utilizarsuperpara referirse a los miembros de la superclase que el objeto actual haya ocultado
mediante la sobreescritura. Un cuerpo de mtodo tambin puede contener declaraciones de variables
quesonlocalesdeesemtodo.
this
Normalmente, dentro del cuerpo de un mtodo de un objeto se puede referir directamente a las
variables miembros del objeto. Sin embargo, algunas veces no se querr tener ambigedad sobre el
nombredelavariablemiembroyunodelosargumentosdelmtodoquetenganelmismonombre.
Por ejemplo, el siguiente constructor de la clase HSBColor inicializa alguna variable miembro de un
objeto de acuerdo a los argumentos pasados al constructor. Cada argumento del constructor tiene el
mismonombrequelavariabledelobjetocuyovalorcontieneelargumento.
classHSBColor{
inthue,saturacion,brillo
HSBColor(intluminosidad,intsaturacion,intbrillo){
this.luminosidad=luminosidad
this.saturacion=saturacion
this.brillo=brillo
}
}
Se debe utilizarthisen este constructor para evitar la ambigedad entre el argumentoluminosidady
la variable miembroluminosidad(y as con el resto de los argumentos). Escribirluminosidad =
luminosidadno tendra sentido. Los nombres de argumentos tienen mayor precedencia y ocultan a
los nombres de las variables miembro con el mismo nombre. Para referirise a la variable miembro se
debehacerexplicitamenteatravsdelobjetoactualthis.
Tambin se puede utilizarthispara llamar a uno de los mtodos del objeto actual. Esto slo es
necesario si existe alguna ambigedad con el nombre del mtodo y se utiliza para intentar hacer el
cdigomsclaro.
super
Si el mtodo oculta una de las variables miembro de la superclase, se puede referir a la variable oculta
utilizandosuper. De igual forma, si el mtodo sobreescribe uno de los mtodos de la superclase, se
puedellamaralmtodosobreescritoatravsdesuper.
Consideremosestaclase.
classMiClase{
booleanunaVariable
voidunMetodo(){
unaVariable=true
}
}
yunasubclasequeocultaunaVariableysobreescribeunMetodo().
classOtraClaseextendsMiClase{
booleanunaVariable
voidunMetodo(){
unaVariable=false
super.unMetodo()
System.out.println(unaVariable)
System.out.println(super.unaVariable)
}
}
PrimerounMetodo()seleccionaunaVariable(una declarada en OtraClase que oculta a la declarada
enMiClase)afalse.LuegounMetodo()llamaasumtodosobreescritoconestasentencia.
super.unMetodo()
EstoseleccionalaversinocultadeunaVariable(ladeclaradaenMiClase)atrue.
LuegounMetodomuestralasdosversionesdeunaVariablecondiferentesvalores.
false
true
VariablesLocales
Dentro del cuerpo de un mtodo se puede declarar ms variables para usarlas dentro del mtodo. Estas
variables son variables locales y viven slo mientras el control permanezca dentro del mtodo. Este
mtododeclaraunvariablelocaliylautilizaparaoperarsobreloselementosdelarray.
ObjectencontrarObjetoEnArray(Objecto,Object[]arrayDeObjetos){
inti//variablelocal
for(i=0i<arrayDeObjetos.lengthi++){
if(arrayDeObjetos[i]==o)
returno
}
returnnull
}
Despusdequeestemtodoretorne,iyanoexistirms.
MiembrosdelaClaseydelEjemplar
MiembrosdelaClaseydelEjemplar
CuandosedeclaraunavariablemiembrocomounFloatenMiClase.
classMiClase{
floatunFloat
}
declara una variable de ejemplar. Cada vez que se crea un ejemplar de la clase, el sistema crea una
copia de todas las variables de ejemplar de la clase. Se puede acceder a una variable del ejemplar del
objetodesdeunobjetocomosedescribeenUtilizarObjetos.
Las variables de ejemplar estn en constraste con las variables de clase (que se declaran utilizando el
modificadorstatic). El sistema asigna espacio para las variables de clase una vez por clase, sin
importar el nmero de ejemplares creados de la clase. Todos los objetos creados de esta clase
comparten la misma copia de las variables de clase de la clase, se puede acceder a las variables de
claseatravsdeunejemplaroatravsdelapropiaclase.
Los mtodos son similares: una clase puede tener mtodos de ejemplar y mtodos de clase. Los
mtodos de ejemplar operan sobre las variables de ejemplar del objeto actual pero tambin pueden
acceder a las variables de clase. Por otro lado, los mtodos de clase no pueden acceder a las variables
del ejemplar declarados dentro de la clase (a menos que se cree un objeto nuevo y acceda a ellos a
travs del objeto). Los mtodos de clase tambin pueden ser invocados desde la clase, no se necesita
unejemplarparallamaralosmtodosdelaclase.
Por defecto, a menos que se especifique de otra forma, un miembro declarado dentro de una clase es
un miembro del ejemplar. La clase definida abajo tiene una variable de ejemplar un entero
llamadox y dos mtodos de ejemplar x()ysetX() que permite que otros objetos pregunten por
elvalordex.
classUnEnteroLlamadoX{
intx
publicintx(){
returnx
}
publicvoidsetX(intnewX){
x=newX
}
}
Cada vez que se ejemplariza un objeto nuevo desde una clase, se obtiene una copia de cada una de
las variables de ejemplar de la clase. Estas copias estn asociadas con el objeto nuevo. Por eso, cada
vez que se ejemplariza un nuevo objeto UnEnteroLlamadoX de la clase, se obtiene una copia dexque
estasociadaconelnuevoobjetoUnEnteroLlamadoX.
Todos los ejemplares de una clase comparten la misma implementacin de un mtodo de ejemplar
todos los ejemplares de UnEnteroLlamadoX comparten la misma implementacin dex()ysetX().
Observa que estos mtodos se refieren a la variable de ejemplar del objetoxpor su nombre. "Pero, si
todos los ejemplares de UnEnteroLlamadoX comparten la misma implementacin dex()ysetX()esto
no es ambigo?" La respuesta es no. Dentro de un mtodo de ejemplar, el nombre de una variable de
ejemplar se refiere a la variable de ejemplar del objeto actual (asumiendo que la variable de ejemplar
no est ocultada por un parmetro del mtodo). Ya que, dentro dex()ysetX(),xes equivalente
athis.x.
Los objetos externos a UnEnteroLlamadoX que deseen acceder axdeben hacerlo a travs de un
ejemplar particular de UnEnteroLlamadoX. Supongamos que este cdigo estuviera en otro mtodo del
objeto. Crea dos objetos diferentes del tipo UnEnteroLlamadoX, y selecciona sus valores dexa diferente
valoresyluegolomuestra:
...
UnEnteroLlamadoXmiX=newUnEnteroLlamadoX()
UnEnteroLlamadoXotroX=newUnEnteroLlamadoX()
miX.setX(1)
otroX.x=2
System.out.println("miX.x="+miX.x())
System.out.println("otroX.x="+otroX.x())
...
Observa que el cdigo utilizado ensetX()para seleccionar el valor dexparamiXpero slo asignando
el valorotroX.xdirectamente. De otra forma, el cdigo manipula dos copias diferentes dex: una
contenidaenelobjetomiXylaotraenelobjetootroX.Lasalidaproducidaporestecdigoes.
miX.x=1
otroX.x=2
mostrando que cada ejemplar de la clase UnEnteroLlamadoX tiene su propia copia de la variable de
ejemplarxyquecadaxtieneunvalordiferente.
Cuando se declara una variable miembro se puede especificar que la variable es una variable de clase
en vez de una variable de ejemplar. Similarmente, se puede especificar que un mtodo es un mtodo
de clase en vez de un mtodo de ejemplar. El sistema crea una sola copia de una variable de clase la
primera vez que encuentra la clase en la que est definida la variable. Todos los ejemplares de esta
clase comparten la misma copia de las variables de clase. Los mtodos de clase slo pueden operar con
variablesdeclasenopuedenaccederavariablesdeejemplardefinidasenlaclase.
Para especificar que una variable miembro es una variable de clase, se utiliza la palabra clavestatic.
Por ejemplo, cambiemos la clase UnEnteroLlamadoX para que su variablexsea ahora una variable de
clase.
classUnEnteroLlamadoX{
staticintx
publicintx(){
returnx
}
publicvoidsetX(intnewX){
x=newX
}
}
Ahora veamos el mismo cdigo mostrado anteriormente que crea dos ejemplares de
UnEnteroLlamadoX,seleccionasusvaloresdex,ymuestraestasalidadiferente.
miX.x=2
otroX.x=2
La salida es diferente porquexahora es una variable de clase por lo que slo hay una copia de la
variableyescompartidaportodoslosejemplaresdeUnEnteroLlamadoXincluyendomiXyotroX.
Cuando se llama asetX()en cualquier ejemplar, cambia el valor dexpara todos los ejemplares de
UnEnteroLlamadoX.
Las variables de clase se utilizan para aquellos puntos en los que se necesite una sola copia que debe
estar accesible para todos los objetos heredados por la clase en la que la variable fue declarada. Por
ejemplo, las variables de clase se utilizan frecuentemente confinalpara definir constantes (esto es
ms eficiente en el consumo de memoria, ya que las constantes no pueden cambiar y slo se necesita
unacopia).
Similarmente, cuando se declare un mtodo, se puede especificar que el mtodo es un mtodo de
clase en vez de un mtodo de ejemplar. Los mtodos de clase slo pueden operar con variables de
claseynopuedenaccederalasvariablesdeejemplardefinidasenlaclase.
Para especificar que un mtodo es un mtodo de clase, se utiliza la palabra clavestaticen la
declaracin de mtodo. Cambiemos la clase UnEnteroLlamadoX para que su variable miembroxsea de
nuevounavariabledeejemplar,ysusdosmtodosseanahoramtodosdeclase.
classUnEnteroLlamadoX{
privateintx
staticpublicintx(){
returnx
}
staticpublicvoidsetX(intnewX){
x=newX
}
}
CuandoseintentecompilarestaversindeUnEnteroLlamadoX,seobtendrnerroresdecompilacin.
UnEnteroLlamadoX.java:4: Can't make a static reference to nonstatic
variablexinclassUnEnteroLlamadoX.
returnx
^
UnEnteroLlamadoX.java:7: Can't make a static reference to nonstatic
variablexinclassUnEnteroLlamadoX.
x=newX
^
2errors
Esto es porque los mtodos de la clase no pueden acceder a variables de ejemplar a menos que el
mtodo haya creado un ejemplar de UnEnteroLlamadoX primero y luego acceda a la variable a travs de
l.
ConstruyamosdenuevoUnEnteroLlamadoXparahacerquesuvariablexseaunavariabledeclase.
classUnEnteroLlamadoX{
staticprivateintx
staticpublicintx(){
returnx
}
staticpublicvoidsetX(intnewX){
x=newX
}
}
Ahora la clase se compilar y el cdigo anterior que crea dos ejemplares de UnEnteroLlamadoX,
seleccionasusvaloresx,ymuestraensusalidalosvaloresdex.
miX.x=2
otroX.x=2
De nuevo, cambiarxa travs demiXtambin lo cambia para los otros ejemplares de
UnEnteroLlamadoX.
Otra diferencia entre miembros del ejemplar y de la clase es que los miembros de la clase son
accesibles desde la propia clase. No se necesita ejemplarizar la clase para acceder a los miembros de
clase.
Reescribamos el cdigo anterior para acceder ax()ysetX()directamente desde la clase
UnEnteroLlamadoX.
...
UnEnteroLlamadoX.setX(1)
System.out.println("UnEnteroLlamadoX.x="+UnEnteroLlamadoX.x())
...
Observa que ya no se tendr que crearmiXuotroX. Se puede seleccionarxy recuperarlo
directamente desde la clase UnEnteroLlamadoX. No se puede hacer esto con miembros del ejemplar.
Solo se puede invocar mtodos de ejemplar a travs de un objeto y slo puede acceder a las variables
de ejemplar desde un objeto. Se puede acceder a las variables y mtodos de clase desde un ejemplar
delaclaseodesdelaclasemisma.
ControlarelAccesoalosMiembrosdelaClase
o Private
o Protected
o Public
o AccesodePaquete
ControlarelAccesoalosMiembrosdelaClase
Uno de los beneficos de las clases es que pueden proteger sus variables y mtodos miembros frente al
acceso de otros objetos. Por qu es esto importante? Bien, consideremos esto. Se ha escrito una clase
que representa una peticin a una base de datos que contiene toda clase de informacin secreta, es
decir,registrosdeempleadosoproyectossecretosdelacompaia.
Ciertas informaciones y peticiones contenidas en la clase, las soportadas por los mtodos y variables
accesibles pblicamente en su objeto son correctas para el consumo de cualquier otro objeto del
sistema. Otras peticiones contenidas en la clase son slo para el uso personal de la clase. Estas otras
soportadas por la operacin de la clase no deberan ser utilizadas por objetos de otros tipos. Se querra
proteger esas variables y mtodos personales a nivel del lenguaje y prohibir el acceso desde objetos de
otrostipos.
En Java se pueden utilizar los especificadores de acceso para proteger tanto las variables como los
mtodos de la clase cuando se declaran. El lenguaje Java soporta cuatro niveles de acceso para las
variablesymtodosmiembros:private,protected,public,y,todavanoespecificado,accesodepaquete.
Lasiguientetablalemuestralosnivelesdeaccesopemitidosporcadaespecificador.
Especificad
or
clas
e
subclas
e
paquet
e
mundo
private X
protected X X* X
public X X X X
package X X
La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de
acceso. La segunda columna indica si las subclases de la clase (sin importar dentro de que paquete se
encuentren estas) tienen acceso a los miembros. La tercera columna indica si las clases del mismo
paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. La cuarta columna
indicasitodaslasclasestienenaccesoalosmiembros.
Observa que la interseccin entre protected y subclase tiene un '*' este caso de acceso particular tiene
unaexplicacinenmsdetallemsadelante.
Echemosunvistazoacadaunodelosnivelesdeaccesomsdetalladamente.
Private
El nivel de acceso ms restringido es private. Un miembro privado es accesible slo para la clase en la
que est definido. Se utiliza este acceso para declarar miembros que slo deben ser utilizados por la
clase. Esto incluye las variables que contienen informacin que si se accede a ella desde el exterior
podra colocar al objeto en un estado de inconsistencia, o los mtodos que llamados desde el exterior
pueden poner en peligro el estado del objeto o del programa donde se est ejecutando. Los miembros
privadossoncomosecretos,nuncadebencontarseleanadie.
Para declarar un miembro privado se utiliza la palabra claveprivateen su declaracin. La clase
siguientecontieneunavariablemiembroyunmtodoprivados.
classAlpha{
privateintsoyPrivado
privatevoidmetodoPrivado(){
System.out.println("metodoPrivado")
}
}
Los objetos del tipo Alpha pueden inspeccionar y modificar la variablesoyPrivadoy pueden invocar el
mtodometodoPrivado(), pero los objetos de otros tipos no pueden acceder. Por ejemplo, la clase
Betadefinidaaqu.
classBeta{
voidmetodoAccesor(){
Alphaa=newAlpha()
a.soyPrivado=10//ilegal
a.metodoPrivado()//ilegal
}
}
no puede acceder a la variablesoyPrivadoni al mtodometodoPrivado()de un objeto del tipo
AlphaporqueBetanoesdeltipoAlpha.
Si una clase est intentando acceder a una variable miembro a la que no tiene accesoel compilador
mostrarunmensajedeerrorsimilaraesteynocompilarsuprograma.
Beta.java:9:VariableiamprivateinclassAlphanotaccessiblefromclassBeta.
a.iamprivate=10//ilegal
^
1error
Y si un programa intenta acceder a un mtodo al que no tiene acceso, generar un error de compilacin
parecidoaeste.
Beta.java:12:NomethodmatchingprivateMethod()foundinclassAlpha.
a.privateMethod()//ilegal
1error
Protected
El siguiente especificador de nivel de acceso es 'protected' que permite a la propia clase, las subclases
(con la excepcin a la que nos referimos anteriormente), y todas las clases dentro del mismo paquete
que accedan a los miembros. Este nivel de acceso se utiliza cuando es apropiado para una subclase de
la clase tener acceso a los miembros, pero no las clases no relacionadas. Los miembros protegidos son
como secretos familiares no importa que toda la familia lo sepa, incluso algunos amigos allegados
peronosequierequelosextraoslosepan.
Para declarar un miembro protegido, se utiliza la palabra claveprotected. Primero echemos un
vistazoacmoafectaesteespecificadordeaccesoalasclasesdelmismopaquete.
Consideremos esta versin de la clase Alpha que ahora se declara para estar incluida en el paquete
Griegoyquetieneunavariableyunmtodoquesonmiembrosprotegidos.
packageGriego
classAlpha{
protectedintestoyProtegido
protectedvoidmetodoProtegido(){
System.out.println("metodoProtegido")
}
}
Ahora, supongamos que la clase Gamma, tambin est declarada como miembro del paquete Griego (y
no es una subclase de Alpha). La Clase Gamma puede acceder legalmente al
miembroestoyProtegidodel objeto Alpha y puede llamar legalmente a su
mtodometodoProtegido().
packageGriego
classGamma{
voidmetodoAccesor(){
Alphaa=newAlpha()
a.estoyProtegido=10//legal
a.metodoProtegido()//legal
}
}
Esto es muy sencillo. Ahora, investiguemos cmo afecta el especificador protected a una subclase de
Alpha.
Introduzcamos una nueva clase, Delta, que desciende de la clase Alpha pero reside en un paquete
diferente Latin. La clase Delta puede acceder tanto aestoyProtegidocomo
ametodoProtegido(), pero solo en objetos del tipo Delta o sus subclases. La clase Delta no puede
acceder aestoyProtegidoometodoProtegido()en objetos del tipo
Alpha.metodoAccesor()en el siguiente ejemplo intenta acceder a la variable
miembroestoyProtegidode un objeto del tipo Alpha, que es ilegal, y en un objeto del tipo Delta que
eslegal.
Similarmente,metodoAccesor()intenta invocar ametodoProtegido()en un objeto del tipo
Alpha,quetambinesilegal.
importGriego.*
packageLatin
classDeltaextendsAlpha{
voidmetodoAccesor(Alphaa,Deltad){
a.estoyProtegido=10//ilegal
d.estoyProtegido=10//legal
a.metodoProtegido()//ilegal
d.metodoProtegido()//legal
}
}
Si una clase es una subclase o se cuentra en el mismo paquete de la clase con el miembro protegido, la
clasetieneaccesoalmiembroprotegido.
Public
El especificador de acceso ms sencillo es 'public'. Todas las clases, en todos los paquetes tienen
acceso a los miembros pblicos de la clase. Los miembros pblicos se declaran slo si su acceso no
produce resultados indeseados si un extrao los utiliza. Aqu no hay secretos familiares no importa que
losepatodoelmundo.
Paradeclararunmiembropblicoseutilizalapalabraclavepublic.Porejemplo,
packageGriego
classAlpha{
publicintsoyPublico
publicvoidmetodoPublico(){
System.out.println("metodoPublico")
}
}
Reescribamos nuestra clase Beta una vez ms y la ponemos en un paquete diferente que la clase Alpha
ynosaseguramosquenoestnrelacionadas(noesunasubclase)deAlpha.
importGriego.*
packageRomano
classBeta{
voidmetodoAccesor(){
Alphaa=newAlpha()
a.soyPublico=10//legal
a.metodoPublico()//legal
}
}
Como se puede ver en el ejemplo anterior, Beta puede inspeccionar y modificar legalmente la
variablesoyPublicoenlaclaseAlphaypuedellamarlegalmentealmtodometodoPublico().
AccesodePaquete
Y finalmente, el ltimo nivel de acceso es el que se obtiene si no se especifica ningn otro nivel de
acceso a los miembros. Este nivel de acceso permite que las clases del mismo paquete que la clase
tengan acceso a los miembros. Este nivel de acceso asume que las clases del mismo paquete son
amigas de confianza. Este nivel de confianza es como la que extiende a sus mejores amigos y que
inclusonolatieneconsufamilia.
Por ejemplo, esta versin de la clase Alpha declara una variable y un mtodo con acceso de paquete.
AlpharesideenelpaqueteGriego.
packageGriego
classAlpha{
intestoyEmpaquetado
voidmetodoEmpaquetado(){
System.out.println("metodoEmpaquetado")
}
}
LaclaseAlphatieneaccesoaestoyEmpaquetadoyametodoEmpaquetado().
Adems, todas las clases declaradas dentro del mismo paquete como Alpha tambin tienen acceso
aestoyEmpaquetadoymetodoEmpaquetado().
SupongamosquetantoAlphacomoBetasondeclaradascomopartedelpaqueteGriego.
packageGriego
classBeta{
voidmetodoAccesor(){
Alphaa=newAlpha()
a.estoyEmpaquetado=10//legal
a.metodoEmpaquetado()//legal
}
}
EntoncesBetapuedeaccederlegalmenteaestoyEmpaquetadoymetodoEmpaquetado().
Constructores
Constructores
Todas las clases Java tienen mtodos especiales llamados Constructores que se utilizan para inicializar
un objeto nuevo de ese tipo. Los contructores tienen el mismo nombre que la clase el nombre del
constructor de la clase Rectangle esRectangle(), el nombre del constructor de la clase Thread
esThread(),etc...
Java soporta la sobrecarga de los nombres de mtodos, por lo que una clase puede tener cualquier
nmero de constructores, todos los cuales tienen el mismo nombre. Al igual que otros mtodos
sobrecargados,losconstructoressediferencianunosdeotrosenelnmeroytipodesusargumentos.
Consideremos la clase Rectangle del paquete java.awt que proporciona varios constructores diferentes,
todos llamadosRectangle(), pero cada uno con nmero o tipo diferentes de argumentos a partir de
los cuales se puede crear un nuevo objeto Rectangle. Aqu tiene las firmas de los constructores de la
clasejava.awt.Rectangle.
publicRectangle()
publicRectangle(intwidth,intheight)
publicRectangle(intx,inty,intwidth,intheight)
publicRectangle(Dimensionsize)
publicRectangle(Pointlocation)
publicRectangle(Pointlocation,Dimensionsize)
El primer constructor de Rectangle inicializa un nuevo Rectangle con algunos valores por defecto
razonables, el segundo constructor inicializa el nuevo Rectangle con la altura y anchura especificadas,
el tercer constructor inicializa el nuevo Rectangle en la posicin especificada y con la altura y anchura
especificadas,etc...
Tpicamente, un constructor utiliza sus argumentos para inicializar el estado del nuevo objeto. Entonces,
cuando se crea un objeto, se debe elegir el constructor cuyos argumentos reflejen mejor cmo se
quiereinicializarelobjeto.
Basndose en el nmero y tipos de los argumentos que se pasan al constructor, el compilador
determinacualdeellosutilizar,Aselcompiladorsabequecuandoseescribe.
newRectangle(0,0,100,200)
elcompiladorutilizarelconstructorquerequierecuatroargumentosenteros,ycuandoseescribe.
newRectangle(miObjetoPoint,miObjetoDimension)
utilizarelconstructorquerequierecomoargumentosunobjetoPointyunobjetoDimension.
Cuando escribas tus propias clases, no tienes porque proporcionar constructores. El constructor por
defecto, el constructor que no necesita argumentos, lo proporciona automticamente el sistema para
todas las clases. Sin embargo, frecuentemente se querr o necesitar proporcionar constructores para
lasclases.
Se puede declarar e implementar un constructor como se hara con cualquier otro mtodo en una clase.
El nombre del constructor debe ser el mismo que el nombre de la clase y, si se proporciona ms de un
constructor, los argumentos de cada uno de los constructores deben diferenciarse en el nmero o tipo.
Nosetienequeespecificarelvalorderetornodelconstructor.
El constructor para esta subclase de Thread, un hilo que realiza animacin, selecciona algunos valores
pordefectocomolavelocidaddecuadro,elnmerodeimgenesycargalaspropiasimgenes.
classAnimationThreadextendsThread{
intframesPerSecond
intnumImages
Image[]images
AnimationThread(intfps,intnum){
inti
super("AnimationThread")
this.framesPerSecond=fps
this.numImages=num
this.images=newImage[numImages]
for(i=0i<=numImagesi++){
...
//Cargalasimgenes
...
}
}
}
Observa cmo el cuerpo de un constructor es igual que el cuerpo de cualquier otro mtodo contiene
declaraciones de variables locales, bucles, y otras sentencias. Sin embargo, hay una lnea en el
constructordeAnimationThreadquenoseverenunmtodonormallasegundalnea.
super("AnimationThread")
Esta lnea invoca al constructor proporcionado por la superclase de AnimationThreadThread. Este
constructor particular de Thread acepta una cadena que contiene el nombre del Thread. Frecuentemente
unconstructorseaprovechardelcdigodeinicializacinescritoparalasuperclasedelaclase.
En realidad, algunas clases deben llamar al constructor de su superclase para que el objeto trabaje de
forma apropiada. Tpicamente, llamar al constructor de la superclase es lo primero que se hace en el
constructordelasubclase:unobjetodeberealizarprimerolainicializacindenivelsuperior.
Cuando se declaren constructores para las clases, se pueden utilizar los especificadores de acceso
normalesparaespecificarsiotrosobjetospuedencrearejemplaresdesuclase.
private
protected
public
packageaccess
EscribirunMtodofinalize()
EscribirunMtodofinalize()
Antes de que un objeto sea recolectado por el recolector de basura, el sistema llama al
mtodofinalize(). La intencin de este mtodo es liberar los recursos del sistema, como ficheros o
conexionesabiertasantesdeempezarlarecoleccin.
Una clase puede proporcionar esta finalizacin simplemente definiendo e implementando un mtodo
llamadofinalize().Elmtodofinalize()debedeclararsedelasiguienteforma.
protectedvoidfinalize()throwsthrowable
Estaclaseabreunficherocuandoseconstruye.
classAbrirUnFichero{
FileInputStreamunFichero=null
AbrirUnFichero(StringnombreFichero){
try{
unFichero=newFileInputStream(nombreFichero)
}catch(java.io.FileNotFoundExceptione){
System.err.println("Nosepudoabrirelfichero"+nombreFichero)
}
}
}
Para un buen comportamiento, la clase AbrirUnFichero debera cerrar el fichero cuando haya finalizado.
Aqutieneselmtodofinalize()paralaclaseAbrirUnFichero.
protectedvoidfinalize()throwsthrowable{
if(unFichero!=null){
unFichero.close()
unFichero=null
}
}
El mtodofinalize()est declarado en la clase java.lang.Object. As cuando escribas un
mtodofinalize()para tus clases ests sobreescribiendo el de su superclase. EnSobreescribir
Mtodosencontrarsmsinformacinsobrelasobreescriturademtodos.
Si la superclase tiene un mtodofinalize(), probablemente este mtodo deber llamar al
mtodofinalize()de su superclase despus de haber terminado sus tareas de limpieza. Esto limpiar
cualquierrecursoobtenidosinsaberloatravsdelosmtodosheredadosdesdelasuperclase.
protectedvoidfinalize()throwsThrowable{
...
//aquvaelcdigodelimpiezadeestaclase
...
super.finalize()
}
Subclases,SuperclasesyHerencia
Subclases,SuperclasesyHerencia
En Java, como en otros lenguajes de programacin orientados a objetos, las clases pueden derivar
desde otras clases. La clase derivada (la clase que proviene de otra clase) se llama subclase. La clase
delaqueestderivadasedenominasuperclase.
De hecho, en Java, todas las clases deben derivar de alguna clase. Lo que nos lleva a la cuestin
Dnde empieza todo esto?. La clase ms alta, la clase de la que todas las dems descienden, es la
claseObject,definidaenjava.lang.Objecteslarazdelaherenciadetodaslasclases.
Las subclases heredan el estado y el comportamiento en forma de las variables y los mtodos de su
superclase. La subclase puede utilizar los tems heredados de su superclase tal y como son, o puede
modificarlos o sobreescribirlos. Por eso, segn se va bajando por el rbol de la herencia, las clases se
conviertenenmsymsespecializadas.
Definicin:
Una subclase es una clase que desciende de otra clase. Una subclase hereda el estado y el
comportamiento de todos sus ancestros. El trmino superclase se refiere a la clase que es el ancestro
msdirecto,ascomoatodaslasclasesascendentes.
CrearSubclases
o Quvariablesmiembroheredaunasubclase?
o OcultarVariablesMiembro
o QumtodosheredaunaSubclase?
o SobreescribirMtodos
CrearSubclases
Se declara que un clase es una subclase de otra clase dentro deLa declaracin de Clase. Por
ejemplo, supongamos que queremos crear una subclase llamada SubClase de otra clase llamada
SuperClase.Seescribiraesto.
classSubClassextendsSuperClass{
...
}
Esto declara que SubClase es una subclase de SuperClase. Y tambin declara implcitamene que
SuperClase es la superclase de SubClase. Una subclase tambin hereda variables y miembros de las
superclases de su superclase, y as a lo largo del rbol de la herencia. Para hacer esta explicacin un
poco ms sencilla, cuando este tutorial se refiere a la superclase de una clase significa el ancestro ms
directodelaclaseascomoatodassusclasesascendentes.
UnaclaseJavaslopuedetenerunasuperclasedirecta.Javanosoportalaherenciamltiple.
Crear una subclase puede ser tan sencillo como incluir la clausulaextendsen la declaracin de la
clase. Sin embargo, normalmente se deber realizar alguna cosa ms cuando se crea una subclase,
comosobreescribirmtodos,etc...
Quvariablesmiembroheredaunasubclase?
Regla:
Unasubclaseheredatodaslasvariablesmiembrosdesusuperclasequepuedanseraccesibles
desdelasubclase(amenosquelavariablemiembroestocultaenlasubclase).
Estoes,lassubclases.
heredanaquellasvariablesmiembrosdeclaradascomopublicoprotected
heredan aquellas variables miembros declaradas sin especificador de acceso (normalmente
conocidascomo"Amigas")siemprequelasubclaseestenelmismopaquetequelaclase
no hereda las variables miembros de la superclase si la subclase declara una variable miembro que
utiliza el mismo nombre. La variable miembro de la subclase se dice que oculta a la variable
miembrodelasuperclase.
noheredalasvariablesmiembroprivate
OcultarVariablesMiembro
Como se mencion en la seccin anterior, las variables miembros definidas en la subclase ocultan las
variablesmiembroquetienenelmismonombreenlasuperclase.
Como esta caracterstica del lenguaje Java es poderosa y conveniente, puede ser una fuente de errores:
ocultar una variable miembro puede hacerse deliberadamente o por accidente. Entonces, cuando
nombres tus variables miembro se cuidadoso y oculta slo las variables miembro que realmente deseas
ocultar.
Una caracteristica interesante de las variables miembro en Java es que una clase puede acceder a una
variablemiembroocultaatravsdesusuperclase.Considereesteparejadesuperclaseysubclase.
classSuper{
NumberunNumero
}
classSubextendsSuper{
FloatunNumero
}
La variableunNumerode Sub oculta a la variableunNumerode Super. Pero se puede acceder a la
variabledelasuperclaseutilizando.
super.unNumero
superes una palabra clave del lenguaje Java que permite a un mtodo referirse a las variables ocultas
ymtodossobreescritosdeunasuperclase.
QumtodosheredaunaSubclase?
La regla que especifica los mtodos heredados por una subclase es similar a la de las variables
miembro.
Regla:
Unasubclaseheredatodoslosmtodosdesussuperclasequesonaccesiblesparalasubclase(a
menosqueelmtodoseasobreescritoporlasubclase).
Estoes,unaSubclase.
heredaaquellosmtodosdeclaradoscomopublicoprotected
hereda aquellos mtodos sin especificador de acceso, siempre que la subclase est en el mismo
paquetequelaclase.
no hereda un mtodo de la superclase si la subclase declara un mtodo que utiliza el mismo
nombre.Sedicequeelmtododelasubclasesobreescribealmtododelasuperclase.
noheredalosmtodosprivate.
SobreescribirMtodos
La habilidad de una subclase para sobreescribir un mtodo de su superclase permite a una clase heredar
de su superclase aquellos comportamientos "ms cercanos" y luego suplementar o modificar el
comportamientodelasuperclase.
SobreescribirMtodos
o ReemplazarlaImplementacindeunMtododeunaSuperclase
o AadirImplementacinaunMtododelaSuperclase
o MtodosqueunaSubclasenoPuedeSobreescibir
o MtodosqueunaSubclasedebeSobreescribir
SobreescribirMtodos
Una subclase puede sobreescribir completamente la implementacin de un mtodo heredado o puede
mejorarelmtodoaadiendolefuncionalidad.
Reemplazar la Implementacin de un Mtodo de una
Superclase
Algunas veces, una subclase querra reemplazar completamente la implementacin de un mtodo de su
superclase. De hecho, muchas superclases proporcionan implementaciones de mtodos vacas con la
esperanza de que la mayora, si no todas, sus subclases reemplacen completamente la implementacin
deesemtodo.
Un ejemplo de esto es el mtodorun()de la clase Thread. La clase Thread proporciona una
implementacin vaca (el mtodo no hace nada) para el mtodorun(), porque por definicin, este
mtodo depende de la subclase. La clase Thread posiblemente no puede proporcionar una
implementacinmedianamenterazonabledelmtodorun().
Para reemplazar completamente la implementacin de un mtodo de la superclase, simplememte se
llama a un mtodo con el mismo nombre que el del mtodo de la superclase y se sobreescribe el
mtodoconlamismafirmaqueladelmtodosobreescrito.
classThreadSegundoPlanoextendsThread{
voidrun(){
...
}
}
La clase ThreadSegundoPlano sobreescribe completamente el mtodorun()de su superclase y
reemplazacompletamentesuimplementacin.
AadirImplementacinaunMtododelaSuperclase
Otras veces una subclase querr mantener la implementacin del mtodo de su superclase y
posteriormente ampliar algn comportamiento especfico de la subclase. Por ejemplo, los mtodos
constructores de una subclase lo hacen normalmentela subclase quiere preservar la inicializacin
realizadaporlasuperclase,peroproporcionainicializacinadicionalespecficadelasubclase.
Supongamos que queremos crear una subclase de la clase Windows del paquete java.awt. La clase
WindowstieneunconstructorquerequiereunargumentodeltipoFramequeeselpadredelaventana.
publicWindow(Frameparent)
Este constructor realiza alguna inicializacin en la ventana para que trabaje dentro del sistema de
ventanas. Para asegurarnos de que una subclase de Windows tambin trabaja dentro del sistema de
ventanas,deberemosproporcionarunconstructorquerealicelamismainicializacin.
Mucho mejor que intentar recrear el proceso de inicializacin que ocurre dentro del constructor de
Windows, podramos utilizar lo que la clase Windows ya hace. Se puede utilizar el cdigo del constructor
deWindowsllammdolodesdedentrodelconstructordelasubclaseWindow.
classVentanaextendsWindow{
publicVentana(Frameparent){
super(parent)
...
//Ventanaespecificasuinicializacinaqu
...
}
}
El constructor deVentanallama primero al constructor de su superclase, y no hace nada ms.
Tpicamente, este es el comportamiento deseado de los constructoreslas superclases deben tener la
oportunidad de realizar sus tareas de inicializacin antes que las de su subclase. Otros tipos de
mtodospodranllamaralconstructordelasupeclasealfinaldelmtodooenelmedio.
MtodosqueunaSubclasenoPuedeSobreescibir
Una subclase no puede sobreescribir mtodos que hayan sido declarados comofinalen la
superclase (por definicin, los mtodos finales no pueden ser sobreescritos). Si intentamos
sobreescribir un mtodo final, el compilador mostrar un mensaje similar a este y no compilar el
programa.
FinalTest.java:7: Final methods can't be overriden. Method void
iamfinal()
isfinalinclassClassWithFinalMethod.
voidiamfinal(){
^
1error
Paraunaexplicacinsobrelosmtodosfinales,puedesver:EscribirMtodosyClasesFinales.
Una subclase tampoco puede sobreescribir mtodos que se hayan declarado comostaticen la
superclase. En otras palabras, una subclase no puede sobreescribir un mtodo de clase. Puedes
verMiembros del Ejemplar y de la Clasepara obtener una explicacin sobre los mtodos de
clase.
MtodosqueunaSubclasedebeSobreescribir
Las subclases deben sobreescribir aquellos mtodos que hayan sido declarados comoabstracten la
superclase, o la propia subclase debe ser abstracta.Escribir Clases y Mtodos Abstractosexplica con
msdetallelosmtodosyclasesabstractos.
EscribirClasesyMtodosFinales
o MtodosFinales
EscribirClasesyMtodosFinales
Se puede declarar que una clase sea final esto es, que la clase no pueda tener subclases. Existen (al
menos)dosrazonesporlasquesequerrahaceresto:razonesdeseguridadydediseo.
Seguridad: Un mecanismo que los hackers utilizan para atacar sistemas es crear subclases de una
clase y luego sustituirla por el original. Las subclases parecen y sienten como la clase original pero
hacen cosas bastante diferentes, probablemente causando daos u obteniendo informacin privada. Para
prevenir esta clase de subversin, se puede declarar que la clase sea final y as prevenir que se cree
cualquiersubclase.
La clase String del paquete java.lang es una clase final slo por esta razn. La clase String es tan vital
para la operacin del compilador y del intrprete que el sistema Java debe garantizar que siempre que
un mtodo o un objeto utilicen un String, obtenga un objeto java.lang.String y no algn otro string. Esto
aseguraqueningnstringtendrpropiedadesextraas,incosistentesoindeseables.
Si se intenta compilar una subclase de una clase final, el compilador mostrar un mensaje de error y no
compilar el programa. Adems, los bytescodes verifican que no est teniendo lugar una subversin, al
niveldebytecomprobandoqueunaclasenoesunasubclasedeunaclasefinal.
Diseo: Otra razn por la que se podra querer declarar una clase final son razones de diseo
orientado a objetos. Se podra pensar que una clase es "perfecta" o que, conceptualmente hablando, la
clasenodeberatenersubclases.
Para especificar que una clase es una clase final, se utiliza la palabra clavefinalantes de la palabra
claveclassen la declaracin de la clase. Por ejemplo, si quisieramos declarar AlgoritmodeAjedrez
comounaclasefinal(perfecta),ladeclaracinsepareceraaesto.
finalclassAlgoritmodeAjedrez{
...
}
Cualquier intento posterior de crear una subclase de AlgoritmodeAjedrez resultar en el siguiente error
delcompilador.
Chess.java:6:Can'tsubclassfinalclasses:classAlgoritmodeAjedrez
classMejorAlgoritmodeAjedrezextendsAlgoritmodeAjedrez{
^
1error
MtodosFinales
Si la creaccin de clases finales parece algo dura para nuestras necesidades, y realmente lo que se
quiere es proteger son algunos mtodos de una clase para que no sean sobreescritos, se puede utilizar
la palabra clavefinalen la declaracin de mtodo para indicar al compilador que este mtodo no puede
sersobreescritoporlassubclases.
Se podra desear hacer que un mtodo fuera final si el mtodo tiene una implementacin que no debe
ser cambiada y que es crtica para el estado consistente del objeto. Por ejemplo, en lugar de hacer
AlgoritmodeAjedrez como una clase final, podramos hacersiguienteMovimiento()como un mtodo
final.
classAlgoritmodeAjedrez{
...
finalvoidsiguienteMovimiento(PiezapiezaMovida,
PosicionenTableronuevaPosicion){
}
...
}
EscribirClasesyMtodosAbstractos
o MtodosAbstractos
EscribirClasesyMtodosAbstractos
Algunas veces, una clase que se ha definido representa un concepto abstracto y como tal, no debe ser
ejemplarizado. Por ejemplo, la comida en la vida real. Has visto algn ejemplar de comida? No. Lo que
has visto son ejemplares de manzanas, pan, y chocolate. Comida representa un concepto abstracto de
cosasquesoncomestibles.Notienesentidoqueexistaunejemplardecomida.
Similarmente en la programacin orientada a objetos, se podran modelar conceptos abstractos pero no
querer que se creen ejemplares de ellos. Por ejemplo, la clase Number del paquete java.lang representa
el concepto abstracto de nmero. Tiene sentido modelar nmeros en un programa, pero no tiene sentido
crear un objeto genrico de nmeros. En su lugar, la clase Number slo tiene sentido como superclase
de otras clases como Integer y Float que implementan nmeros de tipos especficos. Las clases como
Number, que implementan conceptos abstractos y no deben ser ejemplarizadas, son llamadas clases
abstractas. Una clase abstracta es una clase que slo puede tener subclasesno puede ser
ejemplarizada.
Para declarar que una clase es un clase abstracta, se utiliza la palabra claveabstracten la
declaracindelaclase.
abstractclassNumber{
...
}
Si se intenta ejemplarizar una clase abstracta, el compilador mostrar un error similar a este y no
compilarelprograma.
AbstractTest.java:6: class AbstractTest is an abstract class. It can't be
instantiated.
newAbstractTest()
^
1error
MtodosAbstractos
Una clase abstracta puede contener mtodos abstractos, esto es, mtodos que no tienen
implementacin. De esta forma, una clase abstracta puede definir un interface de programacin
completo, incluso porporciona a sus subclases la declaracin de todos los mtodos necesarios para
implementar el interface de programacin. Sin embargo, las clases abstractas pueden dejar algunos
detallesotodalaimplementacindeaquellosmtodosasussubclases.
Veamos un ejemplo de cuando sera necesario crear una clase abstracta con mtodos abstractos. En
una aplicacin de dibujo orientada a objetos, se pueden dibujar crculos, rectngulos, lneas, etc.. Cada
uno de esos objetos grficos comparten ciertos estados (posicin, caja de dibujo) y comportamiento
(movimiento, redimensionado, dibujo). Podemos aprovecharnos de esas similitudes y declararlos todos
apartirdeunmismoobjetopadreObjetoGrafico.
Sin embargo, los objetos grficos tambin tienen diferencias subtanciales: dibujar un crculo es bastante
diferente a dibujar un rectngulo. Los objetos grficos no pueden compartir estos tipos de estados o
comportamientos. Por otro lado, todos los ObjetosGraficos deben saber como dibujarse a s mismos se
diferencianencmosedibujanunosyotros.Estaeslasituacinperfectaparaunaclaseabstracta.
Primero se debe declarar una clase abstracta, ObjetoGrafico, para proporcionar las variables miembro y
los mtodos que van a ser compartidos por todas las subclases, como la posicin actual y el
mtodomoverA().
Tambin se deberan declarar mtodos abstractos comodibujar(), que necesita ser implementado por
todas las subclases, pero de manera completamente diferente (no tiene sentido crear una
implementacinpordefectoenlasuperclase).LaclaseObjetoGraficosepareceraaesto.
abstractclassObjetoGrafico{
intx,y
...
voidmoverA(intnuevaX,intnuevaY){
...
}
abstractvoiddibujar()
}
Todas las subclases no abstractas de ObjetoGrafico como son Circulo o Rectangulo debern proprocionar
unaimplementacinparaelmtododibujar().
classCirculoextendsObjetoGrafico{
voiddibujar(){
...
}
}
classRectanguloextendsObjetoGrafico{
voiddibujar(){
...
}
}
Una clase abstracta no necesita contener un mtodo abstracto. Pero todas las clases que contengan un
mtodo abstracto o no proporcionen implementacin para cualquier mtodo abstracto declarado en sus
superclasesdebeserdeclaradacomounaclaseabstracta.
LaClaseObject
o Elmtodoequals()
o ElmtodogetClass()
o ElmtodotoString()
o OtrosmtodosdeObjectcubiertosenotrasleccionesosecciones
LaClaseObject
La clase Object est situada en la parte ms alta del rbol de la herencia en el entorno de desarrollo de
Java. Todas las clases del sistema Java son descendentes (directos o indirectos) de la clase Object.
Esta clase define los estados y comportamientos bsicos que todos los objetos deben tener, como la
posibilidad de compararse unos con otros, de convertirse a cadenas, de esperar una condicin variable,
denotificaraotrosobjetosquelacondicinvaribleacambiadoydevolverlaclasedelobjeto.
Elmtodoequals()
equals()se utiliza para comparar si dos objetos son iguales. Este mtodo devuelvetruesi los objetos
son iguales, ofalsesi no lo son. Observe que la igualdad no significa que los objetos sean el mismo
objeto.Consideremosestecdigoquecomparadosenteros.
Integeruno=newInteger(1),otroUno=newInteger(1)
if(uno.equals(otroUno))
System.out.println("LosobjetossonIguales")
Este cdigo mostrarLos objetos son IgualesaunqueunoyotroUnoreferencian a dos objetos
distintos.Selesconsideraigualesporquesucontenidoeselmismovalorentero.
Las clases deberan sobreescribir este mtodo proporcionando la comprobacin de igualdad apropiada.
Un mtodoequals()debera comparar el contenido de los objetos para ver si son funcionalmente
igualesydevolvertruesiesas.
ElmtodogetClass()
El mtodogetClass()es un mtodo final (no puede sobreescribirse) que devuelve una representacin
en tiempo de ejecucin de la clase del objeto. Este mtodo devuelve un objeto Class al que se le puede
pedir varia informacin sobre la clase, como su nombre, el nombre de su superclase y los nombres de
los interfaces que implementa. El siguiente mtodo obtiene y muestra el nombre de la clase de un
objeto.
voidPrintClassName(Objectobj){
System.out.println("LaclasedelObjetoes"+
obj.getClass().getName())
}
Un uso muy manejado del mtodogetClass()es crear un ejemplar de una clase sin conocer la clase
en el momento de la compilacin. Este mtodo de ejemplo, crea un nuevo ejemplar de la misma clase
queobjque puede ser cualquier clase heredada desde Object (lo que significa que podra ser cualquier
clase).
ObjectcreateNewInstanceOf(Objectobj){
returnobj.getClass().newInstance()
}
ElmtodotoString()
Este mtodo devuelve una cadena de texto que representa al objeto. Se puede utilizartoStringpara
mostrar un objeto. Por ejemplo, se podra mostrar una representacin del Thread actual de la siguiente
forma.
System.out.println(Thread.currentThread().toString())
System.out.println(newInteger(44).toString())
La representacin de un objeto depende enteramente del objeto. El String de un objeto entero es el
valor del entero mostrado como texto. El String de un objeto Thread contiene varios atributos sobre el
thread,comosunombreyprioridad.Porejemplo,lasdoslneasanterioresdaranlasiguientesalida.
Thread[main,5,main]
4
El mtodotoString()es muy til para depuracin y tambin puede sobreescribir este mtodo en todas
lasclases.
Otros mtodos de Object cubiertos en otras lecciones o
secciones
La clase Object proporciona un mtodo,finalize()que limpia un objeto antes de recolectar la basura.
Este mtodo se explica en la leccinEliminar Objetos no Utilizados. Tambin en:Escribir un
Mtodo finalize()puedes ver cmo sobreescribir este mtodo para manejar las necesidades de
finalizacindelasclases
LaclaseObjecttambimproporcionaotroscincomtodos.
notify()
notifyAll()
wait()(tresversiones)
que son crticos cuando se escriben programas Java con mltiples thread. Estos mtodos ayudan a
asegurarsequelosthreadestnsincronizadosysecubrenenThreadsdeControl.
QuesunInterface
o LosInterfacesNoProporcionanHerenciaMltiple
QuesunInterface
Definicin:
Un interface es una coleccin de definiciones de mtodos (sin implementaciones) y de valores
constantes.
Los interfaces se utilizan para definir un protocolo de comportamiento que puede ser implementado por
cualquierclasedelrboldeclases.
Losinterfacessontilespara.
capturarsimilitudesentreclasesnorelacionadassinforzarunarelacinentreellas.
declararmtodosqueunaovariasclasesnecesitanimplementar.
revelar el interface de programacin de un objeto sin recelar sus clases (los objetos de este tipo
son llamados objetos annimos y pueden ser tiles cuando compartas un paquete de clases con
otrosdesarrolladores).
En Java, un interface es un tipo de dato de referencia, y por tanto, puede utilizarse en muchos de los
sitios donde se pueda utilizar cualquier tipo (como en un argumento de mtodos y una declaracin de
variables).Podrsvertodoestoen:UtilizarunInterfacecomounTipo.
LosInterfacesNoProporcionanHerenciaMltiple
Algunas veces se tratra a los interfaces como una alternativa a la herencia mltiple en las clases. A
pesar de que los interfaces podran resolver algunos problemas de la herencia mltiple, son animales
bastantesdiferentes.Enparticular.
Nosepuedenheredarvariablesdesdeuninterface.
Nosepuedenheredarimplementacionesdemtodosdesdeuninterface.
La herencia de un interface es independiente de la herencia de la claselas clases que
implementanelmismointerfacepuedenonoestarrelacionadasatravsdelrboldeclases.
DefinirunInterface
o LaDeclaracindeInterface
o ElcuerpodelInterface
DefinirunInterface
ParacrearunInterface,sedebeescribirtantoladeclaracincomoelcuerpodelinterface.
declaraciondeInterface{
cuerpodeInterface
}
LaDeclaracin de Interfacedeclara varios atributos del interface, como su nombre o si se
extiende desde otro interface. ElCuerpo de Interfacecontiene las constantes y las declaraciones
demtodosdelInterface.
LaDeclaracindeInterface
Como mnimo, una declaracin de interface contiene la palabra claveinterfacey el nombre del
interfacequesevaacrear.
interfaceContable{
...
}
Nota: Por convencin, los nombres de interfaces empiezan con una letra mayscula al igual que las
clases.Frecuentementelosnombresdeinterfacesterminanen"able"o"ible".
Una declaracin de interface puede tener otros dos componentes: el especificador de accesopublicy
una lista de "superinterfaces". Un interface puede extender otros interfaces como una clase puede
extender o subclasificar otra case. Sin embargo, mientras que una clase slo puede extender una
superclase, los interfaces pueden extender de cualquier nmero de interfaces. As, una declaracin
completadeinterfacesepareceraaesto.
[public]interfaceNombredenterface[extendslistadeSuperInterfaces]{
...
}
El especificador de accesopublicindica que el interface puede ser utilizado por todas las clases en
cualquier paquete. Si el interface no se especifica como pblico, slo ser accesible para las clases
definidasenelmismopaquetequeelinterface.
La clausulaextendses similar a la utilizada en la declaracin de una clase, sin embargo, un interface
puede extender varios interfaces (mientras una clase slo puede extender una), y un interface no puede
extender clases. Esta lista de superinterfaces es un lista delimitada por comas de todos los interfaces
extendidosporelnuevointerface.
Un interface hereda todas las constantes y mtodos de sus superinterfaces a menos que el interface
oculteunaconstanteconelmismonombreoredeclareunmtodoconunanuevadeclaracin.
ElcuerpodelInterface
El cuerpo del interface contiene las declaraciones de mtodos para los mtodos definidos en el
interface.Implementar Mtodosmuestra cmo escribir una declaracin de mtodo. Adems de las
declaraciones de los mtodos, un interface puede contener declaraciones de constantes. EnDeclarar
Variables Miembrosexiste ms informacin sobre cmo construir una declaracin de una variable
miembro.
Nota:
Lasdeclaracionesdemiembrosenuninterfacenopermitenelusodealgunosmodificadoresy
desaconsejanelusodeotros.Nosepodrnutilizartransient,volatile,osynchronizedenuna
declaracindemiembroenuninterface.Tampocosepodrutilizarlos
especificadoresprivateyprotectedcuandosedeclarenmiembrosdeuninterface.
Todos los valores constantes definidos en un interface son implcitamente pblicos, estticos y finales.
El uso de estos modificadores en una declaracin de constante en un interface est desaconsejado por
falta de estilo. Similarmente, todos los mtodos declarados en un interface son implcitamente pblicos
yabstractos.
Este cdigo define un nuevo interface llamado coleccion que contiene un valor constante y tres
declaracionesdemtodos.
interfacecoleccion{
intMAXIMO=500
voidaadir(Objectobj)
voidborrar(Objectobj)
Objectbuscar(Objectobj)
intcontadorActual()
}
El interface anterior puede ser implementado por cualquier clase que represente una coleccin de
objetoscomopuedenserpilas,vectores,enlaces,etc...
Observa que cada declaracin de mtodo est seguida por un punto y coma () porque un interface no
proporcionaimplementacinparalosmtodosdeclaradosdentrodel.
UtilizarunInterface
UtilizarunInterface
Para utilizar un interface se debe escribir una clase que lo implemente. Una clase declara todos los
interfaces que implementa en su declaracin de clase. Para declarar que una clase implementa uno o
ms interfaces, se utiliza la palabra claveimplementsseguida por una lista delimitada por comas con
losinterfacesimplementadosporlaclase.
Por ejemplo, consideremos el interface coleccion presentado en la pginaanterior. Ahora, supongamos
que queremos escribir una clase que implemente un pila FIFO (primero en entrar, primero en salir).
Como una pila FIFO contiene otros objetos tiene sentido que implemente el interface coleccion. La clase
PilaFIFOdeclaraqueimplementaelinterfacecolecciondeestaforma.
classPilaFIFOimplementscoleccion{
...
voidaadir(Objectobj){
...
}
voidborrar(Objectobj){
...
}
Objectbuscar(Objectobj){
...
}
intcontadorActual(){
...
}
}
as se garantiza que proporciona implementacin para los
mtodosaadir(),borrar(),buscar()ycontadorActual().
Porconvencin,laclausulaimplementssiguealaclausulaextendssiesquestaexiste.
Observa que las firmas de los mtodos del interface coleccion implementados en la clase PilaFIFO debe
corresponderexactamenteconlasfirmasdelosmtodosdeclaradosenlainterfacecoleccion.
UtilizarunInterfacecomounTipo
UtilizarunInterfacecomounTipo
Como se mencion anteriormente, cuando se define un nuevo interface, en esencia se est definiendo
un tipo de referencia. Se pueden utilizar los nombres de interface en cualquier lugar donde se usara un
nombrededatodetiposprimitivosounnombrededatosdeltipodereferencia.
Por ejemplo, supongamos que se ha escrito un programa de hoja de clculo que contiene un conjunto
tabular de celdas y cada una contiene un valor. Querramos poder poner cadenas, fechas, enteros,
ecuaciones, en cada una de las celdas de la hoja. Para hacer esto, las cadenas, las fechas, los enteros
y las ecuaciones tienen que implementar el mismo conjunto de mtodos. Una forma de conseguir esto
es encontrar el ancestro comn de las clases e implementar ah los mtodos necesarios. Sin embargo,
esto no es una solucin prctica porque el ancestro comn ms frecuente es Object. De hecho, los
objetos que puede poner en las celdas de su hoja de clculo no estn relacionadas entre s, slo por la
claseObject.PeronopuedemodificarObject.
Una aproximacin podra ser escribir una clase llamada ValordeCelda que representara los valores que
pudiera contener una celda de la hoja de clculo. Entonces se podran crear distintas subclases de
ValordeCelda para las cadenas, los enteros o las ecuaciones. Adems de ser mucho trabajo, esta
aproximacin arbitraria fuerza una relacin entre esas clases que de otra forma no sera necesaria, y
deberaduplicareimplementardenuevoclasesqueyaexisten.
SepodradefiniruninterfacellamadoCellAblequesepareceraaesto.
interfaceCellAble{
voiddraw()
voidtoString()
voidtoFloat()
}
Ahora, supongamos que existen objetos Linea y Columna que contienen un conjunto de objetos que
implementan el interface CellAble. El mtodosetObjectAt()de la clase Linea se podra parecer a
esto.
classLinea{
privateCellAble[]contents
...
voidsetObjectAt(CellAbleca,intindex){
...
}
...
}
Observa el uso del nombre del interface en la declaracin de la variable miembrocontentsy en la
declaracin del argumentocadel mtodo. Cualquier objeto que implemente el interface CellAble, sin
importar que exista o no en el rbol de clases, puede estar contenido en el arraycontentsy podra ser
pasadoalmtodosetObjectAt().
CrearPaquetes
o CLASSPATH
CrearPaquetes
Los paquetes son grupos relacionados de clases e interfaces y proporcionan un mecanismo conveniente
para menejar un gran juego de clases e interfaces y evitar los conflictos de nombres. Adems de los
paquetes de Java puede crear tus propios paquetes y poner en ellos definiciones de clases y de
interfacesutilizandolasentenciapackage.
Supongamos que se est implementando un grupo de clases que representan una coleccin de objetos
grficos como crculos, rectngulos, lneas y puntos. Adems de estas clases tendrs que escribir un
interface Draggable para que en las clases que lo implementen pueda moverse con el ratn. Si quieres
que estas clases estn disponibles para otros programadores, puedes empaquetarlas en un paquete,
digamos,graphicsy entregar el paquete a los programadores (junto con alguna documentacin de
referencia,comoquhacenlasclasesylosinterfacesyquinterfacesdeprogramacinsonpblicos).
De esta forma, otros programadores pueden determinar fcilmente para qu es tu grupo de clases,
cmoutilizarlos,ycmorelacionarlosunosconotrosyconotrasclasesypaquetes.
Los nombres de clases no tienen conflictos con los nombres de las clases de otros paquetes porque las
clases y los interfaces dentro de un paquete son referenciados en trminos de su paquete
(tcnicamenteunpaquetecreaunnuevoespaciodenombres).
Sedeclaraunpaqueteutilizandolasentenciapackage.
packagegraphics
interfaceDraggable{
...
}
classCircle{
...
}
classRectangle{
...
}
La primera lnea del cdigo anterior crea un paquete llamadographics. Todas las clases e interfaces
definidas en el fichero que contiene esta sentencia son miembros del paquete. Por lo tanto, Draggable,
Circle,yRectanglesonmiembrosdelpaquetegraphics.
Los ficheros.classgenerados por el compilador cuando se compila el fichero que contiene el fuente
para Draggable, Circle y Rectangle debe situarse en un directorio llamadographicsen algn lugar del
pathCLASSPATH.CLASSPATHes una lista de directorios que indican al sistema donde ha instalado
varias clases e interfaces compiladas Java. Cuando busque una clase, el intrprete Java busca un
directorio en suCLASSPATHcuyo nombre coincida con el nombre del paquete del que la clase es
miembro. Los ficheros.classpara todas las clases e interfaces definidas en un paquete deben estar en
esedirectoriodepaquete.
Los nombres de paquetes pueden contener varios componentes (separados por puntos). De hecho, los
nombresdelospaquetesdeJavatienenvarioscomponentes:java.util,java.lang,etc...
Cada componente del nombre del paquete representa un directorio en el sistema de ficheros. As, los
ficheros.classdejava.utilestn en un directorio llamadoutilen otro directorio llamadojavaen
algnlugardelCLASSPATH.
CLASSPATH
Para ejecutar una aplicacin Java, se especifica el nombre de la aplicacin Java que se desea ejecutar
en el interprete Java. Para ejecutar un applet, se especifica el nombre del applet en una
etiqueta<APPLET>dentro de un fichero HTML. El navegador que ejecute el applet pasa el nombre del
applet al intrprete Java. En cualquier caso, la aplicacin o el applet que se est ejecutando podra estr
en cualquier lugar del sistema o de la red. Igualmemente, la aplicacin o el applet pueden utilizar otras
clasesyobjetosqueestnenlamismaodiferenteslocalizaciones.
Como las clases pueden estar en cualquier lugar, se debe indicar al interprete Java donde puede
encontrarlas. Se puede hacer esto con la variable de entorno CLASSPATH que comprende una lista de
directorios que contienen clases Java compiladas. La construccin de CLASSPATH depende de cada
sistema.
Cuando el interprete obtiene un nombre de clase, desde la lnea de comandos, desde un navegador o
desde una aplicacin o un applet, el interprete busca en todos los directorios de CLASSPATH hasta que
encuentralaclasequeestbuscando.
Se deber poner el directorio de nivel ms alto que contiene las clases Java en el CLASSPATH. Por
convencin, mucha gente tiene un directorio de clases en su directorio raz donde pone todo su cdigo
Java. Si tu tienes dicho directorio, deberas ponerlo en el CLASSPATH. Sin embargo, cuando se trabaja
con applets, es conveniente poner el applet en un directorioclasesdebajo del directorio donde est el
fichero HTML que contiene el applet. Por esta, y otras razones, es conveniente poner el directorio actual
enelCLASSPATH.
Las clases incluidas en el entorno de desarrollo Java estn disponibles automticamente porque el
interpreteaadeeldirectoriocorrectoalCLASSPATHcuandoarranca.
Observa que el orden es importante. Cuando el interprete Java est buscando una clase, busca por
orden en los directorios indicados en CLASSPATH hasta que encuentra la clase con el nombre correcto.
El interprete Java ejecuta la primera clase con el nombre correcto que encuentre y no busca en el resto
de directorios. Normalmente es mejor dar a las clases nombres nicos, pero si no se puede evitar,
asegrate de que el CLASSPATH busca las clases en el orden apropiado. Recuerda esto cuando
seleccionestuCLASSPATHyelrboldelcdigofuente.
Nota:
Todas las clases e interfaces pertenecen a un paquete. Incluso si no especifica uno con la
sentenciapackage. Si no se especifica las clases e interfaces se convierten en miembros del paquete
pordefecto,quenotienenombreyquesiempreesimportado.
UtilizarPaquetes
UtilizarPaquetes
Para importar una clase especfica o un interface al fichero actual (como la clase Circle desde el paquete
graphicscreadoenlaseccinanterior)seutilizalasentenciadeimport.
importgraphics.Circle
Esta sentencia debe estar al principio del fichero antes de cualquier definicin de clase o de interface y
hace que la clase o el interface est disponible para su uso por las clases y los interfaces definidos en el
fichero.
Si se quieren importar todas las clases e interfaces de un paquete, por ejemplo, el
paquetegraphicscompleto,seutilizalasentenciaimportconuncaractercomodn,unasterisco'*'.
importgraphics.*
Si intenta utilizar una clase o un interface desde un paquete que no ha sido importado, el compilador
mostraresteerror.
testing.java:4:ClassDatenotfoundintypedeclaration.
Datedate
^
Observa que slo las clases e intefaces declarados como pblicos pueden ser utilizados en clases fuera
delpaqueteenelquefuerondefinidos.
El paquete por defecto (un paquete sin nombre) siempre es importado. El sistema de ejecucin tambin
importaautomticamenteelpaquetejava.lang.
Si por suerte, el nombre de una clase de un paquete es el mismo que el nombre de una clase en otro
paquete, se debe evitar la ambigedad de nombres precediendo el nombre de la clase con el nombre
del paquete. Por ejemplo, previamente se ha definido una clase llamada Rectangle en el
paquetegraphics. El paquetejava.awttambin contiene una clase Rectangle. Si estos dos paquetes
sonimportadosenlamismaclase,elsiguientecdigoseraambigo.
Rectanglerect
EnestasituacinsetienequesermsespecficoeindicarexactamentequeclaseRectanglesequiere.
graphics.Rectanglerect
Se puede hacer esto anteponiento el nombre del paquete al nombre de la clase y separando los dos con
unpunto.
LosPaquetesJava
ElPaquetedeLenguajeJava
ElPaqueteI/OdeJava
ElPaquetedeUtilidadesdeJava
ElPaquetedeReddeJava
ElPaqueteApplet
LosPaquetesdeHerramientasparaVentanasAbstractas
LosPaquetesJava
ElentornodedesarrolloestandarddeJavacomprendeochopaquetes.
ElPaquetedeLenguajeJava
El paquete de lenguaje Java, tambin conocido comojava.lang, contiene las clases que son el
corazndellenguajeJava.Lasclasesdeestepaqueteseagrupandelasiguientemanera.
Object
TiposdeDatosEncubiertos
Strings
SystemyRuntime
Thread
Class
Math
Exceptions,ErrorsyThrowable
Process
El compilador importa automticamente este paquete. Ningn otro paquete se importa de forma
automtica.
ElPaqueteI/OdeJava
El paquete I/O de Java (java.io) proporciona un juego de canales de entrada y salida utilizados para
leer y escribir ficheros de datos y otras fuentes de entrada y salida. Las clases e interfaces definidos
enjava.iosecubrencompletamenteenCanalesdeEntradaySalida.
ElPaquetedeUtilidadesdeJava
Este paquete,java.util, contiene una coleccin de clases tiles. Entre ellas se encuentan muchas
estructuras de datos genricas (Dictionary, Stack, Vector, Hashtable) un objeto muy til para dividir
cadenas y otro para la manipulacin de calendarios. El paquetejava.utiltambin contiene el interface
Observer y la clase Observable que permiten a los objetos notificarse unos a otros cuando han
cambiado. Las clases dejava.utilno se cubre en este tutorial aunque algunos ejemplos utilizan estas
clases.
ElPaquetedeReddeJava
El paquetejava.netcontiene definiciones de clases e interfaces que implementan varias capacidades
de red. Las clases de este paquete incluyen una clase que implementa una conexin URL. Se pueden
utilizar estas clases para implementar aplicaciones clienteservidor y otras aplicaciones de
comunicaciones.Conectividad y Seguridad del Clientetiene varios ejemplos de utilizacin de estas
clases,incluyendounejemploclienteservidorqueutilizadatagramas.
ElPaqueteApplet
Este paquete contiene la clase Applet la clase que se debe subclasificar si se quiere escribir un applet.
En este paquete se incluye el interface AudioClip que proporciona una abstracin de alto nivel para
audio.EscribirApplets.
LosPaquetesdeHerramientasparaVentanasAbstractas
Tres paquetes componen las herramientas para Ventanas Abstractas:java.awt,java.awt.image,
yjava.awt.peer.
ElpaqueteAWT
ElpaqueteAWTImage
ElpaqueteAWTPeer

Potrebbero piacerti anche