Está en la página 1de 13

CLASES, CAMPOS Y MÉTODOS

Conceptos de la POO, veremos los conceptos de clase, atributo y operación


usando notación UML; luego su implementación utilizando Java, donde se conoce
como clase, campo y método.

Definición de una clase


Una clase define un tipo de objeto en particular.
Por ejemplo, en una empresa la clase Factura define a todas las facturas que la
empresa emite.
Su sintaxis en Java es:

[ModificadorClase] class NombreClase {


// Campos
// Métodos
}

El ModificadorClase se resume en el siguiente cuadro:


Palabra Clave Descripción
public Define una clase como pública; en caso contrario su visibilidad
será solamente a nivel del paquete donde se encuentra.
abstract Esta palabra clave determina que la clase no puede ser
instanciada; es decir no podemos crear objetos de este tipo de
clase.
Este tipo de clase solo puede ser heredada.
final Esta palabra clave determina que la clase no puede ser
heredada, quiere decir que no podemos crear subclases de
este tipo de clase.
Este tipo de clase solo puede ser instanciada.

Ejemplo:
class Factura {
// Campos
private int numero;
private double importe;

// Métodos
public void grabar (…) {
...
...
}
} // Factura

Representación UML de una Clase


Para tener una representación gráfica de una clase se utiliza UML (Unified
Modeling Language), tal como se ilustra en la figura:

Figura 1: Representación UML de una clase

Declaración de Objetos
El operador new se utiliza para crear un objeto de un tipo de clase específica, es
decir, que asigne memoria para el objeto.
Para utilizar el operador new tenemos dos sintaxis.

Sintaxis 1
NombreDeClase nombreDeVariable;
nombreDeVariable = new NombreDeClase ( );

En la primera instrucción se define la variable que apuntará a un objeto que se


crea en la segunda instrucción.

Sintaxis 2
NombreDeClase nombreDeVariable = new NombreDeClase ( );
En este caso tanto la creación de la variable y la creación del objeto se realizan
en la misma instrucción.

Figura 2: Instanciación de una clase (Creación de un objeto)

Asignación de Objetos
Cuando creamos un objeto internamente existe un puntero al que no tenemos
acceso, pero cuando asignamos objetos, lo que realmente estamos asignando
son las direcciones de memoria donde están definidos los objetos, como se
explica en la figura 3.

Figura 3: Asignación de objetos

TRABAJANDO CON CAMPOS

Definición
Los campos definen los datos de un objeto; cuando definimos una clase debemos
definirlos y establecer su visibilidad:
La visibilidad determina desde que parte del código se puede acceder al campo.
Sintaxis:
[TipoAcceso] [ModificadorCampo] Tipo nombreCampo [= ValorInicial];
El TipoAcceso puede tomar los valores que se resume en el siguiente
cuadro:
Palabra Clave Descripción UML
public Indica que el campo es de acceso público. El acceso
se realiza a través de una instancia del objeto. +
abstract Indica que solo se puede acceder al campo desde
métodos de la misma clase y clases derivadas 
(subclases)
Final Indica que solo se puede acceder al campo desde -
métodos de la misma clase.
Sin especificar Indica acceso de paquete1, se puede acceder al
campo a través de una instancia, pero sólo desde
clases que se encuentren en el mismo paquete.

El ModificadorCampo puede tomar los valores que se resumen en el


siguiente cuadro:
Palabra Clave Descripción
static El campo pertenece a la clase, no a los objetos creados a
partir de ella.
Final El campo es una constante, en ese caso debe tener un
valor inicial obligatoriamente. Por convenio en java las
constantes se escriben en mayúsculas.
transient Marca el campo como transitorio, para no ser serializado.
Se usa cuando se trabaja con java beans.
volatile Es un campo accedido de forma asíncrona mediante hilos,
con este modificador se lo notificamos a java.

El ValorInicial permite inicializar la variable con un valor.

De acuerdo a la forma en que se especifica un atributo, objetos de otras clases


tienen distintas posibilidades de accederlos, tal como se resume en el siguiente
cuadro:
Acceso Desde private protected public (package)
La propia clase Si Si Si Si
Subclase en el mismo paquete No Si Si Si
Otras clases en el mismo paquete No No Si Si
1
Los paquetes permiten organizar clases según su naturaleza.
Subclases en otros paquetes No Si Si No
Otras clases en otros paquetes No No Si No

Ocultando los Datos


Uno de los fundamentos de la programación orientada a objetos es que el usuario
solo debe tener acceso a los datos que le son de su interés, y del modo que le
corresponde, por ejemplo solo lectura, solo escritura, ó ambos.
Para conseguir esto se debe declarar los atributos como privados, y se debe
implementar métodos para acceder a ellos. Existe un estándar para definir estos
métodos, por ejemplo, si el campo es nombre los métodos son:
- setNombre Este método permite asignar un valor al campo.
- getNombre Este método permite leer el valor del campo.
Como puede apreciar existen dos prefijos, el prefijo set que se utiliza para asignar
un valor al campo y el prefijo get para leer el valor del campo; de esta manera
podemos seleccionar si se implementa el método set, get, ó ambos, y restringir el
nivel de acceso a los datos.
Otra posibilidad que nos da la implementación de estos métodos es de poder
agregar funcionalidad que puede servir para verificar, por ejemplo, si el dato que
se está signando es correcto ó no.

Ejemplo:
En este ejemplo se ¡lustra el uso de los métodos set y get.
class Factura {
// Campos
private int numero;
// Métodos set y get
public void setNumero (int numero) {
this.numero = numero;
}
public int getNumero ( ) {
return this.numero;
}
. . .
. . .
} // Factura

Como puede apreciar en el código, el método setNumero se utiliza para asignar


un valor al campo numero, mientras que el método getNumero se utiliza para leer
su valor.
Es posible agregar lógica en cualquiera de los dos métodos, o en ambos si el
caso lo amerita.

TRABAJANDO CON MÉTODOS

Definición
Los métodos definen el comportamiento de un objeto de una clase concreta y
tienen las siguientes características:
- Agrupan las responsabilidades del objeto (competencias).
- Describen sus acciones.
Las acciones realizadas por un objeto son consecuencia directa de un estímulo
externo (un mensaje enviado desde otro objeto) y dependen del estado del objeto.
El estado y comportamiento de un objeto están relacionados. Por ejemplo, un
avión no puede aterrizar (acción) sino está en vuelo (estado).

Sintaxis:
[TipoAcceso] [ModificadorMétodo]
Tipo NombreMétodo ( [ ListaDeParámetros ] ) {
// Cuerpo de método
}

El TipoAcceso puede tomar los valores que se resumen en el siguiente cuadro:


Palabra Clave Descripción UML
public Indica que el método es de acceso público. El acceso
se realiza a través de una instancia del objeto. +
protected Indica que solo se puede acceder al método desde
métodos de la misma clase y clases derivadas 
(subclases)
private Indica que solo se puede acceder al método desde -
métodos de la misma clase.
sin especificar Indica visibilidad de paquete, se puede acceder al
método a través de una instancia, pero sólo desde
clases que se encuentren en el mismo paquete.

El ModificadorMétodo puede tomar los valores que se resumen en el


siguiente cuadro:
Palabra Clave Descripción
static El método pertenece a la clase, no a los objetos creados a
partir de ella.
final El método es definido como método definitivo, esto quiere
decir que no se puede redefinir en una subclase.
transient Determina que el método no se implementa en la clase, su
implementación será en las clases heredadas o subclases.
volatile Permiten sincronizar varios threads para el caso en que dos
o más accedan concurrentemente a los mismos datos.

El Tipo determina el tipo de dato que debe retornar el método, puede ser cualquier
tipo válido, incluso los tipos de clases creados por el programador. Si el método
no retorna ningún valor se debe especificar void.
Los parámetros son opcionales, pero si son necesarios se deben
especificar de la siguiente manera:
tipol parámetro1, tipo2 parametro2, ... ;
Los parámetros son variables que reciben valores de los argumentos que se le
pasan al método cuando éste es invocado.
Los métodos que son de un tipo diferente de void, deben retornan un valor a la
instrucción que realiza la llamada mediante la instrucción return, utilizando la
siguiente sintaxis:
return expresión;
Donde expresión representa el valor que retorna el método.

Sobrecarga de Métodos
Un método se identifica por su nombre, la cantidad de parámetros y el tipo de sus
parámetros; esto constituye la firma del método (signature).
La sobrecarga permite tener varios métodos con igual nombre pero con diferente
firma, o sea, con diferente cantidad de parámetros y diferentes tipos de datos de
sus parámetros. Los métodos tendrán comportamientos diferentes según el tipo
de dato, cantidad de parámetros o ambos. Al invocar un método, el compilador
busca en la clase el método que corresponda a los argumentos de la invocación.
Un ejemplo ilustrativo lo tenemos con el método valueOf de la clase String.

A continuación tenemos su implementación en Java:

public class Clasel {


// Métodos sobrecargados
public void Operación1 () {
// Implementación
}
public void Operacion1 (int Param1) {
// Implementación
}
public void Operacion1 (String Param1) {
// Implementación
}
public int Operacion1 (int Param1, String Param2) {
// Implementación
return 0;
}
public String Operacion1 (long Param1, String Param2) {
// Implementación
return null;
}
} // Clase1

Ejemplo:
Supongamos que queremos un método que sume dos números, podrías necesitar
que sume dos números de tipo int o double; entonces debemos implementar dos
métodos con el mismo nombre por que se trata de la misma operación, podría ser
sumar, pero con diferentes tipos de datos de sus parámetros, tal como se ¡lustra a
continuación:
package egcc;
public class Matematica {
public int sumar (int n1, int n2) {
int suma;
suma = n1 + n2;
return suma;
}
public double sumar (double n1, doble n2
double suma;
suma = n1 + n2;
return suma;
}
} // Matemática

Cuando usamos la clase Matemática el IDE nos permite visualizar los diversos
métodos que están sobrecargados:

Matematica obj=new Matematica();


System.out.println(obj.sumar(….));

EJEMPLO
Una institución financiera necesita de un programa que le permita encontrar el
importe que deben pagar sus clientes por los préstamos que realiza, se sabe que
se trata de un interés compuesto, capitalizable mensualmente. La formula que
debe aplicarse es:
M= C(1+i)n
Donde:
C : Capital
I : Tasa de interés por periodo, por ejemplo puede ser mensual
n : Número de periodos
M : Importe acumulado en el número de periodos

Abstracción
A continuación tenemos algunas alternativas de abstraer el problema.

Caso 01
En este caso los atributos son públicos (visibilidad publica)
Banco
por lo tanto se puede acceder de manera directa desde + capital : double
+ interes : double
cualquier otra clase u objeto. + periodo : int
El método calcularlmporte hace el cálculo en función al
+ calcularImporte()
valor de los campos capital, interés y periodo.

Caso 02
En este caso tenemos un solo método que tiene tres parámetros, a través de los
cuales recibe los datos para hacer el cálculo y retorna el resultado
correspondiente.

Banco
+ calcularImporte(capital: double, interes : double, periodos : int) : Double

Caso 03
En este caso, los atributos son privados y se accede a ellos a través de los
métodos set y get. Para obtener el importe se debe utilizar el método getImporte,
el cálculo se realiza en base a los campos respectivamente.
Banco
- capital : double
- interes : double
- periodo : int

+ setCapital(capital:double): void
+ getCapital(): double
+ setInteres(interes:double): void
+ getInteres(): double
+ setPeriodos(periodos: int): void
+ getPeriodos(): int
+ getImporte(): double
package tpagoxPrestamo;
public class Banco {
private double capital;
private double interes;
private int periodos;

public void setCapital(double capital){


this.capital=capital;
}
public double getCapital(){
return this.capital;
}
public void setInteres(double interes){
this.interes=interes;
}
public double getInteres(){
return this.interes;
}
public void setPeriodos(int periodos){
this.periodos=periodos;
}
public int getPeriodos(){
return this.periodos;
}
public double getImporte(){
double importe;
importe=this.getCapital()*Math.pow((1+this.getInteres()),this.getPeriodos());
return importe;
}
}

public class Principal extends javax.swing.JFrame {

/** Creates new form Principal */


public Principal() {
initComponents();
}

private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) {


double capital=Double.parseDouble(this.txtCapital.getText());
double interes=Double.parseDouble(this.txtInteres.getText());
int periodos=Integer.parseInt(this.txtPeriodos.getText());

//Instanciar la clase Banco


tpagoxPrestamo.Banco objBanco=new tpagoxPrestamo.Banco();

//Proceso
objBanco.setCapital(capital);
objBanco.setInteres(interes);
objBanco.setPeriodos(periodos);
double importe=objBanco.getImporte();

//Redondear importe a dos decimales


importe =importe*100;
importe=Math.round(importe);
importe=importe/100;

//resultado
this.txtImporte.setText(String.valueOf(importe));
}

private void btnLimpiarActionPerformed(java.awt.event.ActionEvent evt) {


this.txtCapital.setText("");
this.txtInteres.setText("");
this.txtPeriodos.setText("");
this.txtImporte.setText("");
}

private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) {


System.exit(0);
}

public static void main(String args[]) {


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Principal().setVisible(true);
}
});
}

// Variables declaration - do not modify


private javax.swing.JButton btnCalcular;
private javax.swing.JButton btnCerrar;
private javax.swing.JButton btnLimpiar;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JTextField txtCapital;
private javax.swing.JTextField txtImporte;
private javax.swing.JTextField txtInteres;
private javax.swing.JTextField txtPeriodos;
// End of variables declaration

Referencia:
Desarrollando soluciones con Java y MySql.
Eric Gustavo Coronel.
Capítulo 3

También podría gustarte