<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Paquetes</id>
	<title>Paquetes - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Paquetes"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Paquetes&amp;action=history"/>
	<updated>2026-10-26T00:16:37Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Paquetes&amp;diff=4466&amp;oldid=prev</id>
		<title>Arribi: /* Xerarquía aparente de paquetes */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Paquetes&amp;diff=4466&amp;oldid=prev"/>
		<updated>2008-03-04T18:11:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Xerarquía aparente de paquetes&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Nesta unidade verase como agrupar clases e interfaces en paquetes, como usar clases que se atopen en determinados paquetes e como organizar o sistema de ficheiros para que o compilador poda atopar os nosos ficheiros de código fonte.&lt;br /&gt;
==Creación de paquetes==&lt;br /&gt;
Un paquete é un grupo de &amp;#039;&amp;#039;&amp;#039;tipos&amp;#039;&amp;#039;&amp;#039; relacionados que proporciona protección de acceso e un espazo de nomes. Os tipos refírense a clases, interfaces, enumeracións e anotacións. &lt;br /&gt;
&lt;br /&gt;
En Java os tipos organízanse en paquetes. Así, no paquete java.lang atopamos clases fundamentais da linguaxe; no paquete java.io temos clases para escritura e lectura, etc. As nosas clases tamén se poden agrupar en paquetes.&lt;br /&gt;
&lt;br /&gt;
Supoñamos que temos un grupo de clases para representar obxectos gráficos como círculos, rectángulos, liñas e puntos. Temos adeamis un interface, Arrastrable, que implementan as clases que poden arrastrarse co rato.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
// no ficheiro Arrastrable.java&lt;br /&gt;
public interface Arrastrable  {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Grafico.java&lt;br /&gt;
public abstract class Grafico {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Circulo.java&lt;br /&gt;
public class Circulo extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Rectangulo.java&lt;br /&gt;
public class Rectangulo extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Punto.java&lt;br /&gt;
public class Punto extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Linea.java&lt;br /&gt;
public class Linea extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Deberíamos agrupar estas clases e o interface nun paquete polos seguintes motivos::&lt;br /&gt;
* Outros programadores, e incluso nós mesmos, poden determinar facilmente que estes tipos están relacionados.&lt;br /&gt;
*Outros programadores, e incluso nós mesmos, saben onde atopar tipos que proporcionen funcións relacionadas cos gráficos.&lt;br /&gt;
*Os nomes destes tipos non entrarán en conflito cos nomes dos tipos noutros paquetes porque o paquete crea un novo espazo de nomes.&lt;br /&gt;
*Pódese permitir que os tipos dentro do paquete teñan acceso sen restrinxir entre eles, aínda que os tipos de fóra do paquete non podan.&lt;br /&gt;
&lt;br /&gt;
Para crear un paquete hai que escribir no principo de cada ficheiro fonte que queramos que pertenza a ese paquete o seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
package nome_do_paquete;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A sentenza &amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt; (por exemplo, &amp;lt;code&amp;gt;package graficos;&amp;lt;/code&amp;gt;) debe ser a primeira liña no ficheiro fonte. Só pode haber unha sentenza deste tipo en cada ficheiro fonte e aplícase a todos os tipos no ficheiro. No exemplo anterior teríamos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
// no ficheiro Arrastrable.java&lt;br /&gt;
package graficos;&lt;br /&gt;
public interface Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Grafico.java&lt;br /&gt;
package graficos;&lt;br /&gt;
public abstract class Grafico {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Circulo.java&lt;br /&gt;
package graficos;&lt;br /&gt;
public class Circulo extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Rectangulo.java&lt;br /&gt;
package graficos;&lt;br /&gt;
public class Rectangulo extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Punto.java&lt;br /&gt;
package graficos;&lt;br /&gt;
public class Punto extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// no ficheiro Linea.java&lt;br /&gt;
package graficos;&lt;br /&gt;
public class Linea extends Grafico implements Arrastrable {&lt;br /&gt;
        . . .&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Se estamos nas primeiras fases de desenvolvemento da aplicación ou esta é moi pequena non é necesario empregar paquetes. No caso contrario é moi recomendable polos motivos xa comentados anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Nomes de paquetes==&lt;br /&gt;
Dada a cantidade de programadores existentes por todo o planeta é bastante fácil que dous deles coincidan á hora de poñer nome a un tipo (clase, interface, etc.). Isto non é problema porque o compilador distíngueos a partir do nome completo. Así, no exemplo anterior, a clase &amp;lt;code&amp;gt;Rectangulo&amp;lt;/code&amp;gt; para o compilador é &amp;lt;code&amp;gt;graficos.Rectangulo;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O problema aparece cando dous programadores coinciden tamén no nome do paquete que están a usar. Para estes casos existe unha norma para evitar as duplicidades. &lt;br /&gt;
===Normas===&lt;br /&gt;
*Os nomes dos paquetes escríbense en minúsculas para evitar confundilos coas clases e interfaces.&lt;br /&gt;
*As compañías deben usar o seu nome de dominio de Internet ao revés para nomear os paquetes. Por exemplo: net.iessanclemente.mestre para un paquete creado na máquina mestre por un programador no iessanclemente.net. Os posibles confitos dentro da propia institución deben resolverse internamente.&lt;br /&gt;
*Os paquetes da linguaxe de programación Java comezan por &amp;lt;code&amp;gt;java.&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;javax&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Se o dominio de Internet non é un nome válido (por exemplo, porque empece por un carácter non válido ou conteña unha palabra reservada como &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) suxírese o seguinte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lipart-open.org pasa a ser org.clipart_open&lt;br /&gt;
free.fonts.int pasa a ser int_.fonts.free&lt;br /&gt;
poetry.7days.com pasa a ser com._7days.poetry&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Uso de paquetes==&lt;br /&gt;
Aos tipos que forman parte dun paquete chámaselles &amp;#039;&amp;#039;&amp;#039;membros do paquete&amp;#039;&amp;#039;&amp;#039;. Para poder usar un membro &amp;#039;&amp;#039;&amp;#039;público&amp;#039;&amp;#039;&amp;#039; dun paquete dende fóra dese paquete hai que facer algunha das seguintes cousas:&lt;br /&gt;
*Referirse ao membro polo seu nome completo&lt;br /&gt;
*Importar o membro dende o paquete&lt;br /&gt;
*Import o paquete enteiro&lt;br /&gt;
===Uso mediante o nome completo===&lt;br /&gt;
Pódese usar o nome do membro dun paquete sen máis sempre e cando o código que se estea a escribir estea no mesmo paquete que o membro ou se se importou o membro explicitamente.&lt;br /&gt;
&lt;br /&gt;
Con todo, se se quere usar un membro dende outro paquete e o paquete non se importou hai que usar o nome completo do membro para referirse a el. Por exemplo, para a clase Rectangulo anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    graficos.Rectangulo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Así, para usar a clase Rectangulo poderiamos escribir o seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    graficos.Rectangulo meuRect = new graficos.Rectangulo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Esta forma de acceder aos membro dun paquete non se usa normalmente porque hai que coñecer o nome completo do paquete ao que pertence o membro.&lt;br /&gt;
&lt;br /&gt;
===Importación dun membro do paquete===&lt;br /&gt;
Para importar o membro dun paquete escríbese a palabra import ao principio do ficheiro de código fonte, antes da definición de calquera tipo (clase, interface, etc.) pero despois da palabra package:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
  import graphics.Rectangle;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para referirnos á clase Rectangulo xa podemos usar o seu nome directamente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    Rectangulo meuRectangulo = new Rectangulo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Isto é útil se só queremos importar un membro dun paquete pero se usamos moitos tipos dun paquete habería que importar o paquete enteiro.&lt;br /&gt;
&lt;br /&gt;
===Importación do paquete completo===&lt;br /&gt;
Para importar o paquete completo úsase o carácter comodín &amp;#039;&amp;#039;&amp;#039;*&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
  import graficos.*;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Así, podemos referirnos a calquera clase do paquete graficos do seguinte xeito:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    Circulo meuCirculo = new Circulo();&lt;br /&gt;
    Rectangulo meuRectangulo = new Rectangulo();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O asterisco só se pode usar para especificar todas as clases dentro dun paquete pero non para un conxunto concreto. Por exemplo, o seguinte código dará un erro de de compilación&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    import graphics.A*;     //Non importará todas clases que emprecen por A&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O compilador de Java importa automaticamente o paquete &amp;lt;code&amp;gt;java.lang&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Xerarquía aparente de paquetes===&lt;br /&gt;
A estruturación de paquetes non é necesariamente xerárquica. Por exemplo, a API de Java inclúe o paquete &amp;lt;code&amp;gt;java.awt&amp;lt;/code&amp;gt;, o paquete &amp;lt;code&amp;gt;java.awt.color&amp;lt;/code&amp;gt;, o paquete &amp;lt;code&amp;gt;java.awt.font&amp;lt;/code&amp;gt; e moitos outros que empezan por java.awt. Con todo, o paquete &amp;lt;code&amp;gt;java.awt.color&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;java.awt.font&amp;lt;/code&amp;gt; e outros que empezan por &amp;lt;code&amp;gt;java.awt.xxxx&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;non están incluídos no paquete &amp;lt;code&amp;gt;java.awt&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;. O prefixo java.awt (Java Abstract Window Toolkit) úsase para referirse a un número de paquetes que están relacionados, sen máis.&lt;br /&gt;
&lt;br /&gt;
Se importamos &amp;lt;code&amp;gt;java.awt.*&amp;lt;/code&amp;gt; importaremos todos os tipos dese paquete, pero non importaremos  o paquete &amp;lt;code&amp;gt;java.awt.color&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;java.awt.font&amp;lt;/code&amp;gt; e outros que empezan por &amp;lt;code&amp;gt;java.awt.xxxx&amp;lt;/code&amp;gt;. Se queremos usar outros tipos en &amp;lt;code&amp;gt;java.awt.color&amp;lt;/code&amp;gt; hai que importar o paquete explicitamente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
import java.awt.*;&lt;br /&gt;
import java.awt.color.*;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Nomes ambiguos===&lt;br /&gt;
Pode darse o caso de que dous tipos teñan o mesmo nome e pertenzan a paquetes distintos. Se importamos os dous paquetes e queremos usar un tipo, por exemplo, unha clase, que estea nos dous hai que referirse a ela empregando o nome completo. Por exemplo, temos unha clase &amp;lt;code&amp;gt;Rectangle&amp;lt;/code&amp;gt; que pertence ao paquete &amp;lt;code&amp;gt;graficos&amp;lt;/code&amp;gt; e existe outra clase Rectangle no paquete java.awt. Para referirnos a esa clase usaremos o nome completo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
graphics.Rectangle rect;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Importación de constantes===&lt;br /&gt;
O paquete &amp;lt;code&amp;gt;java.lang.Math&amp;lt;/code&amp;gt; define a constante PI e varios métodos de clase. Por exemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public static final double PI 3.141592653589793&lt;br /&gt;
public static double cos(double a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normalmente, para usar estes métodos e constantes hai que escribir o nome da clase como segue:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
double r = Math.cos(Math.PI * theta);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pódese usar a sentenza &amp;#039;&amp;#039;&amp;#039;import static&amp;#039;&amp;#039;&amp;#039; para importar este tipo de métodos e constantes e evitar así ter que escribir sempre o prefixo Math:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
import static java.lang.Math.PI;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ou tamén:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
import static java.lang.Math.*;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
E para usalos faríamos o seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
double r = cos(PI * theta);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Ficheiros fonte e .class==&lt;br /&gt;
Xa vimos que as compañías, por convención, usan o seu nome de dominio ao revés para establecer os nomes dos paquetes. Por exemplo, se temos unha empresa con dominio exemplo.com e un paquete graficos que contén o ficheiro Rectangulo.java teremos o nome de paquete com.exemplo.graficos. O ficheiro fonte estará no directorio seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
    ....\com\example\graphics\Rectangle.java&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En Linux o carácter separador é /.&lt;br /&gt;
&lt;br /&gt;
Cando compilamos un ficheiro fonte o compilador crea un ficheiro por cada tipo (clase, interface, etc.) definido nel. O nome base do ficheiro de saída é o nome do tipo e a súa extensión é.class. Por exemplo, se o ficheiro fonte é o seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
// Ficheiro Rectangulo.java &lt;br /&gt;
    package com.exemplo.graficos;&lt;br /&gt;
    public class Rectangulo{&lt;br /&gt;
          . . . &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class UnhaClase{&lt;br /&gt;
          . . . &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os ficheiros compilados estarán nas seguintes rutas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ruta ao directorio pai dos ficheiros de saída&amp;gt;\com\exemplo\graficos\Rectangulo.class&lt;br /&gt;
&amp;lt;ruta ao directorio pai dos ficheiros de saída&amp;gt;\com\exemplo\graficos\UnhaClase.class&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Os ficheiros fonte e os binarios normalmente están almacenados en directorios distintos:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
\fontes\com\exemplo\graficos\Rectangulo.java&lt;br /&gt;
\clases\com\exemplo\graficos\Rectangulo.class&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A ruta completa ao directorio onde están as clases está na variable do sistema &amp;#039;&amp;#039;&amp;#039;CLASSPATH&amp;#039;&amp;#039;&amp;#039;. No caso anterior, o CLASSPATH sería \clases se o paquete é com.exemplo.graficos. O compilador e a JVM buscarán os ficheiros .class no directorio:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
 \classes\com\exemple\graficos&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A variable CLASSPATH pode incluír varias rutas separadas por puntos e coma (Windows) ou por comas (Linux). Por defecto, o compilador e a JVM buscan no directorio actual e no ficheiro JAR de Java polas clases, así que non é preciso incluír estes directorios.&lt;/div&gt;</summary>
		<author><name>Arribi</name></author>
	</entry>
</feed>