1JAVA desde cero Objetivos Construye clases siguiendo especificaciones. Describe los conceptos fundamentales de la programación orientada a objetos. Reconoce la sintaxis utilizada en un lenguaje de programación orientada a objetos. Busca en la documentación del lenguaje acerca del uso de las clases predefinidas. Utiliza las clases predefinidas en el lenguaje para resolver un problema dado. Reconoce la sintaxis utilizada en un lenguaje de programación orientada a objetos. Introducción Primero que todo, deseo compartir mis clases con el Foro... de esta forma todos aprendemos de la misma forma, no creen ?? ... los objetivos planteados son más que todo una referencia pequeña, de lo que se desea llevar a cabo en este pequeño proyecto... Espero cada dos días, ir agregando in formación y cursos dentro de este... Claro está que antes de ver todo eso, debemos ver algo de Programación Estructurada para aquellos que nunca han visto como hacer un programa, ya sea en JAVA, u en otros lenguajes de programación. 2 Dar una Introducción de JAVA, está de más... rafaelsk, dio bastante introducción al tema... asi que a trabajar... Estructura Es la estructura de un programa basado en JAVA, por ahora será nuestro "Ave María"... xD, siguiendo el curso, se irá viendo como corresponde cada secuencia... Sentencia de paquetes (packages) (opcional) 0,1,2,3,4..... N sentenciasde importación Serie de comentarios (opcional) Declaraciones de clases privadas (si se desea, claro) Una declaración de clases públicas Declaración de clases Declaración de variables de la clase Declaración de variables de instancia Definición de constructores Definición de métodos Descarga e instalación de algún compilador Para trabajar con JAVA, usaremos JDK Versión 6 Update 6, se puede descargar de la siguiente página: Aquì Pero no trabajaremos en sí con el compilador JAVAC, que es el compilador de JAVA, sino utilizaremos un programa para poder trabajar de forma más cómoda con un modo GUI, para ello utilizaremos JCreator Pro que es un IDE de JAVA, descargable de su Web Oficial http://www.jcreator.com/download.htm, disponible para Windows Vista, Win2000 y WinXP. Guardamos y ejecutamos el EXE: 3 Apretamos Next (siguiente), y aceptamos la Licencia Crearemos el PATH (directorio), donde queremos instalar JCreator Pro Comienza la instalación 4 Lanzamos el JCreator He aquí donde nos encontramos con la configuración de programa, decidiremos si queremos que el compilador sea solamente utilizable para el usuario disponible, para todos los usuarios, o solamente para ejecutarlo desde el PATH. 5 Aquí nos encontraremos con todos los archivos asociados al programa, *.java, *.jcw, *.jcp, *.jsp, *.xml, podemos agregar o eliminar según sea nuestra conveniencia, en este caso, lo dejaremos por defecto. Aquí nos pide el PATH de jdk, lo buscamos y lo seleccionamos, por defecto lo encuentra. Y luego FINISH. 6 He aquí nuestro JCreator Pro. Generalidades y Características del lenguaje Aspectos Històricos Sun Microsystem lider en Servidores para INTERNET, desarrolla JAVA con el fin de eliminar incompatibilidades.(1991) Fue un proyecto que reboto mucho tiempo por distintos departamentos de SUN, java como un lenguaje de pequeños electrodomésticos. El mercado inicial de JAVA (a cargo de la filial de Sun Microsystem, FirsPerson Inc.) eran los equipos como microondas, tostadores y fundamentalmente televisión interactiva. James Gosling, miembro del equipo, con mas experiencia en lenguajes de programación había estado trabajando en su tiempo libre en un lenguaje de programación que el lla mo OAK, cuyas bases fueron C++.(1990) 7 El primer proyecto que uso OAK, se llamo proyecto Green, el cual era un sistema de control completo de los aparatos electrónicos y el entorno de un hogar. OAK era un nombre existente. Duke es la mascota de Java, aunque también se usa la taza de café (Java nace entorno a una conversación, junto a un café). Bill Joy, cofundador de SUN y uno de los principales desarrolladores de UNIX de Berkeley, presento JAVA en agosto de 1995. Características Es simple. Ofrece toda la funcionalidad de un lenguaje potente, es perecido a C++. Utiliza Garbage Collector (reciclador de memoria dinámica). No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello, cuando entra en acción permite liberar bloques d e memoria muy grandes, lo que reduce la fragmentación de la memoria. Reduce 50% los errores mas comunes de programación al eliminar características como: Aritmética de punteros no existen referencias registros (struct) definición de tipos (typedef) macros (#define) necesidad de liberar memoria (free). Es orientado a Objetos Java incorpora la resolución dinámica de métodos, características que deriva del lenguaje Objettive C. Usa RTTI (Run time type idetification) que define la interacción entre objetos, excluyendo variables de instancias o implementación de métodos. Modo de organizar sus programas. Modelamiento de objetos del mundo real. 8 Es distribuido. Capacidad de interconexión TCP/IP, existen librerias de rutinas para acceder e interactuar con protocolos como http y ftp. Java en si no es distribuido, si no que proporciona las librerias y herramientas para que los programas puedan ser distribuidos, es decir, que funcione en varias máquinas, interactuando. Es de arquitectura Neutral. Java compila su código a un archivo objeto de formato independiente de la arquitectura de la maquina en que se ejecutara. El código fuente java se compila a un código de bytes de alto nivel independiente de la máquina. Este código (byte - Code) esta diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema run time que si es dependiente de la máquina. Lo único dependiente del sistema es la máquina virtual (JVM) y las librerías fundamentales, además habrá APIs de Java que también entraran en contacto con el hardware y serán dependientes de la máquina. Ejemplos de APIs JAVA2D: gráficos 2D y manipulación de imágenes. Java Media Framework: Elementos críticos en el tiempo, audio, video. Java Animation: animación de objetos 2D. Java Telephony: Integración con telefonía. Java Share: Interacción entre aplicaciones multiusuario. Java 3D: gráficos 3D y su manipulación. 9 Es seguro. Si los byte codes pasan la verificación sin generar ningún mensaje de error, entonces sabemos que: El código no produce desbordamiento de operando en la pila. Todos los tipos, los parámetros de todos los códigos de operación son conocidos y correctos. No ha ocurrido ninguna conversión ilegal de datos. Es portable. Independiente de la plataforma. Un entero (int) en java, siempre será un entero de 32 bits. Es multitarea. Java permite muchas actividades simultáneas en un programa. Java provee su propio navegador (Hotjava). Es un sistema federado, el navegador es un coordinador de piezas y cada pieza es responsable de una función. Las piezas se pueden añadir dinámicamente a través de la red. Es eficiente Existen compiladores de Java para código Nativo JIT (Just in Time) Es Dinámico Objetos usados siempre en forma dinámica automáticamente. Versiones del Lenguaje Java 1.02: Versión mas difundida y la última de la versión 1.0 que estaba embutida en browser mas antiguos. Java 1.1.0: Esta versión incorpora grandes cantidades de funcionalidades entre las más importantes java RMI, JavaBeans, nuevo modelo de eventos, JDBC. Java 1.2: Una de las principales características JFC (Java Foundations classes, una biblioteca que contiene los componentes de Swing) Java 1.4: Una de las últimas versiones, incorpora nuevas mejoras, llamada java 2.0 10 -Tipos de datos y variables En mis primeros años que comencé a estudiar programación, buscando información, tutoriales y demases, nunca encontré, algo que detallara los tipos de variables en sí. Por ello quiero dar a conocer de la forma más clara posible tipos de datos que hay. Los tipos de datos se utilizan, para que el computador trabaje bajo un cierto parámetro, ya sea números (decimales o no, reales) y carácteres. Son aquellos que nos permiten interpretar algun tipo de información Los tipos de datos utilizados en JAVA son: Tipos de datos Valores byte short int long 8 bits complemento a 2 16 bits complemento a 2 32 bits complemento a 2 64 bits complemento a 2 Números Reales float double 32 bits IEEE 754 64 bits IEEE 754 Otros Tipos boolean tru or false char 16 bits de caracteres 0o1 alfabeto 3,4 * 10^-38 a 3,4 * 10^38 1,7 * 10^-308 a 1,7 * 10^308 -127 a 127 -32767 a 32767 -2147483648 a 2147483648 -9 mil billones a -9 mil billones byte, short, int y long, son tipos de datos enteros. Estos identificadores son representa dos bajo tres formatos, Hexadecimal, Decimal y Octal. float y double, son tipos de datos flotantes, esto quiere decir que son variables de tipo fraccionaria (con decimales). boolean, es un tipo de estado que representa bi-valores, esto significa que son dos valores, ya sea true o false, false = 0 y true >=1. char, tipo carácter, se utiliza para almacenar tipos Unicode simple. este tipo de dato almacena 16 bits de caracteres en un entero. 11 Descripción Representación Valor Unicode Carácter Unicode \udddd Número Octal \ddd Barra Invertida \\ Continuación \ Retroceso \b Retorno de carro \r Alimentación de formularios \f Tabulación horizontal \t Línea nueva \n Comillas simples \’ Comillas dobles \" Números ASCII 0-9 Alfabeto ASCII mayúsculas A–Z Alfabeto ASCII minúsculas a–z \u005C \ \u0008 \u000D \u000C \u0009 \u000A \u0027 \u0022 \u0030 a \u0039 \u0041 a \u005A \u0061 a \u007A Explico esto a grandes ragos, cuando declaramos un carácter, se puede realizar de dos formas: char carácter_1 = 'A'; ó char caracter_1 = '\u0041'; Identificadores Primero es lo primero: Palabras reservadas en JAVA abstract double int strictfp boolean else interface super false break extends long switch null 12 byte final native synchronized true case finally new this catch float package throw char for private throws class goto protected transient const if public try continue implements return void default import short volatile Para crear Identificadores debemos seguir las siguientes reglas: No pueden llevar el nombre de alguna palabra reservada. Es sencible a las mayusculas, entonces B != b. Debe comenzar por una letra, _ o $. seguido de los carácteres que se desen Un pequeño ejemplo sería un identificador de tipo flotante con el nombre de cph, _cph, $cph. float cph; float _cph; float $cph; Operadores Cuando hablamos de Operadores nos referimos a ciertas categorías: 13 Aritméticos Asignación Instanceof Incrementables Unarios Relacionales Lógicos Concatenables A nivel de Bits Aritméticos: Son aquellos Operadores básicos dentro de la matemáticas: Suma = ‘+’ Resta = ’-’ Multiplicación = ’*’ División = ’/’ Resto de una división = ’%’ Ejemplo de resto: 9%4=1 Asignación: Estos más que todo se utilizan para simplificar el trabajo de teclado, además se basan en los Operadores Aritméticos.: += ; valor1 += valor2 valor1 = valor1 + valor2 -= ; valor1 -= valor2 valor1 = valor1 - valor2 *= ; valor1 *= valor2 valor1 = valor1 * valor2 /= ; valor1 /= valor2 valor1 = valor1 / valor2 %= ; valor1 %= valor2 valor1 = valor1 % valor2 Instanceof: Este Operador nos permite saber si el Objeto pertenece a la clase llamada o no: La sintaxis: Objeto Instaceof Clase Incrementables: 14 Este tipo de Operadores, son los que permite incrementar o disminuir en uno, la variable: ‘++’ = incrementa en uno ‘--‘ = disminuye en un Ejemplo: Contador++ = contador incrementa en uno su valor Contador-- = contador disminuye en uno su valor. Unarios: Más fácil comer papas fritas, sirven para cambiar el símbolo de una operación: + - Ejemplo: 2 + 1 = 2 + (-1) 2 – 1 Relacionales: Más de alguno, os acordará cuando el profesor de matemáticas/geometría/algebra, nos pedia que teniamos que saber que cifra era mayor, igual o menor que otra, o incluso si eran distintas. Los operadores relacionales se utilizan y son para eso, para realizar comparaciones: ‘>’ ‘<’ ‘==’ ‘!=’ ‘<=’ ‘>=’ mayor que menor que igual que distintos que menor igual que mayor igual que Lógicos Los operadores lógicos, entregarán un valor bolean, pero esto no significa que entregarán true o false, sino que compararán los dos valores que se estan comparando en el momento: ‘&&’ Ambas entradas deben ser verdaderas 15 ‘||’ Ambas entradas deben ser falsas ‘|’ Una entrada tiene que ser falsa ‘&’ Una entrada tiene que ser verdadera ‘!’ Niega la entrada Concatenables: El Operador de concatenación se utiliza para agrupar cadenas de caracteres: ‘+’ Ejemplo “Hola” + variable + “como estás?” A nivel de Bits Son aquellos operadores que se dedican al desplazamiento de bits: ‘<<’ ‘>>’ ‘&’ ‘|’ desplaza hacia la izquierda desplaza hacia la derecha tabla de verdad (and) tabla de verdad (or) Sentencias Como en todo lenguaje de programación existen las sentencias, JAVA no es la excepción. En este apartado, nos basaremos en la Estructura de control, que se subdivide en dos, Iteración y Selección. Este tipo de sentencias nos permiten hacer una programación más entrenida y menos secuencial. Sentencias de tipo Iteración: Este tipo de sentencias nos permiten realizar una operación tantas veces como sea necesaria, un pequeño ejemplo es cuando nos piden que mostremos un carácter cinco o hasta más veces, para no repetir la misma instrucción se utilizan este tipo de sentencias iterativas. Sentencia Iterativa While Esta sentencia es la más sencilla de utilizar, se basa en que la condición empleada sea verdadera, y en el caso de lo contrario, se termina y sale de la sentencia. Su sintaxis es la siguiente: 16 While (condición) { Sentencia1; Sentencia2; Sentencia3; … } Hasta que termine por un negativo o falso (false), tenemos que procurar que la sentencia termine en algún momento, de lo contrario terminaría nunca, lo cual se denota bucle infinito. Sentencia Iterativa do While En este tipo de sentencias, primero se realiza la acción para luego confirmar la condición dada. La sintaxis es de la siguiente forma: Do { Sentencia1; Sentencia2; Sentencia3; … } While (condición); Sentencia Iterativa for En las sentencias previas, podríamos avernos dado cuenta que en aquellas sentencias no sabíamos el número exacto de ciclos que daría. En este tipo de sentencia (for), se utiliza específicamente cuando sabemos cuantos ciclos deben efectuarse antes del término del ciclo. La sintaxis es la siguiente: for (tipo_de_valor nombre_variable = valor_varible; nombre_variable operador nombre_variable1; nombre_variable operador) Un pequeño ejemplo: for (int cph = 69; cph <= 0; cph--) { System.out.print ("Esto se mostrará 69 veces"); } Sentencias de Selección 17 Este tipo de sentencias se diferencia, ya que en estas se dedican a la comparación de variables. Un ejemplo de esto, es el famoso semáforo, que haceis si la luz da rojo ?, nos detenemos o seguimos depende del criterio de cada uno, aunque lo lógico y prudente es detenerse, Si el semáforo da luz roja, detenerse, de lo contrario seguir. Sentencia de Selección if-else El significado de esta sentencia se denota en si pasa algo hacerlo, sino hacer otra cosa. Sintaxis: if (condición) { Sentencia1; Sentencia2; Sentencia3; … ] Else { Sentencia1; Sentencia2; … } Un pequeño ejemplo de ello es: … if ( x % 4 == 0 ) { if ( x % 100 == 0 ) { if ( x % 400 == 0 ) { System.out.println("Es bisiesto"); } else { System.out.println("No es bisiesto"); } } else { System.out.println("Es bisiesto"); } } else { System.out.println("No es bisiesto"); } … 18 Sentencia de Selección Swith Este tipo de sentencias se dedica a estructurar todas las sentencias de selección múltiple. Swith trabaja evaluando cada tipo de expresión, y el intérprete busca las variables con el valor correspondiente. En el caso de encontrar dicha variable la ejecuta, hasta el momento de encontrarse con una quebradura (break) del programa. Si no encuentra variable con la cual evalúa la expresión buscará por defecto una variable llamada default (opcional). Sintaxis: Swith (expresión) { Case ‘constante1’: Sentencia1; … Break; Case ‘constante2’: Sentencia2; … Break; Default: Sentenciad; } Fijaros que en el momento de la condición se denota con comillas simples (‘ ‘), y terminando con dos puntos ( : ), al contrario de las sentencias que tienen la terminación del punto y coma ( ; ). Un ejemplo sencillo sería una calculadora. Clases y Objetos By WaesWaes Antes de empezar se deberán definir unos conceptos para poder entender las definiciones de clases y objetos Variable: espacio de la memoria reservado para almacenar u valor que corresponde a un tipo de dato soportado por el lenguaje de programación, una variable, SIEMPRE es representada y utilizada a través de una etiqueta que se le asigna que esa etiqueta va a ser única de eso dato. Es una variable encontraremos tipo_de_dato etiqueta = tipo_de_dato hay cuatro tipos de datos: numéricos, lógicos, alfanuméricos y alfabéticos 19 Numérico int numero = 5; long numeros = 5; Lógico *estas en especial vas a reflejar dos estado (verdadero o falso) boolean resultado = false; boolean gane = true; Alfanuméricos String nick=jose23; Alfabéticos String nombre = jose; Constante: tipo de dato que no puede cambiar su valor. ejemplo: pi Ente: algo que tiene asociada una simbología para poder describirlo. Para que quede más claro voy a comentar un ejemplo que vi en una Web Por ejemplo, a través de una palabra podemos tener una idea de aquel concepto, si n embargo habrá una diferencia entre su verdad (lo que creemos sobre el concepto) y su realidad (lo que nos rodea) Para ser más específicos, si yo digo "Marte" lo más probable es que visualice el planeta rojo con sus características especificas, etc. (su verdad) sin embargo seguramente "Marte" es distinto a lo que ustedes visualizaron (su realidad). Sin embargo por algo visualizaron el otro planeta similar, porque "tiene asociada una simbología para poder describirlo." Abstracción: es la comprensión que se tiene de un ente. Por ejemplo, yo al decir Marte, uno se puede imaginar un planeta, otro un pedazo de roca, otro el color rojo, etc. sin separar la diferencia entre nuestra verdad y su realidad, la abstracción son puras verdades. Característica funcional: define todo lo que hace un objeto. Esto es algo muy importante, tomemos como ente un auto sus características funcionales serian encender, avanzar, acelerar, frenar, parar (entre otras) 20 Atributos: características propias Métodos: características funcionales Objeto: abstracción acotada de un ente en base a sus característica, en función de un propósito claro y un punto de vista definido. Cabe destacar que hay diferencia entre abstraer un ente de distintos puntos de vista Por ejemplo, las características del ámbito funcional de una computadora seria la cantidad de memoria ram, rom, cache, microprocesador, etc En cambio del punto de vista comercial lo que importaría seria, el precio la cantidad de stock, la compra y venta, etc Por eso es que el punto de vista es muy importante. Según sea la abstracción y manteniendo sus características propias un objeto se puede descomponer en un conjunto de objetos. Por ejemplo el objeto "computadora" se puede descomponer en (placa medre, hdd, fuente, lectora d e CD) en este caso "computadora" seria el objeto padre y los demás serian hijos, y también si necesitamos mas detalles podríamos descomponer un objeto hijo por ejemplo "placa madre" (zócalo cpu, sw1, sw2, bateria, usb, IDE1, IDE2) A la hora de describir u objeto hay que terminar abriendo y cerrando paréntesis, no puede hacer espacios, no se puede empezar con mayúsculas, no se pueden poner acentos ejemplo: placaMadre() Clase: conjunto de atributos y métodos asociados a la abstracción de un ente. Recordando siempre cual es el punto de vista por ejemplo si la clase es un revolver clase: revolver Disparar() *cantidad de balas Cargar() *capacidad de cargador PonerSeguro() *estado del seguro Ese es un ejemplo simple para que se den mas o menos cuenta Herencia: metodología de clases, para que una clase hija herede características y métodos de clase padre. Ingreso y Despliegue de Datos 21 Tenemos que mencionar que todos los programas basados en JAVA serán manipulados por la clase System, que pertenece a la librería java.io.* (entrada de datos)... para importa un paquete (package), usaremos import, y en este caso java.io.*, por la razón que por el momento no nos interesa saber de donde pertenece la libreria exacta que hace la entrada de datos System.in, representa la entrada standart System.out representa la salida de datos BufferedReader (es la clase que usaremos para la lectura de los datos) Ahora veremos, como hacer que el programa "ingrese los datos"... InputStreamReader isr = new InputStreamReader (System.in); BufferedReader br = new BuffereReader (isr); Leamos un poco, para comprender lo que dice... Haremos una clase InputStreamReader es quien a groso modo, el ingreso de datos, ya que transforma un bytes a línea de carácteres, los lee y los decodifica... sacando conclusiones: Se crea una clase InputStreamReader isr (se le puede dar cualquier nombre, yo le pongo isr, para que no se olvide que lo que se crea), de una nueva clase InputStreamReader, que hace el ingreso de datos desde System.in... BufferedReader, más que todo lee el texto que es ingresado, y al igual que la l ínea anterior, se lee... Se crea una clase BufferedReader br (cualquier nombre), de una nueva clase BufferedReader desde isr (InputStreamReader)... Ahora, esto se me ocurrio, analizando un poco todo esto, y gracias a Plaga, la duda fue concluída de buena forma... BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); Esto se puede leer de la siguiente forma: Se crea una clase BufferedReader llamada br, de una clase BufferedReader desde InputStreamReader llamado desde System.in (De esta forma leemos los datos y se ingresan) Ahora cómo debería quedar el programa ¿? El Método Main public static void main(String[] args) 22 public y static son modificadores de main. - El metodo main no devuelve nada indicado por void. - El metodo main tiene identificador "main". - El metodo main acepta cero o más objetos de tipo String, se puede enviar desde la linea de comando valores a ser ocupados en el main. import java.io.*; public class nombre /* Cuidado he aquí donde tenemos un poco de cuidado * si el nombre es distinto al archivo saldrá un error de clase * en la compilación del programa */ { public static void main(String[] args) { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); // Aquí todo lo demás del cuerpo del programa.. } } Ahora que entendimos esta pequeña parte del code, podemos seguir avanzando... Para que ingrese los datos y quede en la memoria: System.out.print // todo el code se pondrá al costado System.out.println // todo el code hará un salto de carro Ahora que sabemos como es el asunto, veremos para que los datos queden en memoria.. tipo_de_dato = Integer.parseInt(br.readLine()); Explicando un poco este code, es de la siguiente forma: El tipo_de_dato será leído desde el Buffer, para ser guardado como un tipo entero (en este caso). Ahora debemos de pensar una pequeña cosa, el programa lo manejará el usuario, y como siempre si al usuario se le dice ingresa un número, el usuario ingresa una letra... entonces debemos de estar preparados para errores, y para esto ocuparemos las famosas sentencias try & catch... try & catch try { // code } catch (Exception e) { // code de la excepción } 23 Las Excepciones se usan en el caso de error, ya sea de una transformación de un dato hacia otro o en el caso de un error 0 ( , Error de Usuario) Todo nuestro code debe estar dentro de try... ya que intentamos realizar algo... En el caso de catch, es todo lo que en el caso de error... Ahora chequemos el code, como estaría quedando.. import java.io.*; public class nombre { public static void main(String[] args) { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); try { // nuestro programa } catch (Exception e) { System.out.println("Error"); } } } Arrays Vectores Los Arrays son un método para guardar un conjunto de objetos de una misma clase, existen distintos tipos de Arrays, ya sean Unidireccional o Multidireccionales. Un Arrays o Arreglo, comienza en un índice 0 y el últimoi se debe denotar n -1... n == dimensión de Arrays. Primero debemos saber cómo se declara y crea un Arrays en JAVA, y se realiza de la siguiente forma: tipo_de_dato[] nombre; el tipo_de_dato, ya sea int, float, double, entre otros... los corchetes ( [] ), quieren decir que es la sección de memoria a utilizar, y el nombre del Arrays... La forma de declaración del Arreglo, cómo podría ser, sabiendo esto, y que se debe realizar un nuevo tipo de dato?... Para los que pensaron antes de continuar, bien... ... sería de la siguiente forma: tipo_de_dato[] nombre = new tipo_de_dato [x]; 24 Donde x, es la sección de memoria a utilizar el Arrays... Se entiende o voy muy rápido ¿? Si voy muy rápido aquí os dejo una pequeña explicación de un Arreglo de 10 posiciones... 0 1 2 3 4 5 6 7 8 9 --> Sección de Memoria del Vector 9 8 7 6 5 4 3 2 1 0 --> Datos de cada sección de Memoria del Vector Cómo he dicho un vector comienza en un índice 0 (cero), y no en 1, entonces un vector de 10 posiciones llegará hasta el número 9, estamos de acuerdo con ello ¿? Operaciones Básicas de un Arreglo Definir el Arreglo Realizar un recorrido Ingresar datos al Vector Sacar los datos del Vector Ok!... Ya sabemos como definir el vector: tipo_de_dato [] nombre_vector = new tipo_de_dato [10] Ahora cómo recorremos el vector??... Podría ser con una acción repetitiva (Ciclo), armando índices... Lo recorreremos con un ciclo, en este caso un While: While (i<=9) { System.out.print (nombre_vector[i]); i++; } En el caso de un for for (i=0;i<=9;i++) { System.out.print (nombre_vector[i]); } Ok!... ya sabemos como declara y crear un arreglo, sabemos como recorrer un arreglo, falta ingresar datos al arreglo y mostrarlos... 25 Aunque creo que solo pensar un poco, podemos sacar nuestras deducciones no creen Tarea 2... ... Crear un programa en JAVA, que permita llenar un vector de 100 posiciones con numeros aleatorios entre 0 y 100, luego indique cual es el que más se repite y cuantas veces se repite. Ejemplo de Vectores by Plaga public class Arreglo { public static void main(String[] args) { int i=0; int vector[] = new int[5]; while (i<=4) { System.out.print (vector[i]); i++; } System.out.print ("\n"); i--; while (i >= 0) { System.out.print (vector[i]); i--; } Arrays Matrices Ya vimos una parte de Arrays (vectores), como bien dijo WaesWaes son Unidireccionales, esto quiere decir que solo van en una dirección... ahora pensemos.... que pasa si quiero que se dirijan en dos direcciones (bidireccional)... Aqui entra el tema de Matrices... En forma gráfica una Matriz es de la siguiente forma: 00000 00000 00000 00000 00000 26 En aquel ejemplo podemos visualizar una Matriz de 5 x 5... fácil o no La forma de inicializar una Matriz es la misma que inicializar un Vector, con la única diferencia que utilizaremos dos variables Tipo_de_dato [] [] nombre_matriz = Tipo_de_dato [variable_1][variable_2]; La forma de recorrer dicha Matriz, es recorriendo cada uno de las filas y columnas que utilizaremos... for (int fila = valor; fila (Operador) valor; Operador) { for (int columna = valor; columna (Operador) valor; Operador) { /* Trozo de código * a recorrer en la Matriz */ } } Ahora realizaremos la misma matriz como programa en sí en JAVA public class Matriz { public static void main (String[] args) { int i=5, j=5; int [][] matriz = new int [i][j]; try { for (i = 0; i < 6; i++) { for (j = 0; j < 5; j++) { System.out.print (matriz[i][j]); System.out.print (" "); } System.out.println (" "); } System.out.print (" "); } catch (Exception e) { } } } 27 Mi primera Clase, Objetos y Métodos Sintaxis: Tipo_de_clase tipo_de_dato nombre_clase (parámentros) Por ahora en Tipo_de_clase nos centraremos en public o private... claro o no public... se puede utilizar desde cualquier Clase... private... solamente se puede utilizar desde la Clase... ... tipo_de_dato, son todos aquellos que hemos visto... boolean, String, double, etc... nombre_clase, obviamente es el nombre del método parámentros, son todos aquellos parámetros que se pueden entregar al método... Ok!... veamos un pequeño ejemplo... , algunos dirán: "Otra vez esta clase"... xD, pero creo que es la mejor para poder explicar este asunto de métodos import java.lang.Math; public class punto { public double x; public double y; public punto() { x = 0; y = 5; } public punto (int a, int b) { x = a; y = b; } public double obtenerx() { return x; } public double obtenery() { return y; } 28 } Algo nuevo de lo que no hayamos visto import java.lang.Math; ... quizás en algunas líneas... pero todas conllevan a esta: Es la libreria que tiene JAVA para las operaciones Matemáticas complejas... un poco de estudio de esta libreria no les haría mal... http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html Ahora si este código lo hacemos funcionar en JCreator, hará lo que es NADA... Sin embargo si lo hacemos correr en un programa llamado BlueJ, verán algunas diferencias al intentar ejecutar los métodos... eso es una tarea para todos... Pero si quiero hacerlo funcionar en JCreator ... simplemente tenemos que crear un método llamado main (función principal), y desde ahí llamar a todos los métodos que deseamos calcular... Un pequeño ejemplo: ... public static void main (String[] args) { punto p = new punto(); System.out.print ("Obtenemos X: " + p.obtenerx()); System.out.print ("\nObtenemos Y: " + p.obtenery()); } ... Si se fijan en este trozo de código hay algo nuevo... punto p = new punto(); Aqui hacemos referencia a que la clase punto llamará un objeto de esta clase que se denominará p, y de esta forma lo crea... por ello el new (debe utilizarse al momento de crear objetos)... La verdad no se como estoy explicando esto... si hay dudas no dudeis en preguntar 29 Ahora crearemos un nuevo método para la clase punto... qué hará este método la distancia entre ambos puntos. public double distancia (double x2, double y2) { xx = (double)(Math.round (Math.sqrt((Math.pow(x2-x,2))+(Math.pow(y2-y,2))))); return xx; } ... simplemente calculará Para hacer el ingreso de este método al método main, sería de la siguiente forma: public static void main (String[] args) { double x = 23; y = 34; punto p = new punto(); System.out.print ("Obtenemos X: " + p.obtenerx()); System.out.print ("\nObtenemos Y: " + p.obtenery()); System.out.print ("\nLa distancia entre los puntos x e y son: " + p.distancia (x, y)); } Espero todo se esté entendiendo de la mejor forma posible... , aunque tengan en cuenta que si no ponen de su parte no se puede avanzar cada vez más... Ya estaríamos comenzando a entender esto de Clases, Objetos y Métodos... tengan en cuenta que no es llegar y entender este capitulo, conlleva un poco más de estudio que los otros capítulos... sin embargo cuando se toma el ritmo será lo más fácil que exista... Veremos como queda el programa completo: import java.lang.Math; public class punto { public double x; public double y; public punto() { x = 0; y = 5; } 30 public punto (int a, int b) { x = a; y = b; } public double obtenerx() { return x; } public double obtenery() { return y; } public double distancia (double x2, double y2) { xx = (double)(Math.round (Math.sqrt((Math.pow(x2-x,2))+(Math.pow(y2-y,2))))); return xx; } public static void main (String[] args) { double x = 23; y = 34; punto p = new punto(); System.out.print ("Obtenemos X: " + p.obtenerx()); System.out.print ("\nObtenemos Y: " + p.obtenery()); System.out.print ("\nLa distancia entre los puntos x e y son: " + p.distancia (x, y)); } } Y ahí tenemos nuestra primera clase lista!... CHR0N05!... que pasa si deseo crear una nueva clase y llamar a los métodos de la clase punto completamente igual... realizar el constructor crear el ojeto y llamar a los métodos que se requieran (siempre y cuando se pueda)... Tarea!... Modificar esta clase, incluyendo los siguientes métodos: Calcular el área de los puntos Calcular el perimetro de los puntos ... es 31 Crear una nueva clase llamada recta, que contenga los siguientes métodos: Otener la pendiente Intersección del Eje X y del eje Y ArrayList http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html Anteriormente vimos Arrays o Arreglos, tanto Uni como Bidireccionales, que solamente podían almacenar un solo tipo de datos y tenían un tamaño finito. En esta ocasión veremos ArrayList, que puede almacenar cualquier tipo de datos y contiene un tamaño infinito. Para utilizar ArrayList, necesitaremos de la Clase java.util.ArrayList import java.util.ArrayList; En esta pequeña clase crearemos una pequeña Agenda… import java.util.ArrayList; public class Agenda { … } Que deberiamos hacer después ??... declarar las variables no es así ? public String Nombre; public ArrayList Notas; // Anotaciones, Citas, Como se les diga Nuestro constructor public Agenda (String Nom) { Nombre = Nom; Notas = new ArrayList(); } Como pueden ver, se pedirá solo un Atributo para crear una Agenda, que en este caso sería N om, que será equivalente al Nombre, y creamos un nuevo Objeto de la clase ArrayList() con una capacidad inicial de 10 valores y con el nombre de Notas. 32 NOTA: ArrayList() = Capacidad inicial de 10 ArrayList(Collection c) = Los elementos de una Colección en espefícica ArrayList(int InitialCapacity) = Una capacidad Inicial determinada por el Programador En esta Agenda solo agregaremos nombres y notaciones, ahora debemos pensar: Debemos crear un método ... la respuesta es si… Este método nos deberá volver algún valor ... no, la respuesta es porque este método solo agregará valores al Vector, entonces utilizaremos void, Pedirá algún atributo Nota. , si, porque nuestro constructor nos dice que tendremos un Nombre y una Cita o public void agregar(String Anotaciones) { Notas.add(Anotaciones); } Notas.add(Anotaciones), se deberán estudiar la clase que puse arriba de este capitulo rasgos añade una “Anotación” al Vector. Como va nuestro programita import java.util.ArrayList; public class Agenda { private String Nombre; private ArrayList Notas; public Agenda(String Nom) { Nombre = Nom; Notas = new ArrayList(); } public void agergar(String Anotaciones) { Notas.add(Anotaciones); } } … pero a grandes Bien, solo nos faltaría crear el método main para que pida los valores necesarios para insertar valores al Arreglo. public void main (String [] args) throws IOException { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); 33 Agenda ag = new Agenda(Nombre); System.out.print ("Ingrese Nombre: "); String Nombre = br.readLine(); System.out.print ("Ingrese Notas: "); String Anotaciones = br.readLine(); ag.agregar(Anotaciones); } Creo que a estas alturas ya es un poco ilógico que explique esta parte del código... aun asi le explicaré. .. Agenda ag = new Agenda(Nombre); Crea un nuevo objeto de la clase Agenda. ag.agregar(Anotaciones); Agrega las Anotaciones antes escritas. Sobrecarga En este hilo, veremos lo que es Sobrecarga... Primeramente, debemos tener en cuenta las clases y métodos constructores... public class MiClase { MiClase() { .... } } De esta forma el método constructor se denota: MiClase objeto = new MiClase(); Ahi tenemos un método constructor no es asi ??... bueno, la sobrecarga consiste en realizar el mismo 34 método pero con atributos totalmente distintos... public class MiClase { MiClase() { .... } MiClase(int a, int b) { .... } } De esta forma es totalmente válido realizar MiClase objeto = new MiClase(); MiClase objeto = new MiClase(29,30); La diferencia parte en la entrega de parámetros Se entiende ??... Espero que si... , esta parte de la programación es bastante fácil de entender asi que no veo la complicación del pequeño ejemplo... Ahora un ejemplo real: import java.io.*; pulic class MiClase { private int a, b; MiClase(int a, int b) { this.a = a; this.b = b; } public int suma(int a, int b) { return (a + b); } public double suma (double a, double b) { return (a + b); } public void main(String [] args) throws IOException { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); System.out.print ("Ingrese primer numero: "); 35 int a = Integer.parseInt(br.readLine()); System.out.print ("Ingrese primer numero: "); int b = Integer.parseInt(br.readLine()); MiClase obj = new MiClase(a,b); System.out.print ("La suma de los números es: " + obj.suma(a,b)); } } Espero haya quedado bastante claro... Tarea: Hacer la misma operatoria con double y float... Saludos Herencia Que es lo primero que se les viene a la mente cuando se habla de herencia ... Prácticamente Herencia se suele recurrir cuando un hijo hereda de su padre alguna característica en especial... o casi todo... En JAVA no es distinto... pero tendremos clases hijos que heredan de la clase padre... Cuando mi profesor, nos explicó el concepto de Herencia... fue bastante fácil... y la práctica aún más... xD Tomaré en cuenta que ahora ya saben crear Clases, Métodos y Sobrecarga... Asi un ejemplo básico de una clase con métodos a utilizar... public class resultado { private double x, y; private String op; public resultado(double x, double y, String op) { this.x = x; this.y = y; this.op = op; 36 } public double valor() { double res = 0; if (op.equals("+")) { res = (int)x + (int)y; } if (op.equals("-")) { res = (int)x - (int)y; } if (op.equals("*")) { res = x * y; } if (op.equals("/")) { if (y != 0) { res = x / y; } else { System.out.print ("No se puede realizar la operacion"); } } return res; } } Que hace este trozo de código corresponde... Dificl ??... ... simplemente pide dos variables y una operación, y hace lo que Hasta aquí nada nuevo no es asi ??... Ahora si os piden agregar un nuevo número y otra operación... que haceis ??... super fácil CHR0N05!!!... se agregan nuevas variables... Esa respuesta es totalmente válida... pero harán lo mismo si en un "x" caso les piden hasta 20 números ??... :S.. no creen que es demasiado engorroso ...Para que modificar una clase si lo que podemos hacer es llamar a esa clase y agregar más valores sin necesidad de modificarla ??... Bueno aqui es donde entra nuestro gran concepto de herencia (que utilizaremos en todos los programas de ahora en adelante)... Personalmente conozco dos formas de heredar una clase... extends e import... extends Tipo_clase nombre_clase extends clase_padre 37 public class resultado2 extends resultado Más claro que el agua imposible... import import nombre_clase import resultado import generalmente se utiliza cuando la clase está dentro del proyecto o no (carpetas) Ahora un ejemplo practico public class resultado2 extends resultado { private double z; private String op2; public resultado2(double x, double y, String op, double z, String op2) { super(x,y,op); this.z = z; this.op2 = op2; } public double valor1() { double res = 0; if (op2.equals("+")) { res = (int)valor() + (int)z; } if (op2.equals("-")) { res = (int)valor() - (int)z; } if (op2.equals("*")) { res = valor() * z; } if (op2.equals("/")) { if (z != 0) { res = valor() / z; } else { System.out.print ("\r\r\rNo se puede realizar la operacion"); } 38 } return res; } } Dentro del todo el código no creo que existan complicaciones, excepto las siguientes lineas: public resultado2(double x, double y, String op, double z, String op2) { super(x,y,op); this.z = z; this.op2 = op2; } Explicación : Método Constructor de la clase resultado2 Pide cinco atributos super(x,y,op) --> llama a los atributos de la clase padre para ser utilizados dentro de esta clase this.z = z --> Instancia un objeto dentro de la clase this.op2 = op2 --> Idem a "z" Que nos falta por crear ??... aaa... el método main() import java.io.*; public class MAIN { public static void main(String [] args) throws IOException { BufferedReader br = new BufferedReader (new InputStreamReader (System.in)); System.out.print ("\nIngrese numero [1]: "); double a = Integer.parseInt(br.readLine()); System.out.print ("\nOperaciones [+] [-] [*] [/]: "); String op = br.readLine(); System.out.print ("\nIngrese numero [2]: "); double b = Integer.parseInt(br.readLine()); System.out.print ("\nOperaciones [+] [-] [*] [/]: "); String op2 = br.readLine(); System.out.print ("\nIngrese numero [3]: "); double c = Integer.parseInt(br.readLine()); resultado3 resu = new resultado3 (a,b,op,c,op2); System.out.print ("\nEl resultado de los dos primeros numeros es: " + resu.valor()); System.out.print ("\nEl resultado de los tres primeros numeros es: " + resu.valor1()); } } 39 Con este simple ejemplo de Herencia creo que ha de quedar claro, el para que, el como y el cuando se utiliza... Fuente Original = http://www.portalhacker.net/index.php Post original = http://www.portalhacker.net/index.php/topic,73573.0.html