Mini curso Java [En progreso]

Iniciado por Gus Garsaky, Mayo 03, 2015, 10:27:43 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

¿Te gustan los tutoriales publicados?

Sí me gustan
38 (95%)
Un poco, falta mejorar
1 (2.5%)
No me gustan
1 (2.5%)

Total de votos: 40

Mayo 03, 2015, 10:27:43 PM Ultima modificación: Julio 08, 2015, 04:32:03 AM por Gus Garsaky

Hola, mi nombre es Gustavo y soy parte del STAFF de Underc0de. A partir de mañana, escribiré un post diario dedicado a JAVA, los cuales serán parte de un minicurso, que se irá completando con el tiempo. Asi mismo, efspero éstos tutoriales sirvan como formación a postulantes al equipo de desarrollo de Underc0de que desean ser parte del equipo Java y no cuentan con los conocimentos necesarios o que quieran profundizar conocimientos.

CitarCualquier sugerencia, por favor, háganmelo saber por MP

CitarEn caso tengan problemas con los ejercicios planteados, abrir un tema de la manera normal




ANTES DE EMPEZAR

Herramientas:



ÍNDICE


Java básico

1. ¿Qué es java? ¿Para qué sirve? (✔)
2. Método main (✔)
3. Tipos de datos (✔)
4. Operadores (✔)
5. Variables y consantes (✔)
6. Clase System (✔)
7. Entrada, proceso y salida de datos (✔)
8. Modificadores de acceso/visibilidad (✔)
9. El concepto de static (✔)
10. Estructuras de control (if, else, else if) (✔)
11. Estructuras repetitivas (while, do while, for) (✔)
12. Switch (✔)
13. Clase Math (✔)

POO

¿Qué es POO? Introducción teórica (✔)
Clases, métodos y objetos (✔)
POJO
this
Encapsulamiento
Herencia
Polimorfismo
Abstracción
¿Por qué es importante el concepto de acoplamiento?
Interfaces
Callbacks

Java intermedio

1. Clase String
2. Wrappers
3. Generics
4. Collections
5. ¿Qué es el ClassLoader?
6. Inicialización est\u00e1tica (static block)
7. Archivos (API java.nio)
  7.1 Lectura
  7.2 Escritura
  7.3 Trabajando con objetos y ficheros
7. Threads
8. Multithreading
9. Timer y TaskTimer
9. Sockets

JDBC

1. Introducción a JDBC
2. Conexión a BBDD
3. Consultas
4. Statement vs PreparedStatement
5. Metadata
6. Consultas complejas (inner join, subconsultas, union, etc)

GUI

Introducción a las GUI
Patrón MVC
Introducción a JavaFX
JavaFX Scene Builder
Vistas y controladores
Modelos
Aplicación de ejemplo

Java Avanzado

1. Diferencias entre JavaSE  y JavaEE
2. Introducción a JavaEE
3. JSP
4. Servlets y ciclo de vida
5. Paso de par\u00e1metros entre JSP's
6. Sesiones
7. Cookies
8. AJAX

Persistencia

1. JPA - introducción
2. PersistenceUnit
3. EntityManager y EntityManagerFactory
2. Mapeo de tablas
3. Relaciones 1:1
4. Relaciones 1:N y N:1
5. Relaciones N:M
6. Ejemplo

EJB

1. ¿Qué es un EJB?
2. Tipos de EJB
3. EJB de sesión
4. Beans locales y remotos
4. EJB dirigidos por mensajes

CDI

1. ¿Qué es CDI?
2. Contextos de inyección
3. @Named y @Model

Webservices

1. Introducción
2. SOAP y RESTful
3. RESTful
4. MIME types
5. Ejemplo

JSF

¿Qué es JSF?
2. Ciclo de vida
3. Facelets
4. Controladores
5. Controles comunes
6. Estructuras de control
7. Estructuras repetitivas
8. JSF AJAX
9. Bean validation
10. Passthrought: HTML5 y JSF

WebSockets

1. ¿Qué es un websocket? ¿Cómo funciona?
2. Decoders
3. Encoders
4. Aplicación de ejemplo



Cada día se desarrollará un tema. Si algún día no publico, será porque estaré verdaderamente ocupado, en exámenes o cosas por el estilo. De todas formas trataré de no romper el flujo. Cualquier comentario, crítica o sugerencia, me la hacen saber. Si desean colaborar con algún tema, me avisan para colocar su aporte.

Mayo 06, 2015, 12:49:12 PM #1 Ultima modificación: Mayo 06, 2015, 01:35:02 PM por #Gustavo

#1 - ¿QUÉ ES JAVA Y PARA QUÉ SIRVE?




1. ¿QUÉ ES JAVA?


Java es un lenguaje de programación de propósito general, concurrente, orientado a objetos que fue diseñado específicamente para tener pocas dependencias de implementación como fuera posible. Su intención es permitir que los desarrolladores de aplicaciones escriban el programa de una vez y lo ejecuten en cualquier dispositivo (conocido en inglés como WORA, o "write once, run anywhere), lo que quiere decir que el código que es ejecutado en una plataforma no tiene que ser recompilado para correr en otra. Java es, a partir de 2012, uno de los lenguajes de programación más populares en uso, particularmente para aplicaciones de cliente-servidor de web, con unos 10 millones de usarios reportados.

2. HISTORIA


El 15 de enero de 1991, Bill Joy, Andy Betcholscheim, Wayne Sheridan, James Gosling y Patrick Naughton se reunen en Aspen, Colorado. Su reunión tenía como objetivo analizar las distintas tecnologías que existían en la época sacando sus pro y contras que les sirvieran como base para su gran idea: desarrollar un entorno único que pudiera ser utilizado por todos los dispositivos de electrónica de consumo.

El equipo, llamado Proyecto Stealth (más tarde llamado Green Proyect), comienzan a trabajar en el proyecto el 1 de febrero de 1991 en oficina de Sand Hill Road en Menlo Park. En un principio se considera utilizar C++, pero el equipo llegó a la conclusión que era inadecuado. James Gosling tuvo la idea de modificar C++, pero rápidamente abandonó el desarollo. Entonces el equipo decidió crear un nuevo lenguaje llamado Oak.

Oak debería ser independiente de la plataforma, diferente al resto, y se decidió hacerlo interpretado. Además, el lenguaje debería ser robusto y sencillo para minorizar el trabajo del programador, por lo tanto, se decidió evitar características que hacían el código más propenso a errores. Por ésta razón, no se decidió incluir la herencia múltiple. El resultado fue un lenguaje que tenía similitudes con C, C++ y ObjectiveC, sin estar ligado a ninguna CPU concreta.

Mas tarde, Oak pasaría a llamarse Java por cuestiones legales de propiedad intelectual. Sobre el origen de Java, hay 2 teorías, una es que eligieron el nombre tomando café en una cafetería llamada Java y la otra que es un acrónimo de las siglas de sus creadores: James Gosling, Arthur Van Holf y Andy Bechtolsheim.

2.1 STAR 7


En agosto del 91, Java ya era funcional. El equipo trabajaba dispositivo llamado Star 7, un dispositivo parecido a un PDA,  que básicamente, les permitía a los usuarios responder el teléfono desde cualquier lugar. Luego de comercializarse, Star 7 fracasó, ya que elevaba los precios de los nuevos dispositivos. Se pensó en venderlo a una tercera empresa, pero no se llegó a un acuerdo. Fue un fracaso.

2.2 NACIMIENTO DE JAVA

Era el boom de internet; los sitios de internet crecían día a día de manera abrumadora e Internet se convertía en un fenómeno.

Naughton y J. Pane, comienzan a escribir un navegador web similar a Mosaic escrito en Java, llamado "WebRunner" al que se llamaría "HotJava". El 29 de septiembre de 1994 acaba el desarrollo de HotJava. Cuando se hace la demostración a los ejecutivos de Sun, éstos se sorprenden del potencial de Java y se acepta como proyecto.

Ya por el año 1995, Netscape anuncia en una conferencia que Java iba a ser incluida en Netscape Navigator.

3. ¿PARA QUÉ SIRVE?

Java es un lenguaje de propósito general, con él podemos construir aplicaciones web, desktop, consola, controladores, etc. Java no es solo un lenguaje de programación, es también una tecnología con un inmenso abanico de herramientas. Con Java puedes hacer desde aplicaciones sencillas en consola hasta juegos y páginas/applicaciones web complejas.


#2 - El MÉTODO MAIN



Éste tutorial será pequeño ya que, solo nos centraremos en aprender cómo funciona el método más importante en Java: main.


DEFINICIÓN

El método main es un método muy especial ya que sin él, ningúna aplicación Java podría levantarse. Su función es básicamente, hacer ejecutable una aplicación. El método main no es el área principal de una aplicación Java como muchos principiantes lo ven.

El método main es inalterable, ésto es:


  • Siempre debe tener visibilidad pública y ser estático.
  • Siempre debe retornar void
  • Siempre debe tener como parámetro una colección de String (String[])

Código: java

public class Class01 {
    public static void main(String[] args) {
        /*
            Aquí irá el código que se ejecutará
        */
    }
}


Los parámetros del método main son los parámetros que se le pueden pasa cuando se invoca, ésto es, por medio de la consola o por medio de cualquier otra herramienta.

Cuando se invoca al método main, éste levanta la aplicación llamando a la JVM mediante JNI (Java Native Interface), cargando la aplicación y el código que está dentro del main. Ésto por supuesto, no indica que todo el código funcional debe ir allí, como en el caso de C. Ésto definitivamente es una mala práctica y debemos de erradicarla por completo. En los próximos temas, veremos como realizarlo.


#3 - TIPOS DE DATOS




DEFINICIÓN

Tipo de dato informático es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar. Esto incluye imponer restricciones en los datos, como qué valores pueden tomar y qué operaciones se pueden realizar. Los tipos de datos comunes son: enteros, números de coma flotante (decimales), cadenas alfanuméricas, fechas, horas, etc.

En Java existen 8 tipos de dato primitivos. Los tipos de dato primitivos son nombrados por un keyword o palabra clave. Veamos éstos tipos de datos.

Byte


  • Entero de 8 bits.
  • Valor mínimo: -128
  • Valor máximo: 127
  • Valor por defecto: 0
  • Cuándo utilizarlo: Cuando queramos guardar enteros pequeños.
  • Valor por defecto: 0
  • Ejemplo: byte a = 100 byte b = -50

Short


  • Entero de 16 bits.
  • Valor mínimo: -32,768
  • Valor máximo: 32.767
  • Cuándo utilizarlo: Cuando queramos guardar enteros medianos.
  • Valor por defecto: 0
  • Ejemplo: short s = 10000 short r = -20000

Int


  • Entero de 32 bits.
  • Valor mínimo: -2147483648
  • Valor máximo: 2147483647
  • Cuándo utilizarlo: Cuando queramos guardar enteros grandes.
  • Valor por defecto: 0
  • Ejemplo: int a = 100000 int b = -200000

Long


  • Entero de 64 bits
  • Valor mínimo: -9223372036854775808
  • Valor máximo: 9223372036854775807
  • Cuándo utilizarlo: Cuando se quiera almacenar enteros muy grandes.
  • Valor por defecto: 0
  • Ejemplo: long a = 100000000; long b = -200000000

Float


  • Número de coma flotante de precisión simple de 32 bits
  • Cuándo utilizarlo: Cuando se quiera almacenar números reales con precisión simple.
  • Valor por defecto: 0,0f
  • Ejemplo: float f1 = 234,5f

Double


  • Número de coma flotante de doble precisión de 64 bits
  • Cuándo utilizarlo: Cuando se quiera almacenar números reales con precisión doble.
  • Valor por defecto: 0,0d
  • Ejemplo: double d1 = 123,4

Boolean


  • Representa un bit de información (verdadero o falso)
  • Solo hay dos posibles valores: true y false
  • Éste tipo de dato se utiliza para armar condiciones en estructuras condicionales
  • Valor predeterminado: falso
  • Ejemplo: boolean esCasado = true

Char


  • Carácter Unicode de 16 bits.
  • Valor mínimo: '\u0000' (0)
  • Valor máximo: '\uffff' (65.535)
  • Cuándo utilizarlo: Cuando se quiera almacenar cualquier carácter.
  • Ejemplo: char letra = 'A'

String


  • Colección de Char
  • Valor por defecto: null
  • Cuándo utilizarlo: Cuando se quiera almacenar texto.
  • Ejemplo: String miTexto = "Éste es un texto !#@ :P"

"String no es un tipo de dato primitivo (es un objeto), pero se usa con tanta frecuencia que he dicidido incluirlo"

Hasta aquí llegamos con los tipos de datos. En el próximo tema, hablaremos sombre variables.

Mayo 06, 2015, 07:39:00 PM #4 Ultima modificación: Mayo 15, 2015, 04:51:36 PM por WhiZ

#4 - OPERADORES



Definición: un operador lógico es un símbolo que representa un significado dentro de un conjunto de reglas. En programación, un ejemplo de operador lógico es + (más), / (entre), etc.

En Java disponemos de los siguientes operadores lógicos:



   
   
   
   
   
   
   
   
SignoDescripción
=Asignación
==Igual que
!=Distinto que
>, >=, <, <=Mayor, mayor o igual, menor, menor o igual
&&Y (AND)
||Ó (OR)
!No, negación (NOT)

Estos operadores lógicos tienen un orden de precedencia que hay que tener muy en cuenta cuando las combinemos, para no tener resultados equivocados. Veamos el orden de precedencia:


2. EJERCICIOS PROPUESTOS

Dadas las variables de tipo int con valores A = 5, B = 3, C = -12 indicar si la evaluación de estas expresiones daría como resultado verdadero o falso:

A) A > 3                                                            B) A > C                                               C) A < C

D) B < C                                                            E) B != C                                              F) A == 3

G) A * B == 15                                                 H) A * B == -30                                   I) C / B < A

J) C / B == -10                                                  K) C / B == -4                                       L) A + B + C == 5

M) (A+B == 8 ) && (A-B == 2)                        N) (A+B == 8 ) || (A-B == 6)

O) A > 3 && B > 3 && C < 3                          P) A > 3 && B >= 3 && C < -3

Mayo 07, 2015, 07:47:58 PM #5 Ultima modificación: Mayo 15, 2015, 04:15:00 PM por Gus Garsaky

#5 - VARIABLES Y CONSTANTES



1. VARIABLES

DEFINICIÓN: Una variable es una representación abstracta de un valor. En programación, una variable es básicamente una dirección de memoria que está asociada a un identificador. Ésta dirección de memoria almacena valores que luego podrán ser recuperados por medio del identificador. El identificador en el código fuente puede estar ligado a distintos valores en tiempo de ejecución, por lo tanto, el valor de una variable puede cambiar durante la ejecución de la aplicación.

1.1 SINTAXIS

Una variable en Java tiene la siguiente sintaxis:

<tipo de dato> <identificador>

1.2 DECLARACIÓN

Para declarar una variable en Java, basta con seguir la sintaxis anterior mencionada. Por ejemplo:

Código: java

byte edad;


1.3 ASIGNACIÓN

La asignación es la acción que le permite a las variables guardar valores. Ésto se hace a través del operador igual (=), donde:

<variable> = <valor a guardar>

Lo que está a la izquierda, será almacenado en la variable que está en la izquierda. De ésta forma se asignan valores a las variables. Modifiquemos un poco el ejemplo anterior:

Código: java

byte edad;
edad = 21;


1.3.1 INICIALIZACIÓN

También podemos realizar la declarción y asignación en una sola sentencia. A ésto se le llama inicialización. Modificando el ejemplo anterior, podemos decir:

Código: java

byte edad = 21;





2. CONSTANTES

DEFINICIÓN: La definición de una constante es la misma para una variable pero, con algunas diferencias importante:


  • Debe de tener la palabra reservada final
  • Una constante debe ser inicializada
  • Una constante es de solo lectura. No se puede cambiar su valor una vez definido.
  • Como recomendación, una constante debe estar en mayúsculas (uppercase)

Una constante se utiliza cuando necesitamos asociar valores fijos a variables y que éstas sean de solo lectura. Así, tenemos esos valores fijos en la constante y nos aseguramos que nunca podrán ser cambiados.

Ejemplo:

Código: java

final float PI = 3.1416


En la sentencia anterior, hemos declarado una constante de tipo float que almacena el valo de PI. PI es un valor que nunca va a cambiar, por lo tanto, por sentido común debe ser una constante. Otro ejemplo:

Código: java

final byte IGV = 18; // 18% de una venta = IGV (impuesto)


Ahora, intentemos cambiar el valor del IGV a 25:

Código: java

final byte IGV = 18;
IGV = 25;


¿Qué ocurre? Como dijimos, una constante es un valor fijo, constante que no podrá ser cambiado durante la ejecución y el ciclo de vida de nuestra aplicación. En NetBeans, podemos ver que la línea de asignación a IGV está subrayada con rojo. Ésto es muy útil, ya que NetBeans nos avisa de éstos tipos de errores en tiempo real, ahorrándonos mucho tiempo:






Para resumir:


  • Una variable es un espacio de memoria que tiene asociado un identificador
  • Una variable puede ser declarada y asignada o inicializada (ambas juntas)
  • El valor de una variable puede variar durante la ejecución de una aplicación
  • Una constante es una variable cuyo valor una vez definido no puede cambiar
  • Una constante debe de tener la palabra reservada final y debe ser inicializada
  • Una constante debe utilizarse para representar valores fijos que no cambiarán en el tiempo (PI, IGV, etc)

Mayo 07, 2015, 10:09:01 PM #6 Ultima modificación: Mayo 15, 2015, 04:15:23 PM por Gus Garsaky

#6 - CLASE SYSTEM




CitarPor el momento, nos imaginaremos a una clase como un conjunto que alberga variables y funcionalidades. Luego, cuando entremos a POO, describiremos con detalle qué es una clase.

La clase System es una clase muy especial. Aquí se encuentran los flujos de entrada, error y salida. Éstos flujos se utilizan para diversas cosas, por ejemplo, el flujo de entrada se utiliza para leer datos que se ingrese por medio del teclado, es decir, datos que ingresa el usuario; el flujo de error se utiliza para mostrar por consola los errores que se desee al usuario y el flujo de salida se utiliza para mostrar información también al usuario. Todos éstos flujos están definidos como atributos estáticos (1).

Código: java
public class System {
static PrintStream err;
static InputStream in;
static PrintStream out;
...
}


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

La variable in, representa al flujo de entrada. Su sintaxis es:
Código: java

static InputStream in;


Veremos un ejemplo de éste flujo en la próxima publicación.

SYSTEM.ERR

La variable err, representa al flujo de salida. Su sintaxis es:

Código: java
static PrintStream


Ejemplo:

Código: java
System.err.print("Ha ocurrido un error");


SYSTEM.OUT

La variable out, se utiliza para mostrar valores por pantalla. Su sintaxis es:

Código: java
static PrintStream out;


Ejemplo:

Código: java
System.out.println("¡Hola mundo!");
System.out.println("Su edad es "+21);


CitarPara concatear (unir) textos, texto y números, etc, usaremos el operador +.

La diferencia entre err y out, es que el primero utiliza algunos parámetros para simular un log (registro) de error como por ejemplo, pintar el texto en rojo. Veamos un ejemplo:

Código: java
public class Class05 {
    public static void main(String[] args) {
        System.err.println("¡System.err!");
        System.out.println("System.out");
    }
}


La salida es:



Es interesante notar, que el System.err, siempre se ejecuta después de los demás flujos. Esto sucede porque err y out son flujos diferentes y actúan en tiempos diferentes.

Eso ha sido todo. Nos vemos en la próxima clase.



(1) Hablaremos de static un poco más adelante.

Mayo 08, 2015, 03:50:44 PM #7 Ultima modificación: Mayo 15, 2015, 04:15:39 PM por Gus Garsaky

#7 - ENTRADA, PROCESO Y SALIDA DE DATOS




INTRODUCCIÓN: La entrada de datos es una parte escencial en el desarrollo de programas informáticos, sin éste, no pudiera ser posible un desarrollo eficiente de cualquier aplicación. Una aplicación o programa informático consta básicamente de 3 partes: entrada, proceso y salida.

ENTRADA

Toda aplicación necesita información del exterior para poder llevar a cabo la tarea para la que fue diseñada. Ésta información puede ser proveída directa, es decir, mediante el código fuente, mediante servicios externos (por ejemplo servicios web) o mediante el usuario.

PROCESO

Una vez que la aplicación tiene los datos necesarios, empieza el proceso. El proceso es el resultado de las operaciones que realiza la aplicación con los datos de entrada. Una vez que se tienen los resultados de las operaciones que se han realizado, viene el proceso de salida.

SALIDA

Teniendo ya los resultados de las operaciones, éstos son mostrados al usuario por distintas vías: texto, gráficos, reportes, etc. Ésto depende de cómo el programador ha decidido mostrar el resultado del proceso.

ENTRADA DE DATOS EN JAVA

ENTRADA DE DATOS POR PARTE DEL USUARIO

En Java la entrada de datos puede ser de dos formas: Por medio de la clase Scanner y por BufferedReader. Veamos cómo hacerlo con Scanner por simplicidad.

Para leer datos con Scanner usaremos los siguientes métodos:


  • next: lee una sola línea consecutiva. Si encuentra un espacio, deja de leer.
  • nextLine: lee una línea completa, incluídos espacios en blanco.
  • nextByte: lee un entero pequeño.
  • nextShort: lee un entero mediano.
  • nextInt: lee un número entero.
  • nextFloat: lee un número de coma flotante de precisión simple.
  • nextDouble: lee un número de coma flotante de precisión doble.
  • nextBoolean: lee un número booleano.

Para inicializar un objeto lo haremos de la siguiente manera:

Código: java
Scanner scanner = new Scanner(System.in);


Como recordamos, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, hace referencia al stream o flujo de entrada, y con éste flujo, va a trabajar Scanner para poder leer datos. Veamos un ejemplo de lectura para cada tipo de dato primitivo:

Código: java
import java.util.Scanner;

public class Class05 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
       
        System.out.println("Ingrese su nombre");
        String singleLine = reader.next();
        reader.nextLine();
        System.out.println("Ingrese sus apellidos");
        String fullLine = reader.nextLine();
        System.out.println("Ingrese un número entre -128 y 127");
        byte b = reader.nextByte();
        System.out.println("Ingrese un número entre -32768 y 32767");
        short s = reader.nextShort();
        System.out.println("Ingrese un número de precisión simple");
        float f = reader.nextFloat();
        System.out.println("Ingrese un número de precisión doble");
        double d = reader.nextDouble();
        System.out.println("Ingrese un valor booleano");
        boolean bool = reader.nextBoolean();
       
    }
}


PROCESO DE DATOS EN JAVA

En Java, podemos realizar muchos tipos de procesos: aritméticos, con ficheros, con bases de datos, etc. A continuación, veremos un pequeño ejemplo de un proceso en Java con operaciones aritméticas.

Código: java

public class Excercise01 {
    public static void main(String[] args) {
        Scanner reader;
        byte number1;
        byte number2;
        byte resultado;
        number1 = 15;
        number2 = 45;
        resultado = number1 * number2;
    }
}


En el ejemplo anterior, se ha llevado a cabo un proceso que consta de una operación aritmética. Éste proceso se encarga de multiplicar number1 y number2 y guardarlo en la variable resultado.

SALIDA DE DATOS EN JAVA

Una salida de datos en Java, significa mostrarle información al usuario. Ésta información como dijimos más arriba, puede ser en forma de texto, gráficos, reportes, etc. Veamos un ejemplo de salida, mostrando un texto y un número por pantalla:

Código: java

public class Excercise02 {
    public static void main(String[] args) {
        System.out.println("Hola mundo!");
        System.out.println(35);
    }
}


EJERCICIO

Ingresar dos números enteros, multiplicarlos y mostrarlos por pantalla.

Veamos, nos piden ingresar dos números, enteros:

Código: java

public class Excercise03 {
    public static void main(String[] args) {
        Scanner reader;
        int number1 = 0;
        int number2 = 0;
        reader = new Scanner(System.in);
        System.out.println("Ingrese un número entero");
        number1 = reader.nextInt();
        System.out.println("Ingrese un número entero");
        number2 = reader.nextInt();
    }
}


Ahora, nos piden multiplicarlos. ¿Dónde guardamos en valor de ésta operación? Bien, necesitamos crear una variable y almacenar el resultado allí:

Código: java

public class Excercise03 {
    public static void main(String[] args) {
        Scanner reader;
        int number1 = 0;
        int number2 = 0;
        int result = 0; // nueva variable

        reader = new Scanner(System.in);
        System.out.println("Ingrese un número entero");
        number1 = reader.nextInt();
        System.out.println("Ingrese un número entero");
        number2 = reader.nextInt();
        resultado = number1 * number2; // almacenamos el resultado de la operación
    }
}


Por último, mostramos el resultado (salida):

Código: java

import java.util.Scanner;

public class Excercise03 {
    public static void main(String[] args) {
        Scanner reader;
        int number1 = 0;
        int number2 = 0;
        int result = 0;
        reader = new Scanner(System.in);
        System.out.println("Ingrese un número entero");
        number1 = reader.nextInt();
        System.out.println("Ingrese un número entero");
        number2 = reader.nextInt();
        result = number1 * number2;
        System.out.println(result); // mostramos el resultado
    }
}


EJERCICIO PROPUESTO


  • Ingresar dos números de coma flotante de precisión simple, dividirlos y mostrar el resultado.




Espero se haya comprendido el concepto de Entrada, Proceso y Salida. Cualquier duda o sugerencia, mensaje privado por favor. Nos vemos.

Mayo 08, 2015, 04:13:23 PM #8 Ultima modificación: Mayo 15, 2015, 04:16:11 PM por Gus Garsaky

8# - MODIFICADORES DE ACCESO




DEFINICIÓN: un modificador de acceso o de visibilidad, es un atributo en forma de palabra reservada que se le aplica a una variable o método (función) y que cambia la forma en que el exterior (otras clases) tiene acceso a ellos.

Existen 4 modificadores de acceso en Java, que se pasarán a listar y a describir brevemente:

package: Modificador por defecto. Éste modificador es el que se le asigna a toda variable/método si no se especifica otro.

Código: java
public class Person {
    String names; // modificador por defecto
}


public: Éste modificador se utiliza cuando se desea que una variable o método, sea visible para toda la aplicación.

Código: java
public class Person {
    public String names; // modificador público
}


private: Éste modificador se utiliza para ocultar una variable o método no sea visible para el exterior (demás clases) si no, que sea visible solo para la clase que lo contiene. Éste modificador se utiliza mucho, ya que es parte escencial del encapsulamiento (1).

Código: java
public class Person {
    private String names; // modificador privado
}


protected: Éste modificador se utiliza cuando trabajamos con herencia. Se explicará más adelante, solamente tengan la idea, que las variables y métodos protected que tiene una clase padre, serán visibles solamente para las clases hijas.

Código: java
public class Person {
    potected String names; // modificador protegido
}


Por el momento, es importante que tengan claros éstos conceptos. Más adelante, veremos cómo funcionan en un ejemplo real.

¿SON IMPORTANTES LOS MODIFICADORES DE ACCESO?

Los modificadores de acceso permiten al diseñador de clases delimitar la frontera entre lo que es accesible para los usuarios de la clase, lo que es estrictamente privado y 'no importa' a nadie más que al diseñador de la clase e incluso lo que podría llegar a importar a otros diseñadores de clases que quisieran alterar, completar o especializar el comportamiento de la clase.

Con el uso de estos modificadores se consigue uno de los principios básicos de la Programación Orientada a Objetos, que es la encapsulación: Las clases tienen un comportamiento definido para quienes las usan conformado por los elementos que tienen un acceso público, y una implementación oculta formada por los elementos privados, de la que no tienen que preocuparse los usuarios de la clase.




(1) Encapsulamiento: característica de la programación orientada a objetos cuyo objetivo es ocultar un atributo o procedimiento del resto de clases e interfaces para crear una barrera de protección. Lo veremos con detalle más adelante.

Mayo 14, 2015, 12:10:22 PM #9 Ultima modificación: Mayo 15, 2015, 04:16:26 PM por Gus Garsaky

#9 - STATIC




DEFINICIÓN: static es una palabra reservada muy especial en Java. Static puede usarse en atributos y métodos y su uso representa un estado especial y para explicarlo, necesitamos entender el concepto de cargador de clases o ClassLoader.

CLASSLOADER: Es un módulo especial dentro de la arquitecutra de la JVM (Java Virtual Machine) que se encarga de cargar las clases existentes y que hemos definido nosotros. Cuando el classloader carga una clase, lo hace con sus atributos y métodos pero éstos solo pueden ser accedidos cuando se cree un objeto (representación de esa clase) que los construya y que posteriormente los llame, a no ser, que éstos métodos o variables sean públicas y estáticas.

CitarVeremos el concepto de clases y objetos en el apartado POO (Programación rientada a objetos).

Veamos un ejemplo de la importancia de static. Tenemos una clase llamada Person (Persona) con un atributo (característica) llamado names (nombres). Éste atributo es público pero no es estático:

Código: java
public class Person {
    public String names = "Homer Simpson"; // modificador por defecto
}


Ahora, ¿como accedemos a él? Tendríamos primero que crear un objeto (representación) de la clase Person. Al  crear un objeto de Person, estamos creando los atributos especificados en la clase, es por ésta razón, que éstos solo pueden ser accedidos por objetos de aquella clase. Entonces, para mostrar el valor del atributo names, tendríamos que hacer algo así:

Código: java
public class Main {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.names);
}
}


CitarPor el momento, olvidemos el operador new para la creación de objetos.

Si por el contrario, el atributo names fuera estático:

Código: java
public class Person {
    public static String names = "Homer Simpson"; // modificador por defecto
}


Lo llamaríamos anteponiendo al atributo, el nombre de la clase seguido de un punto (el punto significa propiedad de, lo veremos más adelante):

Código: java
public class Main {
public static void main(String[] args) {
System.out.println(Person.names);
}
}


Es por ésta razón, que a los atributos o métodos estáticos se les llama comúnmente, de clase, ya que, éstos no dependen de un objeto para poder ser utilizados. Desde que el ClassLoader cargue dicha clase, el atributo estático pasa a estar disponible, pudiéndose llamar sin la necesidad de crear un objeto.

"Es por ésta razón, que a los atributos o métodos estáticos se les llama comúnmente, de clase, ya que, éstos no dependen de un objeto para poder ser utilizados. Desde que el ClassLoader cargue dicha clase, el atributo estático pasa a estar disponible, pudiéndose llamar sin la necesidad de crear un objeto."




Espero se haya entendido el concepto de static. Si tienen alguna duda, por favor, creen un tema de la manera normal o envíenme un MP. Nos vemos.

Mayo 14, 2015, 03:14:01 PM #10 Ultima modificación: Mayo 15, 2015, 04:17:00 PM por Gus Garsaky

#10 - ESTRUCTURAS DE CONTROL




Definición: Llamadas también estructuras condicionales, son un mecanismo que nos permite evaluar expresiones o condiciones y actuar de acuerdo a ello. Las estructuras de control nos proveen flujos que se tomará de acuerdo a si una condición o expresión se cumple o si no se cumple; ésto nos permite decidir entre uno o más caminos de acuerdo a un suceso y por ende aplicar diferentes lógicas y procesos de acuerdo al camino tomado.

1. ELEMENTOS

Una estructura de control tiene 3 elementos, que pasaremos a listar y a describir a continuación.

1.1 IF (si)

El elemento if evalúa si una expresión es verdadera, es decir, se cumple; a ésto le llamamos condición. La sintaxis es:

if(<expresión>)

Ejemplo:

Código: java
if(20/2 == 10) {
System.out.println("El resultado es diez");
}


El ejemplo anterior se puede traducir en pseudocódigo como:

Código: php
Si 20 entre 2 es 10, entonces:
Imprimir "El resultado es diez"
Fin Si


En caso la condición no se cumpla (20 / 2 no diera como resultado 10), no se imprimiría el texto. Si quisiéramos que en caso la condición no se cumpla, necesitaremos un else.

1.2 ELSE (si no)

El elemento else se usa cuando se desea tomar un flujo alternativo, es decir, cuando la condición evaluada en el if no se cumple, se ejecutará lo que hemos escrito en el else. La sintaxis es:

if(<expresión>) {
   // flujo normal
} else {
   // flujo alternativo   
}


Ejemplo:

Código: java
if(20 * 5 == 100) {
System.out.println("El resultado es 100");
} else {
System.out.println("El resultado no es 100");
}


En pseudocódigo, se puede resumir en:

Código: php
Si 20 * 5 = 100, entonces:
Imprimir "El resultado es 100"
Si no:
Imprimir "El resultado no es 100"
Fin Si


1.3 ELSE IF

Existe el caso en que queramos evaluar más de una condición y si ninguna se cumple tome el flujo else. Veamos la sintaxis:

if(<expresión>) {
   
} else if(<expresión>) {
   
} else if(<expresión>) {
   
} else {
   
}


Ejemplo:

Código: java
Scanner reader = new Scanner(System.in);
byte edad = 0;

System.out.print("Ingrese su edad:");
edad = reader.nextByte();

if(edad < 18) {
System.out.println("Usted es niño o adolescente");
} else if(edad > 17 && edad < 21) {
System.out.println("Usted es un joven");
} else if(edad > 20 && edad < 60) {
System.out.println("Usted es un adulto");
} else {
System.out.println("Usted es un anciano");
}


En pseudocódigo:

Código: php
Ingresar edad como entero
Si edad < 18, entonces
Imprimir "Usted es niño o adolescente"
Si no
Si edad > 17 y edad < 21, entonces
Imprimir "Usted es joven"
Fin Si
Si no
Si edad > 20 y edad < 60, entonces
Imprimir "Usted es un adulto"
Fin Si
Si no
Imprimit "Usted es un anciano"
Fin Si



2. Ejercicios



Practiquemos un poco las estructuras de control con unos ejercicios.

2.1 Calcular área de un triángulo. Si el área es menor a 10, imprimir "El triángulo es pequeño". Si el área está entre 10 y 25, imprimir "El triángulo es mediano". Si el área es mayor a 25, imprimir "El triángulo es grande".

Solución:

Analicemos el enunciado. El objetivo principal es calcular el área de un triángulo. ¿Qué necesitamos?

A) Base
B) Altura

Las que desconocemos. Por lo tanto, si las desconocemos deberemos pedírselas al usuario y luego, almacenar el área en una variable para evaluarla luego con las condiciones que se nos han dado. Veamos el pseudocódigo:

Código: php
Ingresar base como real
Ingresar altura como real
Declarar area como real
area = base * altura / 2
Si area < 10, entonces
Imprimir "El triángulo es pequeño"
Si no
Si area >= 10 y area < 20, entonces
Imprimir "El triángulo es mediano"
Fin Si
Si no
Imprimir "El triángulo es grande"
Fin Si


Ya tenemos la solución, ahora hay que plasmarla en código Java:

Código: java
public class Clase09 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        float base;
        float altura;
        float area;
       
        System.out.println("Ingrese la base");
        base = reader.nextFloat();
        System.out.println("Ingrese la altura");
        altura = reader.nextFloat();
       
        area = (base * altura) / 2;
       
        System.out.println("Área: " + area);
        if(area < 10) {
            System.out.println("El triángulo es pequeño");
        } else if(area >= 10 && area < 20) {
            System.out.println("El triángulo es mediano");
        } else {
            System.out.println("El triángulo es grande");
        }
    }
}


EJERCICIOS PROPUESTOS

1. Ingresar un número de un mes y decir su nombre.
2. Ingresar un número e imprimir si es primo o no.
3. ingresar tres números e imprimirlos de mayor a menor.


EXTRA



Es posible colocar if simultáneos. La razón para colocarlos es simple:

"Utilizaremos if simultáneos en lugar de else if, cuando más de una condición puede cumplirse, es decir, si se cumple la primera condición, seguirá evaluando el resto de condiciones. utilizaremos else if, cuando solo úna condición debe cumplirse. En cuanto una condición se cumpla, rompe toda la estructura if, elseif y else."

Ejemplo:

Código: java
public class Clase09 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        float base;
        float altura;
        float area;
       
        System.out.println("Ingrese la base");
        base = reader.nextFloat();
        System.out.println("Ingrese la altura");
        altura = reader.nextFloat();
       
        area = (base * altura) / 2;
       
        System.out.println("Área: " + area);
        if(area < 10) {
            System.out.println("El triángulo es pequeño");
        if(area > 10) {
            System.out.println("El triángulo es mediano");
        if(area > 25) {
            System.out.println("El triángulo es grande");
        }
    }
}


Si el área fuera resultara 30 por ejemplo, se cumplirían las dos últimas condiciones:

CitarEl triángulo es mediano.
El triángulo es grande.

Espero se haya entendido el funcionamiento de las estructuras de control. Nos vemos.

Mayo 15, 2015, 11:06:16 AM #11 Ultima modificación: Mayo 15, 2015, 04:18:18 PM por Gus Garsaky

#11 - ESTRUCTURAS REPETITIVAS




Definición: Una estructura repetitiva nos permite trabajar en ciclos, es decir, en intérvalos de tiempo. Cuando trabajamos con estructuras repetitivas, podemos contrar la duración de un ciclo y definir qué hacer durante la duración de éste. Ésta estructura es muy útil cuando deseamos hacer procesos largos que del modo normal (secuencial) fueran muy largos y redundantes. El propósito de una estructura repetitiva es repetir un bloque de código mientras una condición sea verdadera.

1. TIPOS DE ESTRUCTURAS REPETITIVAS

1.1 WHILE (mientras)

En el bucle while, la condición se controla por una variable de control, que en éste caso es llamado centinela. El centinela es una variable que controlará el ciclo de vida del bucle y que puede ser una variable booleana, entera, etc.

Sintaxis:

Código: php
mientas <condición> hacer
    instrucciones
fin mientras


En Java

Código: java
while (<condición>) {
    // instrucciones
}


1.2 DO WHILE (hacer mientras)

Al igual que el bucle while, la condición se controla con un centinela; por el contrario, éste bucle primero ejecuta las instrucciones y luego evalúa la expresión. Ésto es útil cuando queremos que sí o sí primero se ejecuten unas instrucciones y luego evalúe alguna condición.

Sintaxis:

Pseudocódigo:

Código: php
hacer
    <instrucciones>
mientras  (<condición>)


Java:

Código: java
do {
    // instrucciones
} while(<condición>);


1.3 FOR

Una estructura repetitiva for se utiliza para realizar un proceso durante un ciclo del cual tenemos conocimiento de su fin. Consta de 3 partes:


  • variable de control: es la variable que controla la condición del bucle.
  • condición: es la expresión que for evaluará antes de cada iteración y que pone un límite al bucle.
  • aumento/decremento: es el aumento o decremento de la variable de control. Es importante ésta parte ya que si no fijamos un incremento o decremento, la condición nunca terminará.

Sintaxis:

Pseudocódigo:

Código: php
para i <- x hasta n hacer incremento i+1 hacer
    <instrucciones>
fin para


Java:

Código: java
for(byte indice = 0; indice < 10; indice++) {
    // instrucciones
}



2. ¿Cuándo utilizar while, do while y for?




2.1 CUÁNDO USAR WHILE

Usaremos while cuando las instrucciones que ejecutará puede que no se ejecuten ninguna vez si la condición es falsa. Por ejemplo:

Código: java
System.out.println("¿Desea ingresar datos? S/N");
char seguir = reader.next().charAt(0); // centinela
while(seguir == 'S') {
String nombre;
System.out.println("Ingrese su nombre");
nombre = reader.nextLine();
System.out.println(nombre);
System.out.println("¿Desea seguir? S/N");
char = reader.next().charAt(0);
}


En éste caso, el bucle puede nunca ejecutarse (si el usuario ingresa N).

2.2 CUÁNDO USAR DO WHILE

Usaremos do while cuando queramos que al menos una vez se ejecutarán las instrucciones. Por ejemplo:

Código: java
char seguir; // centinela
do {
String nombre;
System.out.println("Ingrese su nombre");
nombre = reader.nextLine();
System.out.println(nombre);
System.out.println("¿Desea seguir? S/N");
char = reader.next().charAt(0);
} while(seguir == 'S');


2.3 CUÁNDO USAR FOR

Usaremos for cuando sabemos de antemano cuántas veces iterará el bucle. Por ejemplo:

Código: java
System.out.println("¿Cuántos usuarios desea guardar");
byte maximoUsuarios = reader.nextByte();
for(byte indice = 0; indice < maximoUsuarios; indice++) {
// proceso
}


En el ejemplo anterior, el bucle interará las veces que el usuario ha ingresado. Si el usuario ingresa 10, el bucle iterará 10 veces.


3.EJERCICIOS EN CLASE



En una empresa se requiere calcular el salario semanal de cada uno de los n obreros que laboran en ella. El salario se obtiene de la siguiente forma:
Si el obrero trabaja 40 horas o menos se le paga $20 por hora.

Solución:

Análisis

1. Objetivo
    Se desea calcular el salario semanal de cada obrero de acuerdo a los parámetros dados:
    Si trabaja 40 horas o menos, se le paga $20/h.
    Si trabaja más de 40 horas, se le paga lo mismo por las primeras 40h y $25 por cada hora extra.
2. Precondiciones
    Que existan empleados y que hayan trabajado.
3. Desarrollo
    Pedirle al usuario los nombres de los empleados y sus horas trabajadas.
    Por cada empleado, mostrarle su salario de acuerdo a los parámetros fijados.

> Datos importantes:

Entrada:

  • Nombre del empleado.
  • Horas trabajadas.

    Proceso:

  • Tarifa por hora normal y por hora extra.
  • Salario.

    Salida:

  • Salario.

    Diagrama de flujo:



    Código:

    Código: java

    package org.underc0de.curso;

    import java.util.Scanner;

    /**
    *
    * @author Gustavo
    */
    public class Repetitivas {
        public static void main(String[] args) {
            final byte THORA_NORMAL = 20;
            final byte THORA_EXTRA = 25;
            Scanner reader = new Scanner(System.in);
           
            byte numeroEmpleados;
            System.out.println("¿Cuántos empleados desea ingresar?");
            numeroEmpleados = reader.nextByte();
            reader.nextLine(); // libera el fin de línea (enter)
           
            for(byte actual=1; actual<=numeroEmpleados; actual++) {
                String nombre;
                byte horasTrabajadas;
                short salarioNeto;
                System.out.println("Ingrese el nombre del empleado");
                nombre = reader.nextLine();
                System.out.println("Ingrese las horas trabajadas");
                horasTrabajadas = reader.nextByte();
                if(horasTrabajadas <= 40) {
                    salarioNeto = (short) (horasTrabajadas * THORA_NORMAL);
                } else {
                    byte horasExtras;
                    short horasNormales;
                    short salarioBase;
                    short salarioExtra;
                    horasExtras = (byte) (horasTrabajadas - 40);
                    horasNormales = (short) (horasTrabajadas - horasExtras);
                    salarioBase = (short) (horasNormales * THORA_NORMAL);
                    salarioExtra = (short) (horasExtras * THORA_EXTRA);
                    salarioNeto = (short) (salarioBase + salarioExtra);
                }
                System.out.println("El salario del empleado "+nombre+" es "+salarioNeto+"\n\n");
                reader.nextLine(); // libera el final de línea (enter)
            }
        }
    }


    La razón por la que hacemos (short) es porque, por defecto Java devuelve las operaciones aritméticas como int. Entonces, dado que las variables son short, hay una pérdida de precisión y debemos convertir ese int a short. Si no desean hacer ésto, simplemente declaren todo como int.

    CitarCuando ingresas un número y das enter, el enter (fín de línea) ingresado queda en memoria, es por ésta razón que cuando llamamos a nextLine() luego de leer un número, el nextLine() lee el enter ingresado anteriormente porque ha quedado en memoria y se salta. Para evitar ésto debemos liberar el enter llamando a nextLine() luego de leer un número y antes de leer un texto.


    4. EJERCICIOS PROPUESTOS



    1.   Leer 10 números e imprimir solamente los números positivos.
    2.   Leer 20 números e imprimir cuantos son positivos, cuantos negativos y cuantos neutros
    3.   Imprima la suma de todos los números pares que van del 1 al 100 y diga cuántos hay.




    Glosario

    bucle, loop: estructura repetitiva (while, do while y for).
    centinela: variable que controla el ciclo de vida de un bucle.

Mayo 15, 2015, 04:12:38 PM #12 Ultima modificación: Mayo 15, 2015, 04:18:37 PM por Gus Garsaky

#12 - Switch




Definición: Switch es una estructura de control como lo son if, else if y else; de hecho, trabajan de la misma forma que trabajan los if anidados. La razón por la cual nos decidimos a usar switch en lugar de if, else if y else es generalmente por que switch nos brinda una estructura más limpia para trabajar con múltiples condiciones.

Sintaxis

La sintaxis de la estructura switch es la siguiente:

Pseudocódigo:

Citarsegún <expresión> hacer
    caso, = <valor>
        Instrucción 1
        Instrucción 2
    caso, = <valor>
        Instrucción 1
        Instrucción 2
    caso, = <valor>
        Inscripción 1
        Inscripción 2
    caso, sino
        Instrucción 1
fin según

En Java:

Código: java
switch(<expresión>) {
case <valor>:
/* Instrucciones */
break;
case <valor>:
/* Instrucciones */
break;
case <valor>:
/* Instrucciones */
break;
default: // opcional
/* Instrucciones */
}


Switch evalúa una expresión que se la pasa entre paréntesis. Cada case es un posible valor que puede ser el resultado de la expresión que ha evaluado el switch. El funcionamiento es igual al de los if anidados y al de los if, else if y else, ésto lo determinará la sentencia break.

La sentencia break se usa para romper un bucle, una condición, por lo que, si ponemos break al final de cada case, quiere decir que cuando se cumpla dicha condición, el break romperá la estructura switch. Ésto es muy semejante al if, else if y else. Si obviamos el break en cada case, si cumple una condición seguirá evaluando las siguientes condiciones. Ésto es igual a los if anidados.

la sentencia default se ejecuta si ninguna de las condiciones se cumple, ésto vendría a ser el else. Aquí es opcional, puedes poner un bloque por defecto o no.

Una estructura switch sería equivalente a un for con if anidados dentro. Así:

Código: java
for( temporal = 50; true; break){
  if( temporal == 25) { /* accion1; */}
  if( temporal == 35 || temporal == 23) { /* accion2 ; */ }
  /* en caso no se cumpla ninguna condición se ejecuta ésto:
   * (default)
   * /
   // acción si no se cumple ninguna condición (por defecto)
}



2. EJERCICIOS



Sado un número, mostrar el nombre del día al que pertenece en la semana.

Análisis:

1. Objetivo:
    Mostrar el nombre del día correspondiente al número del día en la semana.
2. Precondiciones:
    Que exista un número. (Lo desconocemos, por lo tanto, debemos pedírselo al usuario).
3. Desarrollo:
    El usuario ingresa un número.
    La aplicación evalúa el número y si es válido (1 y 7) muestra el nombre del día. Si no, mensaje de error.

Ya tenemos nuestro análisis y el flujo que tomará nuestra aplicación. Podemos apoyarnos en un diseño para poder entenderlo "visualmente". Ahora, vayamos a nuestro IDE NetBeans y plasmar nuestra solución en código Java:

Código: java

package org.underc0de.curso;

import java.util.Scanner;

/**
*
* @author Gustavo
*/
public class Clase10 {

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int numero;
        System.out.println("Ingrese un número entre 1 y 7");
        numero = reader.nextInt();
        switch (numero) {
            case 1:
                System.out.println("El día es Lunes");
                break;
            case 2:
                System.out.println("El día es Martes");
                break;
            case 3:
                System.out.println("El día es Miércoles");
                break;
            case 4:
                System.out.println("El día es Jueves");
                break;
            case 5:
                System.out.println("El día es Viernes");
                break;
            case 6:
                System.out.println("El día es Sábado");
                break;
            case 7:
                System.out.println("El día es Domingo");
                break;
            default:
                System.out.println("Debe ingresar un número entre 1 y 7");
        }
    }
}



3. EJERCICIOS PROPUESTOS



1. Dado un número del 1 al 12, diga el nombre del mes correspondiente.
2. Dada una letra, imprimir si es vocal.

13 - Clase Math


La clase Math es una clase utilitaria, es decir, tiene métodos ya preparados para cosas específcas que nos ayudan en nuestro desarrollo diario.

Como su nombre lo indica, ésta clase contiene un gran número de métodos matemáticos. Todos los métodos de la clase Math son estáticos, por lo tanto, no necesitamos instanciarla, solo basta llamar a sus métodos. También tiene 2 constantes E y PI que representan a las constantes matemáticas.

Podemos ver una lista con algunos métodos de la clase Math:


Pues ver la lista completa de métodos No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Julio 08, 2015, 03:28:22 AM #14 Ultima modificación: Julio 08, 2015, 11:00:57 AM por Gus Garsaky
POO - Introducción teórica


¿Qué es programación orientada a objetos (POO)?

La programación orientada a objetos es un paradigma de programación relativamente "nuevo". Éste paradigma se creó en el proyecto SIMULA 67, el cual era un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard, del Centro de Cómputo Noruego (Oslo). En éste centro se pretendía simular naves. La idea surgió al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable de agrupar los diversos tipos de objetos de definir sus propios datos y comportamientos. Fueron refinados más adelante en el famoso lenguaje Smalltalk, considerado por muchos como el padre de la programación orientada a objetos.

La programación orientada a objetos trata, por lo tanto, de resolver un determinado problema con la interacción de objetos. Estos se comunicarán entre sí, para dar con la solución a un problema dado.

¿Qué es un objeto?

Un objeto es la representación o abstracción de una entidad en el mundo real. Como toda entidad real, tiene características y comportamiento. Veamos el ejemplo de una bicicleta, ésta tiene propiedades que son sus características y también tiene métodos, que es su comportamiento.

Propiedades de un objeto

Siguiendo con el ejemplo de la bicicleta, ésa tiene las siguientes características:

  • Aro de Llantas
  • Asiento
  • Número de cambios
  • Tipo (montañera, etc)
  • Color

    Todas esas características son las propiedades de una bicicleta. Tiene una medida de aro de llanta, un asiento, número de cambios de velocidad, un tipo que determina si es montañera o de otro tipo y un color.

    Métodos/funciones de un objeto:

    Por otro lado, una bicileta tiene muchos comportamientos, como por ejemplo:

  • Acelerar
  • Frenar
  • Cambiar de velocidad

    Todos esos comportamientos, son los métodos o funciones de una bicicleta. Éstos comportamientos describen las cosas que puede hacer la bicicleta.

    Por lo tanto, un objeto es una abstracción o representación de una entidad real que tiene características (propiedades) y ciertos comportamientos (métodos o funciones) que lo describen.

POO - Clases y objetos


Siguiendo con el tutorial anterior, dijimos que un objeto era una representación  abstracta de una entidad del mundo real. Ahora bien, ¿cómo representamos dicha entidad en un objeto Java? Para responder ésta pregunta debemos de saber primero la definición de clase.

CLASE

Una clase en Java es la representación de un objeto en Java. Dicho esto, no pensemos que al crear una clase ya tenemos un objeto para usarlo, no, este concepto está mal. Una clase en Java funciona como una "plantilla" o "molde", del cual crearemos objetos (instanciar). Imagina una clase como un prototipo de un automóvil, la clase vendría a ser el plano del automóvil y de éste plano, se crean los automóviles. Por lo tanto, una clase define a un objeto para su posterior creación.

La sintaxis de una clase en Java es sencilla:

Código: java

public class Carro {

}


Todo lo que está entre llaves, se conoce como cuerpo de la clase. Dentro del cuerpo de la clase pueden ir los siguientes elementos:

  • Constructor o constructores (sobrecarga)
  • Propiedades (o atributos, campos, como suelen llamarles también) (características)
  • Métodos (comportamientos)

    Además, tiene las siguientes características:

  • Se le asigna un modificador de acceso (public, private, por defecto)
  • Modificador de estado (static, final)
  • Notación PascalCase (La primera letra de cada palabra en mayúscula)

    PROPIEDADES, ATRIBUTOS O CAMPOS

    Son como ya dijimos las características de un objeto. Las propiedades de una clase en Java tienen las siguientes características:

  • Modificador de acceso (public, private, protected, por defecto)
  • Tipo de dato (String, int, float, doublé, byte, short, etc)
  • Modificador de estado (static, final)
  • Notación camelCase (la primera letra de la primera palabra en minúscula y las primeras letras de las palabras siguientes en mayúsculas)

    Ej:

    Código: java
    public class Carro {

        private String color;

    }


    MÉTODOS O FUNCIONES

    Los métodos en Java son los comportamientos del objeto. Estos cumplen las siguientes características:

  • Modificador de acceso (public, private, protected, por defecto)
  • Valor de retorno (void, String, int, float, etc)
  • 0 o más parámetros (variables pasadas a un método)
  • Notación camelCase (la primera letra de la primera palabra en minúscula y las primeras letras de las palabras siguientes en mayúsculas)

    Ej

    Código: java

    public class Carro {

        private String color;
        private int velocidad = 150; // km/h

        public void acelerar() {
            System.out.println("Acelerando...");
        }

        public int obtenerVelocidad() {
            return velocidad;
        }

    }


    La palabra reservada return se usa para devolver valores desde un método. Si el tipo de retorno es void y se usa return, entonces la ejecución del método terminará automáticamente.

    Para pasar datos a un método, basta pasarlos entre los paréntesis, separados por comas si hay más de uno:

    Código: java
    public void establecerVelocidad(int nuevaVelocidad) {
        velocidad = nuevaVelocidad;
    }


    CONSTRUCTOR

    Un constructor es un método especial, el cual sirve como inicializador y creador de nuevas instancias de un tipo de objeto (clase). En cada creación de objetos, se llama al constructor implícitamente; sin él, no sería posible la creación de objetos. Un constructor tiene las siguientes características:

  • No tiene un valor de retorno
  • Debe llamarse exactamente como la clase

    Ej:

    Código: java

    public class Carro {

        public String color;
        public int velocidad = 150;

        public Carro() {

        }

        ...

    }


    Generalmente se aprovecha el constructor para inicializar propiedades del objeto. Por ejemplo:

    Código: java
    public Carro(String nuevoColor, int nuevaVelocidad) {
        color = nuevoColor;
        velocidad = nuevaVelocidad;
    }


    CREACIÓN DE OBJETOS

    Como ya dijimos, la creación de objetos se lleva a cabo por medio del constructor de la clase. Para crear un objeto de tipo Carro basta con hacer:

    Código: java

    Carro miCarro = new Carro();
    Carro miOtroCarro = new Carro("Blanco", 250);


    Ahora podemos llamar a los métodos de Carro, así:

    Código: java
    int velocidad = miCarro.obtenerVelocidad(); // retorna null porque no tiene un valor definido
    int velocidad2 = miOtroCarro.obtenerVelocidad(); // retorna 150


    ¿Cómo se lleva a cabo la creación de objetos?

    La palabra reserva new instancia (crea un nuevo objeto de la clase) y la coloca en memoria asociándose a una dirección. Allí, se le asigna un identificador único y por medio de este, podrá ser ubicado y llamado desde su dirección en memoria.

    CitarPlus: Cada vez que se crea un objeto, éste se guarda en el Stack, que es un apartado donde Java almacena los objetos, mientras que las variables y llamadas a métodos, se almacenan en el Heap.

    El código de la clase Carro quedaría así:

    Código: java

    public class Carro {
        private String color;
        private int velocidad;

        public Carro() {}

        public Carro(Sring nuevoColor, String nuevaVelocidad) {
            color = nuevoColor;
    velocidad = nuevaVelocidad;
        }

        public int obtenerVelocidad() {
    return velocidad;
        }

        public void establecerVelocidad(int nuevaVelocidad) {
    velocidad = nuevaVelocidad;
        }

    }


    Fíjate que hemos definido dos veces el constructor de la clase, a esto se le llama sobrecarga y puede aplicarse tanto a métodos como a constructores. Esto lo veremos en el próximo capítulo.

Sobrecarga de constructores y métodos (Overloading)

Como vimos anteriormente, un método nos sirve para agrupar lógica en pequeños módulos para luego ser usados cuando los necesitemos. Vimos también que un método tiene cierta estructura:

Código: php
<visibilidad> <modificador> <nombre> (<parámetros>) { ... }


Supongamos que tengo el siguiente método:

Código: java

public String createCar(String brand) {
    return "Auto " + brand + " creado";
}


El método solo recibe un parámetro que representa a la marca del automóvil a crear y retorna un String informando del auto creado. Pero, ¿que pasa si quiero crear un carro con una marca y un color? Una opción podría ser crear otro método:

Código: java

public String createCarWithColor(String brand, String color) {
    return "Auto " + brand + " color " + color + " creado";
}


Y si quisiese crear un carro con marca, color y además de X HP (caballos de fuerza), tendría que crear otro método llamado createCarWithColorAndHP. Afortunadamente, no necesitas hacer eso, solo tienes que sobrecargar el método createCar.

Código: java

public String createCar(String brand) {
    return "Auto " + brand + " creado";
}

public String createCar(String brand, String color) {
    return "Auto " + brand + " color " + color + " creado";
}

public String createCar(String brand, String color, String hp) {
    return "Auto " + brand + " color " + color + " y " + hp + " caballos de fuerza creado";
}


A esto se le llama sobrecarga. Estamos sobrecargando un método para que se comporte diferente de acuerdo a los parámetros recibidos. Para sobrecargar un método debemos de cumplir la siguiente regla:

  • Un método sobrecargado debe cambiar los parámetros del método a sobrecargar(menos o más).

    El siguiente ejemplo muestra una sobrecarga errónea de un método:

    Código: java

    public int sumar(int x, int y) { ... }

    public float sumar(int x, int y) { ... } // error, debe cambiar parámetros



    SOBRECARGA DE CONSTURCTORES

    La sobrecarga de constructores es igual que la de los métodos. Veamos un ejemplo para más detalle:

    Código: java

    public class User {

        private String id;
        private String name;

        public User() {
    this("", "");
        }

        public User(String id) {
            this(id, "");
        }

        public Usuer(String id, String name) {
    this.id = id;
    this.name = name;
        }

    }


    Vemos que hemos sobrecargado el constructor por defecto User(), el primero pasándole un String id, y el segundo un String id y un String name. Lo curioso aquí es la instrucción this(...). Veremos más adelante el concepto de this, pero como adelanto les diré. La palabra reservada this hace referencia a la instancia. Es decir, si hago: this(id, ""), -> this = objeto User -> objeto User(id, ""). Por lo tanto, como this hace referencia a la instancia, podemos acceder tanto a los contructores, métodos y atributos. Ya veremos más acerca de this un poco más adelante.


Laburaso!

muchas gracias, voy a ir revisando