Variables y otros aspectos en Java

Inicialización de variables

Desde el punto de vista del lugar donde se declaran existen dos tipos de variables:
  • Variables miembro: Se declaran en una clase, fuera de cualquier método.
  • Variables locales: Se declaran y usan en un bloque de código dentro de un método.
Las variables miembro son inicializadas automáticamente, de la siguiente forma:
  • Las numéricas a 0.
  • Las booleanas a false.
  • Las char al caracter nulo (hexadecimal 0).
  • Las referencias a null.
Nota: null es un literal que indica referencia nula.

Las variables miembro pueden inicializarse con valores distintos de los anteriores en su declaración.

Las variables locales no se inicializan automáticamente. Se debe asignarles un valor antes de ser usadas. Si el compilador detecta una variable local que se usa antes de que se le asigne un valor produce un error. Por ejemplo:
int p;
int q = p;    // error
El compilador también produce un error si se intenta usar una variable local que podría no haberse inicializado, dependiendo del flujo de ejecución del programa. Por ejemplo:
int p;
if (. . . ) {
      p = 5 ;
}
int q = p;    // error
El compilador produce un error del tipo 'La variable podría no haber sido inicializada', independientemente de la condición del if.

Ambito de las variables

El ámbito de una variable es el área del programa donde la variable existe y puede ser utilizada. Fuera de ese ámbito la variable, o bien no existe o no puede ser usada (que viene a ser lo mismo).

El ámbito de una variable miembro (que pertenece a un objeto) es el de la usabilidad de un objeto. Un objeto es utilizable desde el momento en que se crea y mientras existe una referencia que apunte a él. Cuando la última referencia que lo apunta sale de su ámbito el objeto queda 'perdido' y el espacio de memoria ocupado por el objeto puede ser recuperado por la JVM cuando lo considere oportuno. Esta recuperación de espacio en memoria se denomina 'recogida de basura' y es descrita un poco más adelante.

El ámbito de las variables locales es el bloque de código donde se declaran. Fuera de ese bloque la variable es desconocida.

Ejemplo:
{
    int x;    // empieza el ámbito de x. (x es conocida y utilizable)
    {
        int q;    // empieza el ámbito de q. x sigue siendo conocida.
        . . .
    }    // finaliza el ámbito de q (termina el bloque de código)
    . . .    // q ya no es utilizable
}    // finaliza el ámbito de x

Recogida de basura

Cuando ya no se necesita un objeto simplemente puede dejar de referenciarse. No existe una operación explícita para 'destruir' un objeto o liberar el área de memoria usada por él.

La liberación de memoria la realiza el recolector de basura (garbage collector) que es una función de la JVM. El recolector revisa toda el área de memoria del programa y determina que objetos pueden ser borrados porque ya no tienen referencias activas que los apunten. El recolector de basura actua cuando la JVM lo determina (tiene un mecanismo de actuación no trivial).

En ocasiones es necesario realizar alguna acción asociada a la acción de liberar la memoria asignada al objeto (como por ejemplo liberar otros recursos del sistema, como descriptores de ficheros). Esto puede hacerse codificando un método finalize que debe declararse como:
protected void finalize() throws Throwable { }
Nota: las clausulas protected y throws se explicarán en capítulos posteriores.

El método finalize es invocando por la JVM antes de liberar la memoria por el recolector de basura, o antes de terminar la JVM. No existe un momento concreto en que las áreas de memoria son liberadas, sino que lo determina en cada momento la JVM en función de sus necesidades de espacio.

Sobrecarga de métodos

Una misma clase puede tener varios métodos con el mismo nombre siempre que se diferencien en el tipo o número de los argurmentos. Cuando esto sucede se dice que el método está sobrecargado. Por ejemplo, una misma clase podría tener los métodos:
int metodoSobrecargado() { . . .}
int metodoSobrecargado(int x) { . . .}
Sin embargo no se puede sobrecargar cambiando sólo el tipo del valor devuelto. Por ejemplo:
int metodoSobrecargado() { . . .}
void metodoSobrecargado() { . . .}    // error en compilación
con esta definición, en la expresión metodoSobrecargado() la JVM no sabría que método invocar.

Se puede sobrecargar cualquier método miembro de una clase, así como el constructor.

La referencia this

En ocasiones es conveniente disponer de una referencia que apunte al propio objeto que se está manipulando. Esto se consigue con la palabra reservada this. this es una referencia implicita que tienen todos los objetos y que apunta a si mismo. Por ejemplo:
class Circulo {
    Punto centro;
    int radio;
    . . .
    Circulo elMayor(Circulo c) {
        if (radio > c.radio) return this;
        else return c;
    }
}
El método elMayor devuelve una referencia al círculo que tiene mayor radio, comparando los radios del Circulo c que se recibe como argumento y el propio. En caso de que el propio resulte mayor el método debe devolver una referencia a si mismo. Esto se consigue con la expresión return this.

La referencia null

Para asignar a una referencia el valor nulo se utiliza la constante null. El ejemplo del caso anterior se podría completar con:
class Circulo {
    Punto centro;
    int radio;
    . . .
    Circulo elMayor(Circulo c) {
        if (radio > c.radio) return this;
        else if (c.radio > radio) return c;
        else return null;
    }
}

Ocultamiento de variables

Puede ocurrir que una variable local y una variable miembro reciban el mismo nombre (en muchos casos por error). Cuando se produce esto la variable miembro queda oculta por la variable local, durante el bloque de código en que la variable local existe y es accesible. Cuando se sale fuera del ámbito de la variable local, entonces la variable miembro queda accesible. Observese esto en el ejemplo siguiente:
. . .
String x = "Variable miembro";
. . .
void variableOculta() {
    System.out.println(x);
    {
        String x = "Variable local";
        System.out.println(x);
        }
    System.out.println(x);
}
Nota: El uso de Strings se verá en un capítulo posterior, aunque su uso aquí resulta bastante intuitivo. La llamada System.out.println envia a la consola (la salida estándar habitual) las variables que se pasan como argumentos.

La llamada al método variableOculta() producirá la siguiente salida:
Variable miembro
Variable local
Variable miembro
Se puede acceder a la variable miembro oculta usando la referencia this. En el ejemplo anterior la expresión:
System.out.println(this.x);
siempre producirá la salida "Variable miembro", puesto que this.x se refiere siempre a la variable miembro.

REFERENCIAS:arrakis

Líneas Microstrip

Línea Microstrip

La línea microstrip es uno de los tipos más populares de líneas de transmisión planas, principalmente debido a que puede ser fabricado mediante procesos fotolitográficos y es fácilmente miniaturizado e integrado con los dos tipos de dispositivos de microondas, pasivos y activos. La geometría de una línea microstrip se muestra en la Figura 1a. Un conductor de ancho W se imprime en un sustrato dieléctrico delgado, con conexión a tierra de espesor d y permitividad relativa Er; un esbozo de las líneas de campo se muestra en la figura 1b.

Figura 1. Línea de transmisión Microstrip. (a) Geometría. (b) Líneas de campo eléctrico y magnético.
Si el sustrato dieléctrico no está presente (E r = 1), tendríamos una línea de dos conductores que consiste en un conductor de cinta plana sobre un plano de tierra, incrustado en un medio homogéneo (aire). Esto constituiría una línea de transmisión TEM simple, con velocidad de fase vp = c y constante de propagación β = k0.
La presencia del dieléctrico, en particular el hecho de que el dieléctrico no llena la región por encima de la banda (y > d), complica el comportamiento y el análisis de la línea microstrip. A diferencia de una stripline, en el que todos los campos están contenidos dentro de una región dieléctrica homogénea, la línea microstrip tiene algunos (por lo general la mayoría) de sus líneas de campo en la región dieléctrica entre el conductor de tira y el plano de tierra y una fracción en la región de aire sobre el sustrato. Por esta razón la línea microstrip no puede soportar una onda TEM pura, ya que la velocidad de fase de los campos TEM en la región dieléctrica sería c / √Er, mientras que la velocidad de fase de los campos TEM en la región de aire sería c, por lo que una condición de coincidencia de fases en la interfase aire-dieléctrico sería imposible de aplicar.

En la actualidad, los campos exactos de una línea microstrip constituyen una onda TM-TE híbrido y requieren técnicas de análisis más avanzadas. En las aplicaciones más prácticas, sin embargo, el sustrato dieléctrico es eléctricamente muy delgado (d << lambda), y por ello los campos son cuasi-TEM. En otras palabras, los campos son esencialmente los mismos que los del caso estático (DC). Por lo tanto, buenas aproximaciones para la velocidad de fase, constante de propagación, y la impedancia característica se pueden obtener a partir de soluciones estáticas o cuasi-estáticas. Luego, la velocidad de fase y la constante de propagación se pueden expresar como

Ecuación 1. Velocidad de fase

Ecuación 2. Constante de propagación

Donde Ee es la constante dieléctrica efectiva de la línea microstrip. Debido a que algunas de las líneas de campo están en la región dieléctrica y algunas están en el aire, la constante dieléctrica efectiva satisface la relación

y depende de la constante dieléctrica del sustrato, del espesor del sustrato, del ancho del conductor, y la frecuencia. Seguidamente se presentan las fórmulas de diseño aproximadas para la constante dieléctrica efectiva, impedancia característica, y la atenuación de la línea microstrip; estos resultados son aproximaciones rigurosas de ajuste de curva a soluciones cuasi-estática. A continuación, se van a discutir los aspectos adicionales de línea microstrip, incluidos los efectos dependientes de la frecuencia, modos de orden superior, y los efectos parásitos.

Fórmulas para la constante dieléctrica efectiva, Impedancia característica, y atenuación

La constante dieléctrica efectiva de una línea microstrip está dada aproximadamente por

 

La constante dieléctrica efectiva se puede interpretar como la constante dieléctrica de un medio homogéneo que equivalentemente reemplaza al aire y regiones dieléctricas de la línea microstrip, como se muestra en la Figura 2. La velocidad de fase y constante de propagación están dadas por (1) y (2). Dadas las dimensiones de una línea microstrip, la impedancia característica puede ser calculada como


Para una impedancia característica Z0 dada y una constante dieléctrica Er, la relación W/d puede ser hallada de



Figura 2. Geometría equivalente de una línea microstrip cuasi-TEM. (a) geometría original. (b) geometría equivalente, en el que el sustrato dieléctrico de permitividad relativa Er se sustituye con un medio homogéneo de permitividad relativa efectiva Ee
Donde


Considerando una línea microstrip como una línea cuasi-TEM, se puede determinar la atenuación debido a la pérdida dieléctrica como


donde tanδ es la tangente de pérdida del dieléctrico. Este resultado se obtiene a partir de (3) mediante la multiplicación por un "factor de relleno,"

Ecuación 3. Atenuación debido a la pérdida dieléctrica (línea TEM).

 

La cual representa el hecho de que los campos alrededor de la línea microstrip están en parte en el aire (sin pérdida) y en parte en el dieléctrico (con pérdida). La atenuación debida a la pérdida del conductor está dada aproximadamente por 


donde Rs = √(ωμ0 / 2σ) es la resistividad de la superficie del conductor. Para la mayoría de los sustratos microstrip, la pérdida del conductor es más importante que la pérdida dieléctrica; sin embargo, pueden producirse excepciones con algunos sustratos semiconductores.

REFERENCIAS:        D. M. Pozar, Microwave Engineering, 2nd Ed.