UNIDAD 5
1. Define el concepto de clase, ilustre su implementación y de 5 ejemplos de ellos.
Una clase es una agrupación de datos (variables o campos) y de funciones (métodos) que operan sobre esos datos.
public class Classname
{ ... // definición de variables y métodos
}
Un objeto (instance) es un ejemplar concreto de una clase.
Las características de una clase son las siguientes:
1) Todas las variables y funciones de Java deben pertenecer a una clase.
2) Si una clase deriva de otra (extends), hereda todas sus variables y métodos.
3) Java tiene una jerarquía de clases estándar de la que pueden derivar las clases que crean los usuarios.
4) En Java no hay herencia múltiple.
5) En un fichero se pueden definir varias clases, pero en un fichero no puede haber más que una clase public.
6) Si una clase contenida en un fichero no es public, no es necesario que el fichero se llame como la clase.
7) Los métodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this.
8) Las clases se pueden agrupar en packages, introduciendo una línea al comienzo del fichero (package packageName;).
Una clase es un tipo especial de datos, y esta orientado a creación de objetos y que consta de unos miembros que pueden ser todas o funciones privadas o publicas.
Una clase es un tipo de dato que contiene uno o más elementos llamados dato miembro, y cero, una o más funciones que manipulan esos datos (llamados función miembro). Una clase se puede definir con una estructura (struct), una unión (unión) o una clase (class).
La sintaxis de una clase es:
class nombre_clase
{
miembro_1; //lista de miembros
miembro_2
miembro_3
funcion_miembro_1( ); // funciones miembro conocidas
funcion_miembro_2 ( ); // funciones como métodos
2. Explique ampliamente que es un modificador de acceso, para que se utiliza y que tipos existen
Los modificadores de acceso determinan qué clases
pueden utilizar cierta característica.
Las características de una clase son:
La clase misma.
Sus variables.
Sus métodos y constructores.
Las únicas variables sobre las que se aplican los
modificadores de acceso son las variables de clase.
Las variables de los métodos no llevan modificadores de
acceso porque pertenecen únicamente al método.
Modificadores de Acceso
Los modificadores de acceso son:
public
private
protected
El único modificador de acceso permitido para una clase
no interna es public.
Una característica puede tener como máximo un
modificador.
Cuando una característica no tiene modificador de acceso
se toma un valor por defecto.
El valor por defecto no tiene un nombre estándar
(friendly, package o default).
Modificadores de Acceso:
Ejemplo, declaraciones permitidas:
class Algo { … }
public class Objeto { … }
private int i;
Set conjunto;
protected double metodo() { … }
Declaraciones no permitidas:
public protected int x;
default Objeto getObjeto() { … }
Modificadores de Acceso:
public
El modificador de acceso más permisivo
es public.
Cualquier clase, variable o método
publico se puede utilizar en cualquier
clase en Java.
Las aplicaciones Java deben declarar el
método main().
Modificadores de Acceso:
private
El modificador private es el más
restrictivo.
Una variable o método de tipo privado
sólo es accesible para las instancias
creadas por la misma clase.
Modificadores de Acceso:
default
Las clases, variables o métodos que no tienen
modificador de acceso toman un valor
llamado default.
El modificador de acceso default permite que
las características de una clase sean
accesibles para cualquier clase en el mismo
paquete.
Una clase que hereda de otra no tiene acceso
a las características default del padre si no se
encuentra en el mismo paquete.
Modificadores de Acceso:
protected
Las características que tienen el modificador
de acceso protected son más accesibles que
las default.
Únicamente los métodos y las variables se
pueden declarar como protected.
Las características de tipo protected de una
clase son accesibles desde las clases que
heredan.
Al igual que default, protected permite el
acceso a las clases del mismo paquete.
Modificadores de Acceso:
Resumen
Los modificadores de acceso en Java son:
public – una característica public es accesible para
cualquier clase.
protected – una característica protected puede ser
accedida desde una clase que hereda o desde
cualquier clase que pertenece al mismo paquete.
default – las características default son accesibles
para las clases del mismo paquete.
private – una característica private sólo es visible
para la clase a la cual pertenece
3. De los diferentes tipos de modificadores de acceso ilustre 5 ejemplos de aplicación para cada uno de ellos de manera independiente
class Punto {
private int x , y ;
static private int numPuntos = 0;
Punto ( int a , int b ) {
x = a ; y = b;
numPuntos ++ ;
}
int getX() {
return x;
}
int getY() {
return y;
}
static int cuantosPuntos() {
return numPuntos;
}
Para comprobarlo, construye una clase con un método internal:
package internalTest
{
import flash.util.trace
public class HasInternalMethod
{
function HasInternalMethod( )
{
trace( "HasInternalMethod.constructor" );
}
internal function internalMethod( )
{
trace( "HasInternalMethod.internalMethod( )" );
}
}
}
A continuación, en el mismo package, otra clase con un método público, que instancie la clase anterior, y que intente acceder al método internal de esa instancia:
package internalTest
{
import flash.util.trace
public class HasPublicMethod
{
function HasPublicMethod( )
{
trace( "HasPublicMethod.constructor" );
}
public function publicMethod( )
{
var internalInstance: HasInternalMethod = new HasInternalMethod( );
internalInstance.internalMethod( );
}
}
}
una clase con un método protected:
package protectedTest
{
import flash.util.trace
public class HasProtectedMethod
{
function HasProtectedMethod( )
{
trace( "HasProtectedMethod.constructor" );
}
internal function internalMethod( )
{
trace( "HasProtectedMethod.internalMethod( )" );
}
protected function superMethod( )
{
trace( "HasProtectedMethod.superMethod" );
}
}
}
4. Explique ampliamente en que consiste el concepto de encapsulamiento de la clase
Encapsulamiento de Clases
Definición previa: un paquete es una colección de clases que se encuentran en el mismo directorio.
Las clases permiten implementar tipos de datos abstractos. El problema que se presenta es que desde cualquier clase se puede accesar los campos de un objeto perteneciente a otra clase. Esto es una violación al principio de abstracción que dice que un tipo de datos abstracto sólo puede ser manipulado a través de las operaciones que se definen para éste.
La clase se encapsula encerrando entre un par de llaves los campos y los métodos de la clase.
Ejemplo:
public class Punto
{
// Campos
int x;
int y;
// Métodos
public Punto(int a, int b)
{
x = a;
y = b;
}
public int daX( )
{
return x ;
}
public int daY( )
{
return y ;
}
}
// De aquí en adelante se puede utilizar el nuevo tipo Punto para crear objetos.
// La creación de objetos debe hacerse dentro de una clase.
class Principal
{
static void Main( )
{
// Se crea el objeto centro de la clase Punto
Punto centro = new Punto(10,20);
System.Console.WriteLine("X = {0} n Y = {1} n", centro.daX(), centro.daY());
}
}
5. Ilustre 5 ejemplos diferentes donde usted utilice el encapsulamiento de la clase, explicando cual es la clase y cuales son los elementos que se están encapsulando
6. Explique ampliamente como se comunican los elementos que forman parte de un programa orientado a objeto
7. Define el concepto de método y explica ampliamente para que sirve y como se utiliza
Los métodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. La implementación de un método consta de dos partes, una declaración y un cuerpo. La declaración en Java de un método se puede expresar esquemáticamente como:
tipoRetorno nombreMetodo( [lista_de_argumentos] ) {
cuerpoMetodo
}
En C++, el método puede declararse dentro de la definición de la clase, aunque también puede colocarse la definición completa del método fuera de la clase, convirtiéndose en una función inline. En Java, la definición completa del método debe estar dentro de la definición de la clase y no se permite la posibilidad de métodos inline, por lo tanto, Java no proporciona al programador distinciones entre métodos normales y métodos inline.
Los métodos pueden tener numerosos atributos a la hora de declararlos, incluyendo el control de acceso, si es estático o no estático, etc. La sintaxis utilizada para hacer que un método sea estático y su interpretación, es semejante en Java y en C++. Sin embargo, la sintaxis utilizada para establecer el control de acceso y su interpretación, es muy diferente en Java y en C++.
La lista de argumentos es opcional, tanto en Java como en C++, y en los dos casos puede limitarse a su mínima expresión consistente en dos paréntesis, sin parámetro alguno en su interior. Opcionalmente, C++ permite utilizar la palabra void para indicar que la lista de argumentos está vacía, en Java no se usa. Los parámetros, o argumentos, se utilizan para pasar información al cuerpo del método.
La sintaxis de la declaración completa de un método es la que se muestra a continuación con los items opcionales en itálica y los items requeridos en negrilla:
especificadorAcceso static abstract
final native synchronized tipoRetorno nombreMetodo( lista_de_argumentos )
throws listaEscepciones
especificadorAcceso, determina si otros objetos pueden acceder al método y cómo pueden hacerlo. Está soportado en Java y en C++, pero la sintaxis e interpretación es considerablemente diferente.
static, indica que los métodos pueden ser accedidos sin necesidad de instanciar un objeto del tipo que determina la clase. C++ y Java son similares en el soporte de esta característica.
abstract, indica que el método no está definido en la clase, sino que se encuentra declarado ahí para ser definido en una subclase (sobreescrito). C++ también soporta esta capacidad con una sintaxis diferente a Java, pero con similar interpretación.
final, evita que un método pueda ser sobreescrito.
native, son métodos escritos es otro lenguaje. Java soporta actualmente C y C++.
synchronized, se usa en el soporte de multithreading, que se verá también en este Tutorial.
lista_de_argumentos, es la lista opcional de parámentros que se pueden pasar al método
throws listaExcepciones, indica las excepciones que puede generar y manipular el método. También se verán en este Tutorial a fondo las excepciones en Java.
8. Tomando ejemplos de programación 5 programas diferentes, ilustre como funciona los métodos que se utilizan en cada programa
9. Explique ampliamente cuales son las reglas sintácticas (reglas para escribir correctamente las expresiones) que se utilizan para comunicarse a través de los métodos
Entregar las reglas gramaticales que describen otras categorías sintácticas del lenguaje Java.
Temas:
· Reglas sintácticas para la invocación de métodos y funciones.
· Reglas sintácticas para la creación de objetos.
· Ejercicio sobre archivos.
Invocación de métodos y funciones
Los operadores de Java (+ - * etc.) permiten escribir en forma cómoda las operaciones más frecuentes que uno pueda necesitar en un programa. Para otras operaciones menos frecuentes (como min, max, sqrt, etc.) existe una categoría sintáctica que se denomina invocación de función o método (Obs.: más adelante veremos que las funciones son también métodos).
Por ejemplo, en la siguiente instrucción, sqrt(...) es una invocación de función:
double raiz= sqrt(b*b-4*a*c);
Las reglas sintácticas que describen lo que puede ser una invocación de función o método son las siguientes:
exp
|
-> ident ( args )
|
La invocación de una función
|
|
-> exp . ident ( args )
|
La invocación de un método
|
args
|
->
|
No hay argumentos
|
|
-> exp más-args
|
Hay al menos un argumento
|
más-args
|
->
|
No hay más argumentos
|
|
-> , exp más-args
|
Queda al menos un argumento adicional
|
El siguiente es el árbol sintáctico para max(a,1):
max ( a , 1 )
| | | | | |
ident | ident | const |
| | | | |
| exp exp más-args |
/ /
más-args /
/ /
args /
| /
------+-----------
exp
Observe que la aparición de la categoría más-args a partir de nada se justifica con la regla que dice:
El árbol sintáctico para lect.readLine() es:
lect . readLine ( )
| | | | |
ident | ident | |
| | | | |
exp | | | args |
| / / /
-----+-------------
exp
Creación de objetos
La creación de un objeto mediante el operador new es una expresión. La regla sintáctica que permite este tipo de expresiones es:
En las reglas sintácticas colocamos en negritas las palabras que deben aparecer textualmente en el programa y colocamos en cursiva las categorías sintácticas y que por lo tanto deben ser reemplazadas por ``algo'' que aparece en el programa.
Un tipo es una categoría sintáctica que representa todos los tipos de Java: int, double, String, TextReader, etc.
Ejercicio: demuestre que new TextReader("datos.txt").close() es una expresión (construya su árbol sintáctico). Explique en palabras qué hace la expresión.
Ejercicio:
Escriba un programa que entregue la distancia entre Santiago y alguna ciudad de Chile. El diálogo debe ser el siguiente:
Nombre de ciudad ? arica
La distancia entre Santiago y Arica es 2030 kilómetros
Para obtener la distancia, Ud. dispone de un archivo "dist.txt" que contiene las distancias entre Santiago y las ciudades más importantes de Chile en el siguiente formato:
Arica:2030
Puerto Mont:1012
Valparaiso:109
...
Observe que el usuario ingresa arica en minúsculas y que la misma ciudad aparece en mayúsculas en el archivo. El programa debe ignorar este tipo de diferencias.
Si la ciudad solicitada por el usuario no aparece en el archivo, el programa debe desplegar el siguiente mensaje:
Nombre de ciudad ? Mendoza
La ciudad de Mendoza no se encuentra en mi base de datos
Solución:
print("Nombre de ciudad ? ");
String ciudadBusc= readLine();
TextReader lect= new TextReader("dist.txt");
int existe= 0;
String linea= lect.readLine();
while (!lect.eofReached() && existe==0) {
FieldParser decod= new FieldParser(linea, ":");
String ciudad= decod.readString();
if (compare(lower(ciudad), lower(ciudadBusc))==0) {
int dist= decod.readInt();
println("La distancia entre Santiago y "+ciudad+" es "+dist+
"kilometros");
existe= 1;
}
linea= lect.readLine();
}
if (existe!=0)
println("La ciudad de "+ciudadBusc+
" no se encuentra en mi base de datos");
lect.close();
Observación: La comparación se debe hacer ignorando la diferencia entre mayúsculas y minúscula. Por esta razón, se usó la función lower que traduce todo a letras minúsculas.
Si se encuentra la ciudad, no tiene sentido seguir leyendo el archivo. Por esta razón se agregó la variable existe. Esta variable permanece en 0 mientras no se haya encontrado la ciudad. Cuando se encuentra la ciudad se le asigna un 1, lo que se traduce en que el ciclo termina, puesto que no satisface la condición existe==0.
10. Define el concepto de parámetro y explique ampliamente como se utiliza
Esta funcionalidad permite definir el tipo de pasaje de parámetros, pudiendo elegir entre uno de los siguientes valores: entrada (in), salida (out) o entrada/salida (inout). El valor por defecto será inout.
La definición del tipo de pasaje de parámetros permite, por un lado, una mejor especificación de la semántica de las interfaces, y por otro lado, permite optimizar el pasaje de parámetros de las aplicaciones de acuerdo a la arquitectura en la que éstas se implementan. En la mayoría de los lenguajes es más eficiente pasar por referencia que por valor. Pero en Java, por ejemplo, los parámetros solo se pueden pasar por valor, por lo que para lograr la funcionalidad de pasarlos por referencia es necesario hacer conversiones de parámetros, lo cual puede redundar en un overhead importante. Por otro lado, cuando se está ejecutando en forma distribuida (Java, C/SQL, DCOM, etc), la utilización de parámetros del tipo out tiene la ventaja de que no es necesario enviar dicho parámetro en la invocación. En cambio si los parámetros se definen de inout implica que hay que pasar todos los parámetros. Esto tiene como consecuencia que se envíen más bytes de los necesarios, lo cual es bastante inconveniente, especialmente en entornos tales como Internet.
Sintaxis
regla Parm
En la regla parm se dispone de un nuevo indicador para especificar como será el pasaje de los parámetros. Ejemplo:
parm( out:&par1, in:&par2, &par3)
En este ejemplo estamos indicando que el parámetro &par1 será de salida, el parámetro &par2 será de entrada, y el tercero (&par3) será de entrada/salida puesto que éste, es el valor por defecto.
Consideraciones Generales
Programas llamados como UDP/UDF
En los programas que son llamados con UDP o con UDF, el valor por defecto varía de generador en generador. En los generadores: Java, Visual Basic, Visual FoxPro, Fox Pro for Windows y Xbase, el valor por defecto es inout para todos los parámetros, comportamiento que puede ser modificado por el usuario mediante la definición del tipo de pasaje. Mientras tanto, en el resto de los generadores (Cobol, RPG, C/SQL) el valor por defecto es in para todos los parámetros, salvo el último que es de tipo out, y cualquier definición del tipo de pasaje, por parte del usuario, es ignorada por el generador.
Asignaciones a parámetros definidos como in
El especificador no dejará especificar un programa que asigne valores (en reglas/source/eventos) a parametros definidos como In.
Consideraciones
ü No funciona el indicador in con parámetros del tipo Array.
ü Un parámetro definido como In puede ser pasado como parámetro a otro programa donde esté definido como Out o InOut. La especificación no esta controlando este caso pero es considerado un error y será validado en futuras versiones.
11. Tomando en cuenta el concepto de parámetro de 5 ejemplos de programas donde se utilizan los parámetros
12. Define el concepto constructor y explique ampliamente para que sirve dentro de un programa
Definición de constructores de una clase.
Cuando se construye un objeto es necesario inicializar sus variables con valores coherentes, imaginemos un objeto de la clase Persona cuyo atributo color de pelo al nacer sea verde, un estado incorrecto tras construir el objeto persona. La solución en los lenguajes orientados a objetos es emplear los constructores. Un constructor es un método perteneciente a la clase que posee unas características especiales:
Se llama igual que la clase.
No devuelve nada, ni siquiera void.
Pueden existir varios, pero siguiendo las reglas de la sobrecarga de funciones.
De entre los que existan, tan sólo uno se ejecutará al crear un objeto de la clase.
Dentro del código de un constructor generalmente suele existir inicializaciones de variables y objetos, para conseguir que el objeto sea creado con dichos valores iniciales.
Para definir los constructores se emplea la siguiente sintaxis:
[modifVisibilidad] nombreConstructor (listaParámetros) [throws listaExcepciones]
{
}
13. Mediante 5 ejemplos de programación señale y explique el o los constructores utilizados
14. Define el concepto de destructor y explique ampliamente para que sirve dentro de un programa
Constructores
Definicion: El constructor de una clase es un método estándar para inicializar los objetos de esa clase
Se invoca automáticamente cuando new crea un objeto de esa clase.
Los constructores se declaran en el momento de definir la clase.
class A {
int x, y;
A() { x=0; y=0; } // el constructor
...
}
A a= new A();
a.Print(); // 0 0
El constructor puede tener parámetros. En este caso, se deben colocar los argumentos respectivos al crear el objeto:
class A {
int x, y;
A(int ix, int iy)
{ x=ix; y=iy; } // el constructor
...
}
A a= new A(1,2);
a.Print(); // 1 2
a= new A(); // error, hay que colocar
// los argumentos
a.A(1,2); // error, no se puede
// invocar el constructor
Se pueden colocar varios constructores. Durante la creación de un objeto, se invoca aquel que calza con los argumentos dados:
class A {
int x, y;
A() { x=0; y= 0; }
A(int ix, int iy)
{ x=ix; y=iy; }
A(A from)
{ x= from.x; y= from.y; }
...
}
A a1= new A();
a1.Print(); // 0 0
A a2= new A(1,2);
a2.Print(); // 1 2
A a3= new A(a2);
a3.Print(); // 1 2
Un destructor es un método que se invoca automáticamente cuando el objeto se destruye. Java no posee destructores, porque tiene recolección de basuras. C++ posee destructores.
15. Mediante 5 ejemplos de programación señale y explique el o los destructores utilizados