📄 java3.htm
字号:
<HTML>
<HEAD>
<TITLE>Java desde Cero</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0z">
</HEAD>
<BODY background=/iconos/1.gif TEXT=000000 LINK=FF0000 VLINK=A62A2A>
<H1>Estructura de clases<BR>
</H1>
<P>
Vamos a comenzar analizando la clase Contador, para ir viendo
las partes que forman una clase una por una y en detalle. Este
capítulo va a ser un poco aburrido por lo exhaustivo (aunque
algunos puntos más complicados como las excepciones y los
threads los dejaremos para después), pero me parece bueno
tener un resumen completo de la sintaxis desde ahora.
<P>
Luego iremos armando pequeñas aplicaciones para probar
cada cosa.<BR>
<P>
Recordemos la definición de la clase Contador:<BR>
<PRE WIDTH=132>
<FONT SIZE=2>// Implementación de un contador sencillo
public class Contador {
// Atributos
int cnt;
// Constructor
public Contador() {
cnt = 0;
}
// Métodos
public int incCuenta() {
cnt++;
return cnt;
}
public int getCuenta() {
return cnt;
}
}<BR>
</FONT>
</PRE>
<H2>Declaración de la clase</H2>
<P>
La clase se declara mediante la línea <FONT FACE="Arial">public
class Contador</FONT>. En el caso más general, la declaración
de una clase puede contener los siguientes elementos:<BR>
<P>
[<B>public</B>] [<B>fina</B>l | <B>abstract</B>] <B>class</B>
Clase [<B>extends</B> ClaseMadre] [<B>implements</B> Interfase1
[, Interfase2 ]…]<BR>
<P>
o bien, para interfaces:<BR>
<P>
[<B>public</B>] <B>interface</B> Interfase [<B>extends</B> InterfaseMadre1
[, InterfaseMadre2 ]…]<BR>
<P>
Como se ve, lo único obligatorio es <B>class</B> y el nombre
de la clase. Las interfases son un caso de clase particular que
veremos más adelante.
<H3>Public, final o abstract</H3>
<P>
Definir una clase como pública (<B>public</B>) significa
que puede ser usada por cualquier clase en cualquier paquete.
Si no lo es, solamente puede ser utilizada por clases del mismo
paquete (más sobre paquetes luego; básicamente,
se trata de un grupo de clases e interfaces relacionadas, como
los paquetes de biblioteca incluídos con Java).
<P>
Una clase final (<B>final</B>) es aquella que no puede tener clases
que la hereden. Esto se utiliza básicamente por razones
de seguridad (para que una clase no pueda ser reemplazada por
otra que la herede), o por diseño de la aplicación.
<P>
Una clase abstracta (<B>abstract</B>) es una clase que puede tener
herederas, pero no puede ser instanciada. Es, literalmente, abstracta
(como la clase <I>Number</I> definida en java.lang). ¿Para
qué sirve? Para modelar conceptos. Por ejemplo, la clase
<I>Number</I> es una clase abstracta que representa cualquier
tipo de números (y sus métodos no están implementados:
son abstractos); las clases descendientes de ésta, como
<I>Integer</I> o <I>Float</I>, sí implementan los métodos
de la madre <I>Number</I>, y se pueden instanciar.
<P>
Por lo dicho, una clase no puede ser <B>final</B> y <B>abstract</B>
a la vez (ya que la clase abstract requiere descendientes…)
<P>
¿Un poco complejo? Se va a entender mejor cuando veamos casos
particulares, como las interfases (que por definición son
abstractas ya que no implementan sus métodos).
<H3>Extends</H3>
<P>
La instrucción <B>extends</B> indica de qué clase
desciende la nuestra. Si se omite, Java asume que desciende de
la superclase <B>Object</B>.
<P>
Cuando una clase desciende de otra, esto significa que hereda
sus atributos y sus métodos (es decir que, a menos que
los redefinamos, sus métodos son los mismos que los de
la clase madre y pueden utilizarse en forma transparente, a menos
que sean <I>privados</I> en la clase madre o, para subclases de
otros paquetes, protegidos o propios del paquete). Veremos la
calificación de métodos muy pronto, a no desesperar!
<H3>Implements</H3>
<P>
Una interfase (<B>interface</B>) es una clase que declara sus
métodos pero no los implementa; cuando una clase implementa
(<B>implements</B>) una o más interfases, debe contener
la implementación de todos los métodos (con las
mismas listas de parámetros) de dichas interfases.
<P>
Esto sirve para dar un ascendiente común a varias clases,
obligándolas a implementar los mismos métodos y,
por lo tanto, a comportarse de forma similar en cuanto a su interfase
con otras clases y subclases.
<H3>Interface</H3>
<P>
Una interfase (<B>interface</B>), como se dijo, es una clase que
no implementa sus métodos sino que deja a cargo la implementación
a otras clases. Las interfases pueden, asimismo, descender de
otras interfases pero no de otras clases.
<P>
Todos sus métodos son por definición abstractos
y sus atributos son finales (aunque esto no se indica en el cuerpo
de la interfase).
<P>
Son útiles para generar relaciones entre clases que de
otro modo no están relacionadas (haciendo que implementen
los mismos métodos), o para distribuir paquetes de clases
indicando la estructura de la interfase pero no las clases individuales
(objetos anónimos).
<P>
Si bien diferentes clases pueden implementar las mismas interfases,
y a la vez descender de otras clases, esto no es en realidad herencia
múltiple ya que una clase no puede heredar atributos ni
métodos de una interface; y las clases que implementan
una interfase pueden no estar ni siquiera relacionadas entre sí.
<BR>
<H2>El cuerpo de la clase</H2>
<P>
El cuerpo de la clase, encerrado entre { y }, es la lista de atributos
(variables) y métodos (funciones) que constituyen la clase.
<P>
No es obligatorio, pero en general se listan primero los atributos
y luego los métodos.
<H3>Declaración de atributos</H3>
<P>
En Java no hay variables globales; todas las variables se declaran
dentro del cuerpo de la clase o dentro de un método. Las
variables declaradas dentro de un método son <B>locales</B>
al método; las variables declaradas en el cuerpo de la
clase se dice que son <I>miembros</I> de la clase y son accesibles
por todos los métodos de la clase.
<P>
Por otra parte, además de los atributos de la propia clase
se puede acceder a todos los atributos de la clase de la que desciende;
por ejemplo, cualquier clase que descienda de la clase <B>Polygon</B>
hereda los atributos <I>npoints</I>, <I>xpoints</I> e <I>ypoints</I>.
<P>
Finalmente, los atributos miembros de la clase pueden ser <I>atributos
de clase</I> o <I>atributos de instancia</I>; se dice que son
atributos <I>de clase</I> si se usa la palabra clave <B>static</B>:
en ese caso la variable es única para todas las instancias
(objetos) de la clase (ocupa un único lugar en memoria).
Si no se usa static, el sistema crea un lugar nuevo para esa variable
con cada instancia (o sea que es independiente para cada objeto).
<P>
La declaración sigue siempre el mismo esquema:<BR>
<P>
[<B>private</B>|<B>protected</B>|<B>public</B>] [<B>static</B>]
[<B>final</B>] [<B>transient</B>] [<B>volatile</B>] Tipo NombreVariable
[<B>=</B> Valor]<B>;</B>
<H3>Private, protected o public</H3>
<P>
Java tiene 4 tipos de acceso diferente a las variables o métodos
de una clase: privado, protegido, público o por paquete
(si no se especifica nada).
<P>
De acuerdo a la forma en que se especifica un atributo, objetos
de otras clases tienen distintas posibilidades de accederlos:
<BR>
<TABLE BORDERCOLOR=#000000 BORDER=1>
<TR><TD WIDTH=132><I>Acceso desde:</I></TD><TD WIDTH=85><CENTER><B>private</B></CENTER>
</TD><TD WIDTH=85><CENTER><B>protected</B></CENTER></TD><TD WIDTH=94><CENTER><B>public</B></CENTER>
</TD><TD WIDTH=83><CENTER>(package)</CENTER></TD></TR>
<TR><TD WIDTH=132>la propia clase</TD><TD WIDTH=85><CENTER>S</CENTER>
</TD><TD WIDTH=85><CENTER>S</CENTER></TD><TD WIDTH=94><CENTER>S</CENTER>
</TD><TD WIDTH=83><CENTER>S</CENTER></TD></TR>
<TR><TD WIDTH=132>subclase en el mismo paquete</TD><TD WIDTH=85><CENTER>N</CENTER>
</TD><TD WIDTH=85><CENTER>S</CENTER></TD><TD WIDTH=94><CENTER>S</CENTER>
</TD><TD WIDTH=83><CENTER>S</CENTER></TD></TR>
<TR><TD WIDTH=132>otras clases en el mismo paquete</TD><TD WIDTH=85><CENTER>N</CENTER>
</TD><TD WIDTH=85><CENTER>S</CENTER></TD><TD WIDTH=94><CENTER>S</CENTER>
</TD><TD WIDTH=83><CENTER>S</CENTER></TD></TR>
<TR><TD WIDTH=132>subclases en otros paquetes</TD><TD WIDTH=85><CENTER>N</CENTER>
</TD><TD WIDTH=85><CENTER>X</CENTER></TD><TD WIDTH=94><CENTER>S</CENTER>
</TD><TD WIDTH=83><CENTER>N</CENTER></TD></TR>
<TR><TD WIDTH=132>otras clases en otros paquetes</TD><TD WIDTH=85><CENTER>N</CENTER>
</TD><TD WIDTH=85><CENTER>N</CENTER></TD><TD WIDTH=94><CENTER>S</CENTER>
</TD><TD WIDTH=83><CENTER>N</CENTER></TD></TR>
</TABLE>
<P>
<P>
S: puede acceder
<P>
N: no puede acceder
<P>
X: puede acceder al atributo en objetos que pertenezcan a la subclase,
pero no en los que pertenecen a la clase madre. Es un caso especial
; más adelante veremos ejemplos de todo esto.
<H3>Static y final</H3>
<P>
Como ya se vio, <B>static</B> sirve para definir un atributo como
<I>de clase</I>, o sea único para todos los objetos de
la clase.
<P>
En cuanto a <B>final</B>, como en las clases, determina que un
atributo no pueda ser sobreescrito o redefinido. O sea: no se
trata de una variable, sino de una <I>constante</I>.
<H3>Transient y volatile</H3>
<P>
Son casos bastante particulares y que no habían sido implementados
en Java 1.0.
<P>
<I>Transient</I> denomina atributos que no se graban cuando se
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -