miércoles, 31 de octubre de 2012

CHAR

char:

La palabra reservada char declara un campo que puede almacenar un caracter unicode de 16 bits. Esta palabra clave también se puede utilizar para determinar el tipo de datos de retorno de un método.

Un ejemplo de char es el siguiente:

char ch = 'a'; 
// Caracter griego omega
char uniChar = '\u039A';
// Un array de caracteres
char[] charArray = { 'a', 'b', 'c', 'd', 'e' };




martes, 30 de octubre de 2012

Sesión 3, Arrays y Control de Flujo.


Introducción:


En el presente capítulo se explica el concepto de array, la declaración, definición, construcción y uso. Complementaremos la explicación explicando las estructuras for, while, switch, if y else en su forma tradicional, y en la nueva sintaxis válida desde la versión 5 de java.

1.    Arrays.


Un array es un almacén de un número predeterminado de variables de un mismo tipo primitivo o de referencias a objetos de un mismo tipo, identificando cada elemento con un índice.

Con los arrays se pueden construir vectores y matrices de un mismo tipo. Los arrays son estructuras de gran utilidad, únicamente limitados porque en su definición se debe establecer un tamaño fijo y porque sólo pueden almacenar elementos de un mismo tipo.

Los arrays pueden tener uno o más índices, dependiendo de las dimensiones del array, así un array de 2 dimensiones se considera una matriz bidimensional, un array de 3 dimensiones una matriz tridimensional y así en lo sucesivo.

Cuando se define un array de objetos los elementos se inicializan a null, hasta que se rellenen. Si el array es de variables primitivas toman el valor 0, si son numéricas y false si son boolenas.

Declaración de arrays:

En el lenguaje java los arrays deben declararse y construirse antes de utilizarlos. A continuación ejemplos de declaraciones de arrays de diferentes tipos:

int [] enteros;
int enteros [];

boolean resultados [];
String [] consultas;

Definición o construcción de arrays:


Después de declarar un array se debe construir o definir. En la definición de un array se establece el tamaño del mismo.

A continuación ejemplos de declaración de arrays:

vector = new int[30];

consultas = new String[20];

También pueden declararse y definirse arrays de dos dimensiones como sigue:

int enteros [] [] = new int [3][];
enteros [0] = new int [2];
enteros [1] = new int [4];
enteros [2] = new int [2];

En el caso anterior se construye una matriz bidimensional que contiene 3 elementos de tipo array conteniendo 2, 4 y 2 elementos enteros respectivamente.

Pueden crearse matrices de tantas dimensiones como necesitemos.

Se puede declarar, definir e inicializar arrays de la siguiente forma:

int pares = {2, 4, 6, 8};
String nombres = {“Juan”, ”Pedro”, ”José”};

Un ejemplo de la utilización de arrays es la siguiente:

 
class ArrayDemo {
    public static void main(String[] args) {
        // declares an array of integers
        int[] anArray;
 
        // allocates memory for 10 integers
        anArray = new int[10];
           
        // initialize first element
        anArray[0] = 100;
        // initialize second element
        anArray[1] = 200;
        // etc.
        anArray[2] = 300;
        anArray[3] = 400;
        anArray[4] = 500;
        anArray[5] = 600;
        anArray[6] = 700;
        anArray[7] = 800;
        anArray[8] = 900;
        anArray[9] = 1000;
 
        System.out.println("Element at index 0: "+ anArray[0]);
        System.out.println("Element at index 1: "+ anArray[1]);
        System.out.println("Element at index 2: "+ anArray[2]);
        System.out.println("Element at index 3: "+ anArray[3]);
        System.out.println("Element at index 4: "+ anArray[4]);
        System.out.println("Element at index 5: "+ anArray[5]);
        System.out.println("Element at index 6: "+ anArray[6]);
        System.out.println("Element at index 7: "+ anArray[7]);
        System.out.println("Element at index 8: "+ anArray[8]);
        System.out.println("Element at index 9: "+ anArray[9]);
    }
} 
 
La salida del programa sería:

Element at index 0: 100
Element at index 1: 200
Element at index 2: 300
Element at index 3: 400
Element at index 4: 500
Element at index 5: 600
Element at index 6: 700
Element at index 7: 800
Element at index 8: 900
Element at index 9: 1000

2.    Control de flujo.


Como se ha comentado anteriormente la programación Java es orientada a objetos, consistente en definir una serie de objetos que interactúan entre sí. Una forma de interactuar es mediante las construcciones semánticas de control de flujo.

Estructuras de control de flujo: 

El lenguaje Java tomó del lenguaje sentencias y sintaxis de control de flujo de otras sentencias, condicionales, repetitivas y combinaciones de ambas. Las sentencias de control de flujo java son las siguientes:


  •  if...else if...else
  • switch(…){case… break;  ……; default….break;}
  • do {…} while(….);
  • for(….){……}
  •  while(….){….}

Ejecución condicional if….else:

Se utiliza cuando interesa controlar una condición previa a la ejecución de una sentencia.

Un ejemplo de sentencia if...else es el siguiente:

void applyBrakes() {
    if (isMoving) {
        currentSpeed--;
    } else {
        System.err.println("The bicycle has " + "already stopped!");
    } 
}
 
Si la condición isMoving es true se reduce la velocidad, si no, se muestra el mensaje de bibicleta parada.
 
Las sentencias if else se podrán anidar en bloques alternativos tal y como veremos en ejercicios 
subsiguientes.
 
Control de flujo en bloques alternativos switch:
 
En el caso de varios bloques alternativos se debe usar la sentencia de control de flujo switch. Se evalúa la 
condición de dentro del paréntesis del switch y dependiendo del resultado se ejecutan unas u otras sentencias.
 
Un ejemplo es el siguiente:
 
public class SwitchDemo {
    public static void main(String[] args) {
 
        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
    }
}
 
La anterior clase muestra el mes que le pasamos al entero month.

Bloques repetitivos con contador; la estructura for:

Lo primero que se debe hacer es inicializar el contador, establecer la condición de parada, y decrementar o incrementar hasta llegar a la condición de parada.

El contador es un número entero sobre el que se opera hasta llegar a la condición de parada.

La forma de expresar un bucle for, así es como lo llamamos los programadores, es la siguiente:

for (initialization; termination; increment) {
    statement(s)
}
 
El siguiente ejemplo imprime en pantalla los números del 1 al 10:
 
class ForDemo {
    public static void main(String[] args){
         for(int i=1; i<11 i="i" span="span">
              System.out.println("Count is: " + i);
         }
    }
}
 
La salida del programa es la siguiente:

Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10
 
Bloques repetitivos con evaluación de la condición al final del 
bloque: la estructura do ... while:
 
Para implementar un bloque repetitivo condicionado con evaluación al final del bloque tendremos que recurrir 
al bucle do...while.
 
El bucle do...while ejecuta y luego evalúa, vamos 007, es decir, siempre se ejecuta al menos una vez.
 
Se puede expresar como sigue:
 
do {
     statement(s)
} while (expression);
 
Un ejemplo de programa con do...while es el siguiente:
 
class DoWhileDemo {
    public static void main(String[] args){
        int count = 1;
        do {
            System.out.println("Count is: " + count);
            count++;
        } while (count < 11);
    }
}
 
La salida del programa es la siguiente:

Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10
 
Bloque repetitivo con la evaluación de la condición al principio del 
bloque: la estructura while:
 
Para implementar un bloque repetitivo condicionado con evaluación al principio del bloque tendremos que 
recurrir al bucle while.
 
El bucle while evalúa y luego ejecuta, es decir, no tiene porque ejecutarse ni una sola vez.
 
Se puede expresar como sigue:
 
while (expression) {
     statement(s)
}
 
El mismo programa de ejemplo de los bucles anteriores para la estructura while:
 
class WhileDemo {
    public static void main(String[] args){
        int count = 1;
        while (count < 11) {
            System.out.println("Count is: "
                               + count);
            count++;
        }
    }
}
 
La salida del programa es la siguiente:

Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10

lunes, 29 de octubre de 2012

CATCH

catch

Define un manejador de excepción -un grupo de sentencias que se ejecutan si se lanza la excepción en el bloque definido por la palabra clave try. El código se ejecuta sólo si la clase que lanza la excepción es conpatible con la excepción capturada por el catch de la clase que la trata. Veremos más sobre excepciones en sesiones subsiguientes.


Ejemplo:

try { 
 } catch (FileNotFoundException e) { 
 System.err.println("FileNotFoundException: " + e.getMessage()); 
 throw new SampleException(e); 
} catch (IOException e) { 
System.err.println("Caught IOException: " + e.getMessage()); 
}

En el ejemplo pueden verse dos manejadores de excepciones para un bloque try. 

domingo, 28 de octubre de 2012

CASE

case

La palabra reservada case se utiliza para crear un caso particular dentro de una sentencia switch. Explicaremos en profundidad la sentencia switch en la tercera sesión.

Ejemplo:

public class SwitchDemo {
    public static void main(String[] args) {

        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
    }
}
 
La anterior clase muestra el mes que le pasamos al entero month. 

viernes, 26 de octubre de 2012

Bytecodes

Java es compilado, en la medida en que su código fuente se transforma en una especie de código máquina, los bytecodes. Los bytecodes generados por el compilador son ejecutados por una parte de la máquina virtual conocida como intérprete. Una vez que el sistema de soporte de ejecución para la máquina virtual y el intérprete han sido portados a una plataforma hardware, todos los programas se pueden ejecutar sin necesidad de  recompilación.

Al ser interpretado, no existe una fase separada de enlace (link), el enlace es ahora el  proceso de cargar nuevas clases a través de la red por el Class Loader. Las clases se van  cargando conforme van siendo necesitadas. Su naturaleza interpretada también le permite  una mayor rapidez en el ciclo de desarrollo, ya que no es necesario tener el programa  totalmente libre de errores para poder ejecutarlo. Pueden sustituirse las clases por  prototipos, sin que eso implique una recompilación de las clases cuando se introduzcan las definitivas. 

Hay una mayor facilidad de depuración y los errores pueden ser detectados en fases más  tempranas del ciclo de desarrollo.



jueves, 25 de octubre de 2012

BYTE

byte

La palabra reservada byte se utiliza para declarar campos que pueden almacenar enteros de 8 bits con signo y complemento a dos (visto en la sesión 2). También se utiliza para declarar el tipo de retorno de un método.

Ejemplo:

public byte devuelveByte(){
  byte bValor=8;
  return bValor;
}

miércoles, 24 de octubre de 2012

BREAK

break

La palabra reservada break se utiliza para reanudar la ejecución de la sentencia inmediatamente a continuación del bloque en el que está la palabra break. Si el break está seguido de una etiqueta el programa reanuda la ejecución en la sentencia siguiente a la sentencia de la etiqueta.

Ejemplos:

for (Type type : types) {    
  for (Type t : types2) {          
    if (some condition) {             
    // Hace algo              
    break; // Reanuda la ejecución del bucle interno         
    }    
   }
}
 
 
 
search: {    
  for (Type type : types) {        
    for (Type t : types2) {    
      if (some condition) {  
        // Hace algo      
           break search;            
      }        
    }    
  }
}  


martes, 23 de octubre de 2012

BOOLEAN

boolean

La palabra boolean sirve para declarar variables con el tipo de datos primitivo booleano y que admiten los valores true y false. Esta palabra reservada también se utiliza para declarar el tipo de datos de retorno de un método.

El tipo boolean se utiliza para valores lógicos, true o false. Estos valores lógicos pueden obtenerse tamibén de la evaluación de expersiones (por ejemplo a < b) . Es especialmente importante para las sentencias de control como if o for.

A continuación un ejemplo del tipo boolean:
class BoolTest {
  public static void main(String args[]) {
    boolean b;
    b = false;
    System.out.println("b is " + b);
    b = true;
    System.out.println("b is " + b);
    // El valor boolena b controlará la salida
    if(b)System.out.println("This is executed.");
    b = false;
    if(b) System.out.println("This is not executed.");
    // salida de una operación booleana
   System.out.println("10 > 9 is " + (10 > 9));
  }
}
Esta es la salida generada por el programa.

b is false
b is true
This is executed.
10 > 9 is true

lunes, 22 de octubre de 2012

ASSERT


assert
  
La palabra assert, que fué añadida en la versión 1.4 de Java, se usa para hacer aserciones- una sentencia que el programador sabe que es siempre true en un punto del programa. Si las aserciones están habilitadas cuando el programa está corriento y nos salimos del flujo de ejecución la aserción se vuelve false, y una excepción AssertionError se lanza terminando el programa. El motivo de esta palabra reservada es el debugging.

El siguiente ejemplo muestra su uso:

class MiAssert
{
public static void main(String [] main)
{
int i = 1;
assert i > 10;

System.out.println("Este es un ejemplo con asserts");

}
}


Al ejecutar se lanza el AssertionError del que hablamos anteriormente.

domingo, 21 de octubre de 2012

Ejercicios Sesión 1.

Ejercicio 1


Modifique el mensaje de salida del programa java de la primera sesión, para que muestre por pantalla:

"Hola Mundo"
"Me llamo (nombre)"

Ejercico 2 (Adicional)

Cree un programa que realice la siguiente secuencia de operaciones:
1. Muestre un mensaje con el siguiente contenido:
"¿Cómo te llamas?"
2. Admita la entrada de datos desde la consola de ejecución.
3. Muestre un mensaje de saludo como el siguiente:
 "Hola (nombre)"
  
Pueden enviar sus soluciones a softyemprende@gmail.com. Recibirán la corrección de las mismas, así como cualquier tipo de ayuda.


Sesión 2, Programación Orientada a Objetos, Tipos de Datos y Modificadores.



 1.- Programación Orientada a Objetos.

1.1.- Introducción:


Célebre es la frase de Napoleón Bonaparte “divide y vencerás”, que en determinadas circunstancias puede servir, pero sucumbió ante la división de un ejército popular en guerrillas.

La frase sería “divide, comunica y vencerás”. De esto hablamos cuando pensamos en Programación Orientada a Objetos (POO en adelante).

Advertencia: Este tema lamentablemente tiene una elevadísima carga teórica.


1.2.- ¿Qué es?


Es un estilo de programación donde el diseño gira alrededor de los datos a manipular, en lugar de alrededor de las operaciones sobre esos datos como sucedía en la programación secuencial.

La principal ventaja es la estabilidad de los datos en el tiempo aumentando la reutilización y extensión.

Alan Kay resumió cinco características básicas de Smalltalk, el primer lenguaje orientado a objetos y uno de los lenguajes en que se basa Java. Estas características representan un acercamiento puro a la programación orientada a objetos:

  •  Todo es un objeto. Todo se puede representar como objetos en el programa.
  • Un programa es un conjunto de objetos que se indican entre sí lo que tienen que hacer enviándose mensajes.
  • Cada objeto tiene su propia memoria formada por otros objetos.
  • Todo objeto tiene un tipo asociado.
  • Todos los objetos de un tipo particular pueden recibir los mismos mensajes.
En este capítulo introduciremos los conceptos de la POO en detalle, y lo haremos no sólo para el lenguaje de programación Java, sino para todos los lenguajes que permitan la POO.
 

1.3.- Clases y objetos


En los lenguajes basados en el concepto de POO el concepto de clase (DIVIDE) constituye el mecanismo básico de organización del código, agrupando en un mismo módulo datos y operaciones para manipularlos.

Sintácticamente una clase es un conjunto de variables y un conjunto de operaciones (métodos) que interactúan con las variables, determinando y modificando el propio estado y comportamiento de un conjunto de objetos.

El objeto es a la clase lo que un tipo de datos a un valor. Una clase no es más que una plantilla para generar objetos, y un objeto una instancia de una clase, es decir, una realización específica de la clase.

Una clase es una agrupación de datos (variables o atributos) y de funciones (métodos) que operan sobre esos datos. A estos datos y funciones pertenecientes a una clase se les denomina atributos y métodos. La programación orientada a objetos se basa en la programación de clases y un programa se construye a partir de un conjunto de clases.

Los atributos podrán ser tipos primitivos, explicados más adelante, Java u otras clases.

Los métodos proporcionan acceso a los datos de una clase para modificarlos, modificando así el estado de un objeto.

Los mensajes (COMUNICA) que se envían a un objeto deben corresponder a alguno de los métodos definidos en la clase a la que este pertenece.

Sintaxis:

class nombre-clase{
[modificador-acceso] tipo nombre-attrib;
[modificador-acceso] tipo-retorno nombre-metodo(lista de parametros){
….}
}

1.4.- El constructor


El constructor es un tipo específico de método que siempre tiene el mismo nombre que la clase y se utiliza para construir objetos de esa clase. No tiene tipo de dato específico de retorno, ni siquiera void. Esto se debe a que el tipo específico que debe devolver un constructor de clase es el propio tipo de la clase.
 

1.5.- Creación de objetos


Se crean objetos con la palabra reservada new, que reserará memoria para ubicar el objeto e invocará al constructor de la clase.

Sintaxis:

Nombre-Clase variable = new Nombre-Clase();




A partir de la clase Coche podemos crear distintos objetos, (instancias de la clase) utilizando el operador new.


Coche a, b;
a = new Coche (“Ford gran Torino”, 1972.04.09, 150000);
b = new Coche (“Mustang Eleanor”, 1967.06.04, 70000);
Ahora podemos llamar a los métodos de la clase coche.
a.tasar();
b.comprar();


1.6.- Encapsulación


Es una de las principales ventajas de la POO, tener los atributos accesible únicamente a través de los métodos.

De esta forma se conserva la integridad y consistencia de los datos y se mantienen a salvo de accesos y modificaciones indeseadas.


1.7.- Herencia y polimorfismo


La herencia y el polimorfismo permiten reutilizar el comportamiento de una clase en la definición de otras nuevas. Es decir, permite reutilizar código evitando esfuerzos innecesarios en el desarrollo de aplicaciones.

La herencia es una relación entre clases y no entre objetos.


A la clase padre se la denomina “base” y a la hija “derivada”.

En Java todas las clases heredan como mínimo en última instancia de la clase Object, si no se especifica que hereda de otra clase.

Sintaxis:

Class clase-hija extends clase-padre{… }

Una clase hereda los miembros de la clase padre independientemente del modificador de acceso. La palabra reservada “super” permite acceder a los miembros de la clase padre.

Java no permite la herencia múltiple.

Cuando se trabaja con una clase derivada debe tenerse en cuenta el orden de instanciación de los constructores de las clases, primero el de la clase base y después el de la clase derivada.


1.8.- Redefinición de métodos


Es posible crear un método nuevo con el mismo nombre y parámetros en la clase derivada que en la clase base.

De esta forma se puede modificar, en un aspecto determinado, el comportamiento de la clase base respecto a la clase derivada.


1.9.- Interfaces


Una interface es una clase abstracta donde todos los métodos son abstractas.

Una interface puede contener miembros, pero éstos serán siempre static y final.

Para crear una interface se utiliza la palabra reservada “interface”.

Para implementar los comportamientos de la interfaz se utiliza la palabra reservada “implements”.

Todos los métodos de una interface son públicos.

Sintaxis:

Class clase-hija extends clase-padre{… }






Cuando un método funciona como una clase en lugar de con un interfaz, estamos limitados a utilizar dicha clase o sus subclases. Si quisiéramos aplicar ese método a una clase que no se encontrara en esa jerarquía, no podríamos. Las interfaces relajan considerablemente esta restricción y como resultado escribir un código más reutilizable.


1.10.- Polimorfismo


El polimorfismo permite definir múltiples clases con funcionalidad diferente pero con métodos y atributos denominados de forma idéntica, de manera que pueden ser utilizados de forma común.

Una variable es polimórfica cuando su tipo en la declaración no coincide con el tipo de objeto al que referencia (tiempo de ejecución).

El polimorfismo es la capacidad de acceder a un variado rango de funciones distintas a través del mismo interfaz, un mismo identificador puede tener distintas formas (distintas funciones y comportamientos) dependiendo del contexto en que se utilice.

La idea básica es que una referencia a un objeto de una determinada clase es capaz de servir de referencia o de nombre a objetos de cualquiera de sus clases derivadas.







Podríamos hacer:

Figura a = new Circulo ();
Figura b = new Triangulo ();

Se han creado 2 referencias de la clase Figura que posteriormente apuntan a objetos de las clases derivadas Circulo y Triangulo.

El polimorfismo tiene que ver con la relación que se establece entre la llamada a un método y el código que efectivamente se asocia con dicha llamada. A esta relación se llama vinculación (binding). La vinculación puede ser temprana (en tiempo de compilación) o tardía (en tiempo de ejecución). Con funciones normales o sobrecargadas se utiliza vinculación temprana (es posible y es lo más eficiente). Con funciones redefinidas en Java se utiliza siempre vinculación tardía, excepto si el método es final.

Ahora imaginemos que en el ejemplo anterior tanto la clase Figura como la clase
Circulo tiene el método pintar. Podemos hacer:
 
   a.pintar();

Se podría pensar que invocamos al método pintar de la clase Figura, ya que realmente es una referencia a Figura. Sin embargo, se invoca el método apropiado Circulo.pintar() debido al acoplamiento tardío (polimorfismo).
 

2.- Tipos de datos y modificadores

 

2.1.- Modificadores de acceso


Los modificadores de acceso definen en nivel de encapsulación de los diferentes tipos java.
Los modificadores de acceso (public, protected y private) van en la posición anteriormente comentada.

  • Public: si no se especifica nada es el modificador por defecto. Se puede acceder desde cualquier lugar sin ningún tipo de restricciones.
  • Private: sólo es accesible desde su propia clase.
  • Protected: accesible desde su propia clase  y sus subclases (posteriormente hablaremos de herencia).
-          
Nivel de Acceso
Clase
Subclase
Paquete
Todas
Private
X
             X
X
X
Protected
X
             X
X

Public
X
             X


Package
X





 

2.2.- Tipos de datos


Existe un conjunto de tipos de datos en Java con un tratamiento especial, se denominan tipos primitivos y no funcionan como los objetos, explicados anteriormente.

No es necesario crearlos con la palabra reservada “new”, el compilador se encarga de reservar memoria implícitamente.

Cada tipo primitivo tiene asociado una clase de envoltura. Explicadas en cursos sucesivos.
 

VARIABLES DE TIPOS PRIMITIVOS
Nombre
Tipo
Tamaño
Valor por defecto
Forma de inicializador
Rango
boolean
Lógico
1 bit
False
boolean a=true
True-False
char
Carácter
16 bits
NULL
char a =’a’
Unicodde
byte
Número entero
8 bits
0
byte a=0
-128 a 127
short
Número entero
16 bits
0
short a = 12
-32768 a 32767
int
Número entero
32 bits
0
int a = 1280
-2147483648 a 2147483649
long
Número entero
64 bits
0
long a = 12500
-2^63 a 2^63-1
float
Número entero
32 bits
0
float a = 3.1
-3,4x10^38 a 3,4x10^38
double
Número entero
128 bits
0
double = 125.335
-1,79x10^308 a -1,79x10^308

 

2.3.- Operadores


Un operador toma operandos y produce un nuevo valor a partir de los mismos.
En Java son importantísimas las reglas de precedencia de operadores, por ejemplo, suma y resta tienen preferencia respecto a multiplicación y división.

Si se deuda es recomendable el uso de paréntesis, a fin de establecer explícitamente el orden de precedencia.

Los operadores matemáticos son los mismos que en otros lenguajes de programación:

-         Suma +
-         Resta
-         Multiplicación *
-         División /
-         Módulo %: resto de la división entera.

Java permite varios tipos de notaciones:

Notación completa:

int suma = operando1 + operando2

Notación abreviada:

int suma +=4


Otros operadores Java matemáticos son el autoincremento ++ y autodecremento --, que aumentan o disminuyen una unidad al operando utilizado.

Para estos operadores también existen dos notaciones:

-         Notación prefija ++a: primero se evalúa el operador y después se asigna.
-         Notación postfija a++: primero se asigna y después se evalúa el operador.

Operador
Utilización
Expresión equivalente
+=
op1 += op2
op1 = op1 + op2
-=
op1 -= op2
op1 = op1 - op2
*=
op1 *= op2
op1 = op1 * op2
/=
op1 /= op2
op1 = op1 / op2
%=
op1 %= op2
op1 = op1 % op2


Otro tipo de operadores Java son los operadores lógicos AND &&, OR || y NOT !. Solo se pueden aplicar a tipos de datos boolean.

Operador
Nombre
Utilización
Resultado
&&
AND
op1 && op2
true si op1 y op2 son true. Si op1 es false ya no se evalúa op2
||
OR
op1 || op2
true si op1 u op2 son true. Si op1 es true ya no se evalúa op2
!
negación
! op
true si op es false y false si op es true
&
AND
op1 & op2
true si op1 y op2 son true. Siempre se evalúa op2
|
OR
op1 | op2
true si op1 u op2 son true. Siempre se evalúa op2







Otro tipo de operadores resultando tipos de datos booleanos son los de comparación IGUAL ==  y DISTINTO !=. Puede llevar a confusión a la hora de comparar objetos, pues comparan la referencia y no el estado del objeto.

Operador
Utilización
El resultado es true
>
op1 > op2
si op1 es mayor que op2
>=
op1 >= op2
si op1 es mayor o igual que op2
<
op1 < op2
si op1 es menor que op2
<=
op1 <= op2
si op1 es menor o igual que op2
==
op1 == op2
si op1 y op2 son iguales
!=
op1 ¡= op2
si op1 y op2 son diferentes


Para comparar los estados de los objetos se utiliza el operador equals.

Otro tipo de operadores son los operadores de bit y desplazamiento AND &, OR |, XOR ^, NOT ~, el operador de desplazamiento a la izquierda << y el operador de desplazamiento a la derecha >>.

Si llegados a este punto de esta sesión teórica no comprendes muchos conceptos no te preocupes los ejemplos completan este tema oportunamente.

Para cualquier duda te remitimos al e-mail softyemprende@gmail.com.