Logo DIE

Fundamentos y Sintaxis del Lenguaje

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


Los lenguajes de programación tienen elementos básicos que se utilizan como bloques constructivos, así como reglas para que esos elementos se combinen. Estas reglas se denominan sintaxis del lenguaje. Solamente las instrucciones sintácticamente correctas pueden ser interpretadas por la computadora y los programas que contengan errores de sintaxis son rechazados por la máquina.

La sintaxis de un lenguaje de programación se define como el conjunto de reglas que deben seguirse al escribir el código fuente de los programas para considerarse como correctos para ese lenguaje de programación.

En esta UAPA conocerás la sintaxis básica para crear programas utilizando el lenguaje de programación Java, así como los operadores que maneja (aritméticos, lógicos y relacionales). Crearás variables y constantes de diferentes tipos de datos, así como programas utilizando estructuras de control (tanto selectivas como repetitivas). Podrás crear objetos utilizando el operador new, los cuales son la base del paradigma.





Crear programas que implementen variables y constantes de diferentes tipos de datos, expresiones y estructuras de control de flujo.

Sintaxis básica de Java


Los elementos básicos constructivos de un programa son los siguientes:



Diagrama de bloques


Además de estos elementos básicos, existen otros que forman parte de los programas, cuya comprensión y funcionamiento será vital para la correcta codificación de un programa; por ejemplo, tipos de datos y estructuras de control de flujo.



Diagrama de bloques


Casi todos los lenguajes de programación explícitamente incluyen la notación del tipo de datos, aunque lenguajes diferentes pueden usar terminologías diferentes. La mayor parte de los lenguajes de programación permiten al programador definir tipos de datos adicionales, normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del nuevo tipo de dato.



Diagrama de bloques


Nota: En esta UAPA la base de estudio será el lenguaje de programación Java; sin embargo, queda a criterio del profesor el uso de éste u otro lenguaje orientado a objetos.





Tipos de datos


En Java existen dos grupos de tipos de datos: tipos primitivos y tipos referencia.

Tipos de datos primitivos

Son aquellos datos sencillos que contienen los tipos de información más habituales: valores booleanos, caracteres y valores numéricos enteros o de punto flotante.

Java dispone de ocho tipos primitivos:

Tipo

Definición

boolean

true o false

char

Carácter Unicode de 16 bits

byte

Entero en complemento a dos con signo de 8 bits

short

Entero en complemento a dos con signo de 16 bits

int

Entero en complemento a dos con signo de 32 bits

long

Entero en complemento a dos con signo de 64 bits

float

Real en punto flotante según la norma IEEE 754 de 32 bits

double

Real en punto flotante según la norma IEEE 754 de 64 bits


Datos primitivos de variables en Java. [Tabla] Basada en http://ayudaparaprogramacion.blogspot.com/2013/10/programacion-en-java-tipos-pvimitivos.html

En Java, al contrario que en C o C++, el tamaño de los tipos primitivos no depende del sistema operativo o de la arquitectura, ya que en todas las arquitecturas y bajo todos los sistemas operativos el tamaño en memoria es el mismo.

Es posible recubrir los tipos primitivos para tratarlos como cualquier otro objeto en Java. Así, por ejemplo, existe una clase envoltura del tipo primitivo int llamado Integer.

La utilidad de estas clases se explicará en otro momento.



Tipos de datos referencia

Los tipos de datos referencia representan datos compuestos o estructuras, es decir, referencias a objetos. Estos tipos de datos almacenan las direcciones de memoria y no el valor en sí (similares a los apuntadores en C). Una referencia a un objeto es la dirección de un área en memoria destinada a representar ese objeto.

Variables


Una variable es un nombre que contiene un valor que puede cambiar a lo largo del programa. De acuerdo al tipo de información que contienen, en Java hay dos tipos principales de variables:

Diagrama de bloques


Desde el punto de vista del papel o misión en el programa, las variables pueden ser…



Variables miembro de una clase

Variables locales

Se definen en una clase, fuera de cualquier método; pueden ser tipos primitivos o referencias.

Se definen dentro de un método en general dentri de cualquier bloque entre llaves { }. Se crean en el interior del bloque y se destruyen al finalizar dicho bloque



Una variable se define especificando el tipo y el nombre de dicha variable. Estas variables pueden ser tanto de tipos primitivos como referencias a objetos de alguna clase perteneciente al API de Java o generada por el usuario.



tipoDeDato nombreVariable;

Ejemplo

int miVariable;

float area;

char letra;

String cadena;

MiClase prueba;



Si no se especifica un valor en su declaración, las variables primitivas se inicializan a cero (salvo boolean y char, que se inicializan a false y '\0'). Análogamente las variables de tipo referencia son inicializadas por defecto a un valor especial: null.

Es importante distinguir entre la referencia a un objeto y el objeto mismo. Una referencia es una variable que indica dónde está guardado un objeto en la memoria (a diferencia de C/C++, Java no permite acceder al valor de la dirección, pues en este lenguaje se han eliminado los apuntadores).



Al declarar una referencia todavía no se encuentra “apuntando” a ningún objeto en particular (salvo que se cree explícitamente un nuevo objeto en la declaración), y por eso se le asigna el valor null.

Si se desea que esta referencia apunte a un nuevo objeto es necesario crear el objeto utilizando el operador new.

Diagrama de bloques

Ejemplo

MyClass unaRef;
unaRef = new MyClass( );
MyClass segundaRef = unaRef;



Un tipo particular de referencias son los arrays o arreglos, sean estos de variables primitivas (por ejemplo, de enteros) o de objetos. En la declaración de una referencia de tipo array hay que incluir los corchetes [ ].

Ejemplo

int [ ] vector;
vector = new int[10];
MyClass [ ] lista = new MyClass[5];


En Java todas las variables deben estar incluidas en una clase. En general, las variables declaradas dentro de llaves { }, es decir, dentro de un bloque, son visibles y existen dentro de estas llaves. Por ejemplo, las variables declaradas al principio de un método existen mientras se ejecute el método; las variables declaradas dentro de un bloque if no serán válidas al finalizar las sentencias correspondientes a dicho if y las variables miembro de una clase (es decir declaradas entre las llaves { } de la clase, pero fuera de cualquier método) son válidas mientras existe el objeto de la clase.

Constantes

Una constante

Es una variable cuyo valor no puede ser modificado. Para definir una constante en Java se utiliza la palabra reservada final, delante de la declaración del tipo de la siguiente manera:

final tipoDato nombreDeConstante = valor;

Ejemplo:
final double PI = 3.1416;



Entrada y salida de datos por consola

Una de las operaciones más habituales que tiene que realizar un programa es intercambiar datos con el exterior; para ello, el API de Java incluye una serie de clases que permiten gestionar la entrada y salida de datos en un programa, independientemente de los dispositivos utilizados para el envío/recepción de datos.

Para el envío de datos al exterior se utiliza un flujo de datos de impresión o print stream.

Esto se logra usando la siguiente expresión:

System.out.println(“Mi mensaje”);

De manera análoga, para la recepción o lectura de datos desde el exterior, se utiliza un flujo de datos de entrada o input stream. Para lectura de datos se utiliza la siguiente sintaxis:

Scanner sc = new Scanner(System.in);
String s = sc.next( );        //Para cadenas
int x = sc.nextInt( );       //Para enteros

Para usar la clase Scanner se debe incluir al inicio del archivo la siguiente línea:

import java.util.Scanner;

Al finalizar su uso se debe cerrar el flujo usando el método close.

Para el ejemplo:

sc.close( );

Estas clases y sus métodos se verán más a detalle en el tema Manejo de archivos.

Operadores


Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.

Son operadores binarios (requieren siempre dos operandos) que realizan las operaciones aritméticas habituales:

+
suma

-
resta

*
multiplicación

*/
división

%
resto de la división o módulo

Los operadores de asignación permiten asignar un valor a una variable. El operador de asignación por excelencia es el operador igual (=). La forma general de las sentencias de asignación con este operador es…

Java dispone de otros operadores de asignación. Se trata de versiones abreviadas del operador (=) que realizan operaciones “acumulativas” sobre una variable.

variable = expression;



Diagrama de bloques

Los operadores más (+) y menos (-) unarios sirven para mantener o cambiar el signo de una variable, constante o expresión numérica. Su uso en Java es el estándar de estos operadores.

El operador instanceof permite saber si un objeto pertenece o no a una determinada clase. Es un operador binario cuya forma general es la siguiente:

objectName instanceof ClassName

Este operador devuelve true o false según el objeto pertenezca o no a la clase.

Este operador, tomado de C/C++, permite realizar bifurcaciones condicionales sencillas. Su forma general es la siguiente:

booleanExpression ? res1 : res2

Donde se evalúa booleanExpression y se devuelve res si el resultado es true y res2 si el resultado es false.

Es el único operador ternario (tres argumentos) de Java. Como todo operador que devuelve un valor puede ser utilizado en una expresión.

Java dispone del operador incremento (++) y decremento (--).



Diagrama de bloques



Estos operadores se pueden utilizar de dos formas:



Diagrama de bloques



La actualización de contadores en ciclos for es una de las aplicaciones más frecuentes de estos operadores.

Los operadores relacionales sirven para realizar comparaciones de igualdad, desigualdad y relación de menor o mayor. El resultado de estos operadores es siempre un valor boolean (true o false), según se cumpla o no la relación considerada.



Diagrama de bloques


Estos operadores se utilizan con mucha frecuencia en las estructuras de control.

Los operadores lógicos se utilizan para construir expresiones lógicas, combinando valores lógicos (true y/o false) o los resultados de los operadores relacionales.

Diagrama de bloques

Debe notarse que en ciertos casos el segundo operando no se evalúa, porque ya no es necesario (si ambos tienen que ser true y el primero es false, ya se sabe que la condición de que ambos sean true no se va a cumplir).

Esto puede traer resultados no deseados y por eso se han añadido los operadores (&) y (|), que garantizan que los dos operandos se evalúan siempre.

El operador más (+) se utiliza también para concatenar cadenas de caracteres.

Por ejemplo, para escribir una cantidad con un rótulo y valores puede utilizarse la sentencia:

System.out.println("El total asciende a " + result + " unidades");

Donde el operador de concatenación se utiliza dos veces para construir la cadena de caracteres que se desea imprimir por medio del método println( ).

La variable numérica result es convertida automáticamente por Java en cadena de caracteres para poderla concatenar. En otras ocasiones se deberá llamar explícitamente a un método para que realice esta conversión.

Java dispone también de un conjunto de operadores que actúan a nivel de bits. Las operaciones de bits se utilizan con frecuencia para definir señales o flags; esto es, variables de tipo entero en las que cada uno de sus bits indica si una opción está activada o no.

Diagrama de bloques
Diagrama de bloques



Precedencia de operadores

El orden en que se realizan las operaciones es fundamental para determinar el resultado de una expresión.

La siguiente lista muestra el orden en que se ejecutan los distintos operadores en una sentencia, de mayor a menor precedencia:



postfix operator

[ ] . (params) expr++ expr--

unary operators

++expr --expr +expr -expr ~ !

creation or cast

new (tpe)expr

multiplicative

* / %

additive

+ -

shift

<< >> >>>

relational

< > <= >= instanceof

equality

==!=

bitwise AND

&

bitwise exclusive OR

^

bitwise inclusive OR

|

logical AND

&&

logical OR

||

conditional

? :

assigment

= += -= *= /= %= &= ^= |= <<= >>= >>>=

En Java, todos los operadores binarios (excepto los operadores de asignación) se evalúan de izquierda a derecha.

Los operadores de asignación se evalúan de derecha a izquierda, lo que significa que el valor de la derecha se copia sobre la variable de la izquierda.





Estructuras de control


Las estructuras de programación o estructuras de control permiten tomar decisiones o realizar un proceso repetidas veces. En la mayoría de los lenguajes de programación, este tipo de estructuras son comunes en cuanto a concepto, aunque su sintaxis varía de un lenguaje a otro. La sintaxis de Java coincide prácticamente con la utilizada en C/C++, lo que hace que para un programador de C/C++ no represente ninguna dificultad adicional.

Sentencias o expresiones

Una expresión es un conjunto de variables unidas por operadores. Son órdenes que se le dan a la computadora para que realice una tarea determinada. Una sentencia es una expresión que acaba en punto y coma (;). Se permite incluir varias sentencias en una línea, aunque lo habitual es utilizar una línea para cada sentencia.

Ejemplo:

i = 0; j = 5; x = i + j; // Línea compuesta de tres sentencias



Estructuras de selección

Las estructuras de selección o bifurcaciones permiten ejecutar una de entre varias acciones en función del valor de una expresión lógica o relacional. Se trata de estructuras muy importantes, ya que son las encargadas de controlar el flujo de ejecución de un programa.

Existen dos bifurcaciones diferentes: if y switch.



if/else

1. Si se desea introducir más de una expresión de comparación se usa if/else if.

2. Si la primera condición no se cumple, se compara la segunda y así sucesivamente.

3. En el caso de que no se cumpla ninguna de las comparaciones se ejecutan las sentencias correspondientes a else.


if (booleanExpression1) {
      statements1;
} else if (booleanExpression2) {
      statements2;
} else if (booleanExpression3) {
      statements3;
} else {
      statements4;
}

Se trata de una alternativa a la bifurcación if/else if cuando se compara la misma expresión con distintos valores.

Su forma general es la siguiente:

switch (expression) {
      case value1:
            statements1;
            break;
       case value2:
            statements2;
            break;
      case value3:
            statements3;
            break;
      case value4:
            statements4;
            break;
      case value5:
            statements5;
            break;
      case value6:
            statements6;
            break;
      [default:
            statements7;]
}



Las características más relevantes de switch son las siguientes:



Diagrama de bloques



Estructuras de repetición

Las estructuras de repetición, lazos, ciclos o bucles se utilizan para realizar un proceso repetidas veces. El código incluido entre las llaves { } (opcionales si el proceso repetitivo consta de una sola línea), se ejecutará mientras se cumplan determinadas condiciones.

Hay que prestar especial atención a los ciclos infinitos, hecho que ocurre cuando la condición de finalizar el ciclo no se llega a cumplir nunca. Se trata de un fallo muy típico, habitual sobre todo entre programadores poco experimentados.



Hay que prestar especial atención a los ciclos infinitos, hecho que ocurre cuando la condición de finalizar el ciclo no se llega a cumplir nunca. Se trata de un fallo muy típico, habitual sobre todo entre programadores poco experimentados.

Las sentencias statements se ejecutan mientras booleanExpression sea true.

while (booleanExpression) {
statements;
}

Diagrama de bloques

La forma general de for es la siguiente:

for (initialization; booleanExpression; increment) { statements;
}

Diagrama de bloques

La sentencia break es válida tanto para las bifurcaciones como para los ciclos.

Hace que se salga inmediatamente del ciclo o bloque que se está ejecutando, sin realizar la ejecución del resto de las sentencias.

La sentencia continue se utiliza en los ciclos (no en bifurcaciones).

Finaliza la iteración “i” que en ese momento se está ejecutando (no ejecuta el resto de sentencias que hubiera hasta el final del bucle). Vuelve al comienzo del bucle y comienza la siguiente iteración (i+1).



Ejemplos usando estructuras de control

Programa que suma los números pares comprendidos entre n1 y n2.



Diagrama de bloques



Programa que calcula el área de una figura geométrica, dependiendo de la opción seleccionada por el usuario en un menú que se repite hasta seleccionar la opción “Salir”.



Diagrama de bloques
ícono

Actividad 1. Suma de ene números

Las estructuras de control, los tipos de datos y las condiciones permiten modificar el flujo de un programa mediante ciclos o toma de decisiones para lograr el objetivo deseado de la aplicación y que ésta se pueda adaptar a diferentes escenarios que el usuario requiera.

ícono

Autoevaluación. Conceptos básicos del lenguaje de programación Java


Fuentes de información

Dean, J. y Dean, R. (2009). Introducción a la programación con Java. Ciudad de México: McGraw-Hill.

Martín, A. (2008). Programador certificado Java 2 (2.ª ed.). Ciudad de México: Alfaomega.

Sierra, K. & Bates, B. (2008). SCJP Sun Certified Programmer for Java 6 Study Guide. New Delhi: McGraw-Hill.


Cómo citar


Solano, J. (2020). Fundamentos y sintaxis del lenguaje. Unidades de Apoyo para el Aprendizaje. CUAED/Facultad de Ingeniería-UNAM. Consultado el (fecha) de (vínculo)