La definición de una clase especifica cómo serán los objetos de dicha clase,
esto es, de que variables y de que métodos constarán.
La siguiente es la definición más simple de una clase:
La siguiente es la definición más simple de una clase:
class
nombreClase /* Declaración de la
clase */
{
/* Aquí va la
definición de variables y métodos */
}
Como se puede observar, la definición de una clase consta de dos
partes fundamentales:
* La declaración de la clase
Indica el nombre de la clase precedido por la palabra clave class.
* El cuerpo de la clase
* La declaración de la clase
Indica el nombre de la clase precedido por la palabra clave class.
* El cuerpo de la clase
El cuerpo de la clase sigue a la declaración de la clase y está
contenido entre la pareja de llaves ({ y }). El cuerpo de la clase contiene las
declaraciones de las variables de la clase, y también la declaración y la
implementación de los métodos que operan sobre dichas variables.
- Declaración
de variables de instancia
El estado de un objeto está representado por sus variables (variables de instancia). Las variables de instancia se declaran dentro del cuerpo de la clase. Típicamente, las variables de instancia se declaran antes de la declaración de los métodos, pero esto no es necesariamente requerido.
- Implementación
de métodos
Los métodos de una clase determinan los mensajes que un objeto
puede recibir.
Las partes fundamentales de un método son el valor de retorno, el nombre, los argumentos (opcionales) y su cuerpo. Además, un método puede llevar otros modificadores opcionales que van al inicio de la declaración del método y que se analizarán más adelante. La sintaxis de un método es la siguiente:
Las partes fundamentales de un método son el valor de retorno, el nombre, los argumentos (opcionales) y su cuerpo. Además, un método puede llevar otros modificadores opcionales que van al inicio de la declaración del método y que se analizarán más adelante. La sintaxis de un método es la siguiente:
<otrosModificadores>
valorRetorno nombreMetodo(
<lista de argumentos> )
{
/* Cuerpo del método
*/
sentencias;
}
Los signos <>
indican que no son obligatorios.
Los métodos en Java pueden ser creados únicamente como parte de
una clase. Cuando se llama a un método de un objeto se dice comúnmente que se
envia un mensaje al objeto.
Ejemplo
/* Usuario.java */
class Usuario
{
String nombre;
int edad;
String direccion;
void setNombre(String n)
{
nombre = n;
}
String getNombre()
{
return nombre;
}
void setEdad(int e)
{
edad = e;
}
int getEdad()
{
return edad;
}
void
setDireccion(String d)
{
direccion = d;
}
String getDireccion()
{
return direccion;
}
}
Constructores y creación de
objetos
Una vez que se tiene definida la clase a partir de la cual se crearán los objetos
se está en la posibilidad de instanciar los objetos requeridos. Para la clase Usuario del ejemplo anterior podemos crear un objeto de la siguiente manera:
Usuario
usr1; //usr1 es una variable del tipo
Usuario
usr1 = new
Usuario();
La primera línea corresponde a la declaración del objeto, es decir, se
declara una variable del tipo de objeto deseado.
La segunda línea corresponde a la iniciación del objeto.
La segunda línea corresponde a la iniciación del objeto.
- El operador
new
El operador new crea
una instancia de una clase asignando la cantidad de memoria necesaria de
acuerdo al tipo de objeto. El operador new se utiliza en
conjunto con un constructor. El operadornew regresa una
referencia a un nuevo objeto.
- Constructores
Un constructor es un tipo
específico de método que siempre tiene el mismo nombre que la clase, y que se
utiliza cuando se desean crear objetos de dicha clase, es decir, se utiliza al
crear e iniciar un objeto de una clase.
- Constructores
múltiples
Cuando se declara una clase en
Java, se pueden declarar uno o más constructores (constructores múltiples)
opcionales que realizan la iniciación cuando se instancia un objeto de dicha
clase.
Para la clase Usuario del ejemplo anterior no se especificó ningún
constructor, sin embargo, Java proporciona un constructor por omisión que inicia
las variables del objeto a sus valores predeterminados.
Ej.
/* ProgUsuario.java */
class ProgUsuario
{
public static void main(String args[])
{
Usuario usr1, usr2; /* Se declaran dos objetos de la clase
Usuario */
boolean si_no;
usr1 = new Usuario(); /* Se utiliza el constructor por omisión
*/
si_no = usr1 instanceof Usuario;
if(si_no == true)
System.out.println("\nEl objeto
usr1 SI es instancia de Usuario.");
else
System.out.println("\nEl objeto
usr1 NO es instancia de Usuario.");
usr2 = usr1; /* usr1 y usr2 son el mismo objeto */
si_no = usr2 instanceof Usuario;
if(si_no == true)
System.out.println("\nEl objeto
usr2 SI es instancia de Usuario.");
else
System.out.println("\nEl objeto
usr2 NO es instancia de Usuario.");
}
}
Main ()
El método Main ()
Cada aplicación de C# debe contener un método Main único,
que especifique dónde debe comenzar la ejecución del programa. En C#,Main se
pone en mayúsculas, mientras que Java utiliza main en
minúscula.
Main puede devolver sólo int o void y
tiene un argumento de matriz de cadena opcional para representar parámetros de
línea de comandos:
C#
static int Main(string[] args)
{
//...
return 0;
}
El parámetro de matriz de cadena, que contiene todos los argumentos de
la línea de comandos pasados, funciona igual que en Java. Así, args[0] especifica el
primer parámetro de línea de comandos, args[1] denota el
segundo parámetro, etc. A diferencia de C++, la matriz args no contiene
el nombre del archivo EXE.
Cuando se pasan parámetros a un método, se pueden pasar por valor o por
referencia. Los parámetros de valor simplemente toman el valor de cualquier
variable para utilizarlo en el método. Por lo tanto, el valor de variable en el
código de llamada no se ve afectado por las acciones realizadas en los
parámetros de un método.
Sin embargo, los parámetros de referencia apuntan a una variable
declarada en el código de llamada; por lo tanto, los métodos modificarán el
contenido de esa variable cuando se pase por referencia.
En Java y C#, los parámetros de método que hacen referencia a un objeto
siempre se pasan por referencia, mientras que los parámetros de tipo de datos
primitivo (tipos de valor en C#) se pasan por valor.
En C#, para pasar un tipo de valor por referencia, debe especificar una
de las palabras clave ref o out. La diferencia entre estas dos palabras
clave radica en la inicialización de los parámetros. Un parámetro ref se
debe inicializar antes de su utilización, mientras que un parámetro out no
debe inicializarse explícitamente sin que antes se haya pasado por referencia y
se haya omitido cualquier valor anterior.
Especifique esta palabra clave en un parámetro de tipo de valor cuando
desee que el método llamado cambie permanentemente el valor de las variables
utilizadas como parámetros. De esta manera, en lugar de pasar el valor de una
variable utilizada en la llamada, se pasa una referencia a la propia variable.
Entonces el método funciona en la referencia, de modo que los cambios
realizados al parámetro durante la ejecución del método se conservan en la
variable original utilizada como parámetro para el método.
El código siguiente muestra un ejemplo de esto en el método Add, donde el segundo
parámetro int se pasa por referencia con la palabra
clave ref:
C#
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original
value of 'total': {0}", total);
Add(10, ref total);
System.Console.WriteLine("Value
after calling Add(): {0}", total);
}
}
El resultado de este sencillo ejemplo demuestra que los cambios
realizados al parámetro resultante se reflejan en la variable total, utilizada en la
llamada al método Add :
Original value of 'total': 20
Value after calling Add(): 30
Esto se debe a que el parámetro resultante hace referencia a la
ubicación de memoria real que ocupa la variable total en el código de llamada.
Una propiedad de una clase no es una variable; por lo tanto, no se puede
utilizar directamente como parámetro ref.
La palabra clave ref debe preceder al parámetro cuando
se llama al método, al igual que en la declaración de método.
La palabra clave out tiene un efecto muy similar a la
palabra clave ref. Las modificaciones realizadas a un parámetro
declarado que utiliza out serán visibles fuera del método. Las
dos diferencias con respecto a ref son que todo valor inicial
de un parámetro out se omite dentro del método y que un
parámetro out se debe asignar durante la ejecución del método:
C#
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value
inside method: {0}", result);
result = i + j;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original
value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value
after calling Add(): {0}", total);
}
}
En este caso, el tercer parámetro para el método Add se declara
con la palabra clave out y las llamadas al método también
necesitan la palabra clave out para ese parámetro. El resultado será:
Original value of 'total': 20
Value after calling Add(): 110
Por lo tanto utilice la palabra clave ref cuando desee
que un método modifique una variable existente y utilice la palabra clave out,
para devolver un valor generado dentro del método. Generalmente, esto se
utiliza junto con el valor que el método devuelve cuando éste genera más de un
valor resultante para el código de llamada.
No hay comentarios:
Publicar un comentario