Fundamentos de Informática Lección 6. Métodos de objetos j y clases Curso 2010-2011 José Ángel Bañares y Pedro Álvarez 2/11/2010. Dpto. Informática e Ingeniería de Sistemas. Índice de contenidos Abstracción Clases como mecanismo para definir abstracciones Declaración de métodos: procedimientos y funciones. funciones Invocación de métodos. Paso de parámetros. Métodos de clase y objeto Diseño descendente Abstracción Abstraer,, o el “método de dar nombre” a conceptos sobre los que construir nuestros programas Podemos asociar un nombre con una dirección de memoria: Nombre de la variable) Podemos asociar un nombre con una “estructura” o forma de interpretar uno o más bytes: Tipo de dato Podemos asociar un nombre con un grupo de instrucciones java: método Podemos asociar nombres a nuevas abstracciones no soportadas por el lenguaje: nuevos tipos de datos agrupando variables relacionadas y funciones Clases En Java los p programas g están formados por una o más clases Una de las clases define el método static void main (String[] args) agrupa las instrucciones que se ejecutarán al invocar la ejecución del programa. Las clases del programa Java pueden definir más métodos: Nombre que damos a “instrucciones” definidas por el programador y no soportadas directamente en el lenguaje Diseño top-down: Descomposición del problema en subproblemas. Clases Las clases p permiten definir nuevas “abstracciones” que agrupan: datos (fields): agrupación de datos. Métodos (methods):acciones que se pueden con la abstracción. Las nuevas abstracciones pueden ser: Programas Nuevos N ti tipos de d datos d t Librería de funciones (por ej. Math). Declaración de métodos Declaración del método Modificadores tipo nombre (parámetros) { Variables y sentencias return expresión; p ; // //del tipo p declarado } El tipo void Tipo Ti primitivo i iti (entero,r ( t eal,l carácter, á t b l booleano) ) Clase Procedimientos / Acciones (void) public class DibujaCaja{ static void caja(){ System.out.println("+-----------+"); System.out.println("+ +"); System out println("+ System.out.println( + + +"); ); System.out.println("+-----------+"); } public static void main ( (String[] p g[] args){ g ){ caja(); } } Declaración Invocación método estático definido en la clase +-----------+ + + + + +-----------+ Procedimientos / Acciones (void) public class DibujaCaja{ static void caja(){ System.out.println("+-----------+"); System.out.println("+ +"); System out println("+ System.out.println( + + +"); ); System.out.println("+-----------+"); } public static void main ( (String[] p g[] args){ g ){ DibujaCaja.caja(); } } Declaración Invocación método estático definido en la clase +-----------+ + + + + +-----------+ Funciones (valores) public class LiberiaMat { public static double E (){ final double PRECISION= 1E-5; Declaración double termino = 1.0; double exp = termino; double indice = 1; while (termino > PRECISION){ termino = termino /indice; exp+=termino; indice++; } return exp; } public bli static t ti void id main i (String[] (St i [] args){ ){ System.out.println(E()+1); } Invocación 3.7182815255731922 Llamadas a métodos Declaración del método Método (parámetro) - Declarado en la propia clase caja(); j () Clase. Método(parámetros) - Declarado estático en otra clase DibujaCaja.caja(); Objeto método (parámetros) - Declarado en otro objeto Objeto.método v1.length Paso de parámetros El valor devuelto o la acción p puede depender p de parámetros Declaración parámetos formales (o parámetros) Modificadores tipo nombre (tipo variable, tipo variable ..) { Variables y sentencias return expresión; p ; // //del tipo p declarado } Argumentos o parámetros reales (expresion, expresion, ...) caja(5,5); Math.exp(2); p( ); Paso de parámetros Declaración parámetos formales (o parámetros) static void caja (int anchura, anchura int profundidad) Método caja tamaño 60 anchura h 60 A t o parámetros á t l Argumentos reales Int tamaño= 60; caja(tamaño,(int) tamaño/2); profundidad 30 Variable e instrucciones del método caja Paso de parámetros En Java se p pasan el valor de los argumentos Si es un tipo primitivo No se puede modificar el valor. Si son objetos bj t se pasa ell “puntero” “ t ” all objeto. Se puede modificar el estado del objeto. objeto Nota: En lenguajes como Ada se distingue parámetros de entrada, salida, e/s. e/s Declaración de métodos Declaración del método Modificadores tipo nombre (parámetros) { Variables y sentencias return expresión; p ; // //del tipo p declarado } Modificadores public: Puede invocarse por otras clases static: Método de clase final: Como los atributos final, supone que el compilador puede sustituir la invocación por las sentencias del método. Métodos de clase y objeto Cuando la clase define nuevos tipos de d t datos, podemos d crear objetos bj t d l tipo del ti especificado. int[] listaEnteros =new int[] {5,4,1}; {5 4 1}; Los objetos agrupan datos y tienen estado listaEnteros[1] =2; método de objeto: El resultado depende del j listaEnteros.length g ; estado del objeto Método de clase: El resultado no depende del estado Math.abs(-1); Métodos de clase (static) Invocación método de clase NombreClase.NombreMetodo(); NombreObjeto.NombreMetodo(); > Character.getNumericValue('a') 10 > Math.abs(-1) h b ( 1) 1 Dentro de la clase en la que se define el método se puede invocar utilizando sólo el nombre del método NombreMetodo(); Métodos de objeto Invocación método de objeto j NombreObjeto.NombreMetodo(); > String nombre = "El mono lleva kimono"; > System.out.println(nombre); El mono lleva kimono > String nombreMinuscula=nombre.toLowerCase(); > System.out.println(nombreMinuscula); el mono lleva kimono Métodos de objeto Todos los métodos de la clase String g no cambian el String original. Devuelven un nuevo String. Los String son inmutables. > String nombreMayuscula=nombre.toUpperCase(); > System.out.println(nombreMayuscula); System out println(nombreMayuscula); EL MONO LLEVA KIMONO > System.out.println(nombre); El mono lleva kimono > nombre = nombre.toUpperCase(); > System.out.println(nombre); S stem o t println(nombre) EL MONO LLEVA KIMONO Declaración de métodos final public static final void f() { System.out.println(”método f() de A"); } } // La clase B invoca i un método é final i public class B { public void g() { A f() A.f(); } } //En tiempo de compilación nuestra clase B se convierte en: public class B { public void g() { System out println("método System.out.println( método f() de A"); A ); } } Diseño descendente Problema: Dibujar j tabla con caracteres ‘+’, ‘-’, ‘ ‘ número espacios p +---+---+---+ + Número filas + + + +---+---+---+ + + + + +---+---+---+ número columnas Diseño descendente Problema: Dibujar j tabla con caracteres ‘+’, ‘-’, ‘ ‘ número espacios p Número filas +---+---+---+ dibLHoz + dibLSep + + + +---+---+---+ + + + dibLHoz + dibLSep +---+---+---+ dibLHoz número columnas Diseño descendente Cuadrados (Pb) dibLHoz; for (int i=1;i<=nf; i++){ dibLSep; dibLHoz; } dibLHoz (Pb 1) System.out.print('+'); for (int i=1; i<=nc; i++) { escribeGuiones(ne); System.out.print('+'); } System out println(); System.out.println(); dibLSep (Pb2) System.out.print(‘+'); for (int i=1; i<=nc; i++) { escribeBlancos(ne); System.out.print(’ '); } System out println(); System.out.println(); Diseño descendente Cuadrados (Pb) dibLHoz (Pb 1) dibLH System.out.print('+'); for (int i=1; i<=nc; i++) { escribeGuiones(ne); System.out.print('+'); } S t System.out.println(); t i tl () Escribir-guiones ( Pb1.1) f ( for(int i=1; 1 i<=n; i++)) System.out.print('-'); dibLS (Pb2) dibLSep System.out.print(‘+'); for (int i=1; i<=nc; i++) { escribeBlancos(ne); System.out.print(’ '); } System.out.println(); Escribir-blancos (Pb 1.2) for(int i=1; i<=n; i++) System.out.print(’ '); Diseño descendentes sin métodos import java.util.Scanner public class Cuadrados { static void main(String[] args){ Scanner entrada = new Scanner(System.in); ( y ); System.out.print("Numero filas:"); int nf = entrada.nextInt(); () System.out.print("Numero columnas:"); int nc = entrada.nextInt(); System.out.print("Numero espacios:"); int ne = entrada.nextInt(); Diseño descendentes sin métodos //Dibujar Linea Horizontal System.out.print('+'); for (int i=1; i<=nc; i++) { for(int ( jj=1;; j<=ne; j ; jj++)) System.out.print('-'); System.out.print('+'); } System.out.println(); Diseño descendentes sin for (int i=1;i<=nf; i++){ métodos //Dibujar linea separación System.out.print('+'); for (int ll=1; 1; l<=nc; l< nc; l++) l ){ for(int j=1; j<=ne; j++) System.out.print(' '); y p ( ); System.out.print('+'); } System.out.println(); //Dibujar Linea Horizontal System.out.print('+'); for (int l=1; l<=nc; l++) { for(int j=1; j<=ne; j++) System.out.print('-'); System.out.print('+'); } System.out.println(); } Métodos con parámetros 0 import java.util.Scanner; public class Cuadrados { public static void dibLineaH(int ne, int nc){ System.out.print('+'); for ((int i=1; i<=nc; i++)) { for(int j=1; j<=ne; j++) System.out.print('-'); System.out.print('+'); } System.out.println(); } Métodos con parámetros 0 public static void dibLineaSep(int ne, int nc){ System.out.print('+'); for (int i=1; i<=nc; i++) { for(int ( jj=1;; j<=ne; j ; jj++)) System.out.print(' '); System.out.print('+'); } System.out.println(); } Métodos con parámetros 0 public static void main(String[] args){ Scanner entrada = new Scanner(System.in); System.out.print("Numero filas:"); int nf = entrada.nextInt(); (); System.out.print("Numero columnas:"); int nc = entrada.nextInt(); System.out.print("Numero y p ( espacios:"); p ) int ne = entrada.nextInt(); dibLineaH(ne,nc); for (int i=1;i<=nf; i++){ dibLineaSep(ne,nc); dibLineaH(ne,nc); } } } Métodos con parámetros I import java.util.Scanner; public class Cuadrados1 { public static void escribeGuiones ((int n){ p ){ for(int i=1; i<=n; i++) System.out.print('-'); } public static void escribeBlancos (int n){ for(int i=1; i<=n; i++) System.out.print(' '); } Métodos con parámetros I public static void dibLineaH(int ne, int nc){ System out print('+'); System.out.print( + ); for (int i=1; i<=nc; i++) { escribeGuiones(ne); System.out.print('+'); y p ( ); } System.out.println(); } public static void dibLineaSep(int ne, int nc){ System.out.print('+'); for (int i=1; i<=nc; i++) { escribeBlancos(ne); System.out.print('+'); } S System.out.println(); () } Métodos con parámetros I public static void main(String[] args){ Scanner entrada = new Scanner(System.in); System.out.print("Numero filas:"); int nf = entrada.nextInt(); (); System.out.print("Numero columnas:"); int nc = entrada.nextInt(); System.out.print("Numero y p ( espacios:"); p ) int ne = entrada.nextInt(); dibLineaH(ne,nc); for (int i=1;i<=nf; i++){ dibLineaSep(ne,nc); dibLineaH(ne,nc); } } Métodos con parámetros I import java.util.Scanner; public class Cuadrados1 { public static void escribeGuiones ((int n){ p ){ for(int i=1; i<=n; i++) System.out.print('-'); } public static void escribeBlancos (int n){ for(int i=1; i<=n; i++) System.out.print(' '); } Métodos con parámetros II public static void repiteChar (int n, char letra){ for(int i=1; i<=n; i++) System.out.print(letra); } Métodos con parámetros II public static void dibLineaH(int ne, int nc){ System.out.print('+'); for (int i=1; i<=nc; i++) { escribeGuiones(ne); S t System.out.print('+'); t i t(' ') } System.out.println(); } public static void dibLineaSep(int ne, int nc){ System.out.print('+'); for (int i=1; i<=nc; i++) { escribeBlancos(ne); System.out.print('+'); } System.out.println(); } Métodos con parámetros II public static void dibLinea(int ne, int nc, char inicial, char separacion){ System.out.print(inicial); for (int i=1; i<=nc; i++) { repiteChar(ne, separacion); S t System.out.print(inicial); t i t(i i i l) } System.out.println(); } Métodos con parámetros II import java.util.Scanner; public class Cuadros { public bli static t ti void id repiteChar it Ch (int (i t n, char h letra){ l t ){ for(int i=1; i<=n; i++) System.out.print(letra); } public static void dibLinea(int ne, int nc, char inicial, char separacion){ System.out.print(inicial); for (int i=1; i<=nc; i++) { repiteChar(ne, separacion); System.out.print(inicial); } System.out.println(); } Métodos con parámetros II public static void main(String[] args){ Scanner entrada = new Scanner(System.in); System.out.print("Numero filas:"); i t nff = entrada.nextInt(); int t d tI t() System.out.print("Numero columnas:"); int nc = entrada.nextInt(); System out print("Numero espacios:"); System.out.print("Numero int ne = entrada.nextInt(); dibLinea(ne,nc, dibLinea(ne nc '+' + ,'-'); ); for (int i=1;i<=nf; i++){ dibLinea(ne,nc,'+',' '); dibLinea(ne nc '+' dibLinea(ne,nc, + ,'-'); ); } }