Está en la página 1de 28

PROGRAMACIN ORIENTADA A

OBJETOS
Karim Guevara Puente de la Vega
2016
Conceptos de POO
Un objeto combina datos y operaciones (mtodos)
Encapsulamiento - ocultamiento de informacin
Separa el qu (especificacin funcional, pblica)
Del cmo (implementacin, privada)
Conceptos que apoyan la reutilizacin de cdigo
Cdigo genrico - lgica del algoritmo independiente del tipo
de datos.
Herencia - extiende la funcionalidad de un objeto.
Polimorfismo - seleccin automtica de la operacin
apropiada segn el tipo y nmero de los parmetros.
Clases
En java un objeto es una instancia de una clase.

public class Entero{


private int valor;

public int leer(){


return valor;
}
public void guardar(int x){
valor = x;
}
} public class Prueba{
public static void main(String[] args){

Entero m = new Entero();


m.guardar(5);
System.out.println(m = +m.leer());
}
}
Tipos de mtodos
Constructores inicializan el objeto

public class Fecha{


private int a;
private int m;
private int d;

public Fecha(int aa, int mm, int dd){


a = aa;
m = mm;
d = dd;
}
public Fecha(){
a = 2016; ...
m = 5; Fecha f1 = new Fecha();
d = 10; Fecha f2 = new Fecha(2001, 8, 23);
} ...
}
Tipos de mtodos
Mutators y Accessors permiten acceder a las
variables privadas para recuperar o modificar su valor.
P.e. guardar(), leer()

Asla a los usuarios de una clase de los detalles de


implementacin de la clase,
Evita que se vean afectados por cambios en la
implementacin.
Tipos de mtodos
toString
Al imprimir objeto a usando println, se invoca
automticamente a.toString()
Para imprimir objetos tipo Fecha, proveer una implementacin
de toString

public String toString();


return d + / + m + / + a;
}
Tipos de mtodos
equals
Se utiliza para evaluar si dos objetos tienen el mismo valor.
if( x.equals(y) )
Declaracin
public boolean equals( Object b )

Object: tipo de objeto universal

public boolean equals(Object b);


if ( !(b instanceof Fecha))
return false;
Fecha f = (Fecha) b;
return a==f.a && m==f.m && d==f.d;
}
this
Identifica al objeto actual.
Permite accede a los campos: this.a
Compara si un objeto es el mismo que otro.
Sirve como constructor, para llamar a otro constructor de la
misma clase.

public Fecha() {
this (2001, 1, 1);
}
Campos y mtodos estticos
Hay dos tipos de campos estticos
public final static doble PI = 3.14159; //constante

private static int precioActual = 1300; //variable compartida


//para todos los objetos de la clase

Los mtodos estn asociados a una clase, no a objetos


particulares
Math.sin

Integer.parseInt

No pueden hacer uso de la referencia this


Campos y mtodos estticos
class Matematica{
public static int max(int a, int b) {
if (a > b) return a;
return b;
}

public static int min(int a, int b) {


return (a < b ? a : b);
}
}

...
int may = Matematica.max(10,56);
System.out.println(Menor : +Matematica.min(2,19));
...
Packages
Agrupan clases

Package P;

class C {
...
}

Si una variable no es public ni private, es visible solo


dentro del mismo package
La clase C se denomina P.C
Si import P.C; o bien import P.*
La clase se denota por C
Herencia
Permite reutilizar cdigo ya desarrollado
Relacin is-a
P.e. Circulo is-a Figura
Auto is-a Vehculo

Las clases forman una jerarqua en base a la relacin de


herencia

Otro tipo de relacin es has-a: agregacin


P.e. Auto has-a Manubrio
Herencia
Clase base - clase de la cual derivan otras
Clase derivada - hereda todas las propiedad de la clase
base.
Posee otros atributos y/o mtodos
Redefine mtodos
Permite reutilizar cdigo ya desarrollado.
Los cambios efectuados en la clase derivada no afectan a
la clase base

public class Derivada extends Base{


...
}
Visibilidad
Public

Private

Protected
Constructores
Sino se define un constructor, se genera automticamente
un constructor sin parmetros:
Llama al constructor con cero parmetros de la clase base,
para la parte heredada
Inicializa con valores nulos los campos restantes.
Si hay un constructor, su primera instruccin puede ser una
llamada a:
super();

Invoca al constructor de la clase base.


final
Si un mtodo se declara como final, no puede ser
redefinido en las clases derivadas.

Una clase declarada como final no puede ser extendida.


Compatibilidad de tipos
class Person {
public Person(String n, int ag, String ad ) {
name = n; age = ag; address = ad;
}
public String toString( ) {
return getName( ) + " " + getAge( );
}
public String getName( ) { return name; }
public int getAge( ) { return age; }
public String getAddress( ) { return address; }
public void setAddress( String newAddress ){ address = newAddress; }
public void setAge( int newAge ) { age = newAge; }
private String name;
private int age;
private String address;
}
Compatibilidad de tipos

Person Class name age


address

Person
Student Class name age
address
gpa

Student Employee
Employee Class name age
address
salary
Compatibilidad de tipos
class Student extends Person {
public Student( String n, int ag, String ad, double g ) {
super( n, ag, ad); gpa = g;
}
public String toString( ) { return super.toString( ) + getGPA( ); }
public double getGPA( ) { return gpa; }
private double gpa;
}
class Persona extends Person {
public Persona( String n, int ag, String ad, double s ) {
super( n, ag, ad); salary = s;
}
public String toString( ) {
return super.toString( ) + $ + getSalary( );
}
public double getSalary( ) { return salary; }
public void raise( double percentRaise ) {
salary *= (1 + percentRaise);
}
private double salary;
}
Compatibilidad de tipos
Student IS-A Person, un objeto Student puede ser accedido a travs de
una referencia Person:
. . .
Student s = new Student( "Joe", 26, Av. Ejercito 126", 4.0 );
Person p = s;
System.out.println( "Age is " + p.getAge( ) );
. . .

Una variable puede referenciar a muchos objetos de diferentes tipos:


polimorfismo
. . .
Employee e = new Employee( Carlos", 42, Peral 276",1000.0 );
Person p = null;
if( getTodaysDay( ).equals( "Tuesday" ) )
p = s;
else
p = e;
System.out.println( "Person is " + p.toString( ) );
Compatibilidad de tipos
class PersonDemo {
public static void printAll( Person [ ] arr ) {
for( int i = 0; i < arr.length; i++ ) {
if( arr[ i ] != null ) {
System.out.print( "[" + i + "] " );
System.out.println( arr[ i ].toString( ) );
}
}
}
public static void main( String [ ] args ) {
Person [ ] p = new Person[ 4 ];

p[0] = new Person( "joe", 25, Los Arces 109");


p[1] = new Student( "jill", 27, Bolivar 345", 4.0 );
p[3] = new Employee( "bob", 29, Jerusalen 890",1000.0);
printAll( p );
}
}
Compatibilidad de tipos
Ahora, supongamos que le queremos dar un aumento a p[3]:
Cul es el tipo esttico de p[3]?

. . .
p[3].raise(0.04);

En tiempo de compilacin, slo los miembros del tipo esttico


pueden aparecer a la derecha del operador (.):

. . .
((Employee) p[3].raise(0.04);

downcast - cambio del tipo esttico de un objeto de una clase


base a una clase ms abajo en la jerarqua de herencia
Compatibilidad de tipos
Qu pasa si p [3] no es un empleado? qu pasara si
utilizamos lo siguiente?
. . .
((Empleado) p[1]).raise(0,04); // p[1] es un Estudiante

Se compila, pero la mquina virtual puede lanzar una


excepcin ClassCastException, por tanto:

. . .
if( p[3] instanceof Employee )
((Employee) p[3]).raise( 0.04 );
Mtodos abstractos
Un mtodo abstracto declara funcionalidad, pero no la
implementa.
Las clases derivadas deben proveer implementaciones para
estos mtodos.
Una clase abstracta es una clase que tiene al menos un
mtodo abstracto.
No se puede crear objetos pertenecientes a una clase
abstracta.
Mtodos abstractos
abstract class Figura {
private String nombre;
abstract public double area();

public Figura(String n) {
nombre = n;
}
//Este constructor no puede ser invocado directamente,
// slo lo usan las clases derivadas
final public double compArea( Figura b ) {
return area() - b.area();
}
final public String toString() {
return nombre + " de area " + area();
}
}
Mtodos abstractos
Clases derivadas
public class Circulo extends Figura {
static final private double PI = 3.141592653;
private double radio;

public Circulo( double r ) {


super( "circulo" );
radio = r;
}
public double area() {
return PI * radio * radio;
}
}
Mtodos abstractos
Clases derivadas
public class Circulo extends Figura {
static final private double PI = 3.141592653;
private double radio;

public Circulo( double r ) {


super( "circulo" public
); class Rectangulo extends Figura {
radio = r; private double largo;
} private double ancho;
public double area() {
public Rectangulo ( double l, double a ) {
return PI * radio*radio;
} super( rectangulo" );
} largo = l;
ancho = a;
}
public double area() {
return largo * ancho;
}
}
Mtodos abstractos
Clases derivadas
public class Circulo extends Figura {
static final private double PI = 3.141592653;
private double radio;

public Circulo( double r ) {


super( "circulo" public
); class Rectangulo extends Figura {
radio = r; private double largo;
} private double ancho;
public double area() {
public Rectangulo ( double l, double a ) {
return PI * radio*radio;
} super( rectangulo" );
} largo = l;
ancho = a;
}
public class Cuadrado extends Rectangulo {
public Cuadrado ( doublepublic
lado double
) { area() {
super( lado, lado ); return largo * ancho;
} }
} }

También podría gustarte