Anda di halaman 1dari 11

Una visión general de JavaComo en todos los otros lenguajes de computadora, los elementos

de Java no existen de forma aislada. Más bien, trabajan juntos para formar el lenguaje en su
conjunto. Sin embargo, esta interrelación puede hacer que sea difícil describir un aspecto de
Java sin involucrar a varios otros. A menudo, una discusión de una característica implica el
conocimiento previo de otra. Por este motivo, este capítulo presenta una descripción general
rápida de varias características clave de Java. El material descrito aquí le dará un punto de
apoyo que le permitirá escribir y comprender programas simples. La mayor parte de los temas
tratados se examinará con mayor detalle en los capítulos restantes de la Parte I .Programación
orientada a objetosLa programación orientada a objetos (OOP) está en el núcleo de Java. De
hecho, todos los programas Java están, al menos en cierta medida, orientados a objetos. OOP
es tan integral para Java que es mejor entender sus principios básicos antes de comenzar a
escribir incluso programas Java simples. Por lo tanto, este capítulo comienza con una discusión
de los aspectos teóricos de la POO.Dos paradigmasTodos los programas informáticos constan
de dos elementos: código y datos. Además, un programa puede organizarse conceptualmente
en torno a su código o en torno a sus datos. Es decir, algunos programas se escriben en torno a
"lo que está sucediendo" y otros en torno a "quién está siendo afectado". Estos son los dos
paradigmas que rigen cómo se construye un programa. La primera forma se llama el modelo
orientado al proceso . Este enfoque caracteriza a un programa como una serie de pasos
lineales (es decir, código). El modelo orientado a procesos se puede considerar como un
código que actúa sobre los datos . Los lenguajes de procedimiento como C emplean este
modelo para un éxito considerable. Sin embargo, como se mencionó en el Capítulo 1 , los
problemas con este enfoque aparecen a medida que los programas se hacen más grandes y
más complejos.Para gestionar la creciente complejidad , se concibió el segundo enfoque,
denominado programación orientada a objetos . La programación orientada a objetos organiza
un programa alrededor de sus datos (es decir, objetos) y un conjunto de interfaces bien
definidas para esos datos. Un programa orientado a objetos se puede caracterizar como datos
que controlan el acceso al código . Como verá, al cambiar la entidad de control a datos, puede
lograr varios beneficios organizacionales.AbstracciónUn elemento esencial de la programación
orientada a objetos es la abstracción . Los humanos manejan la complejidad a través de la
abstracción. Por ejemplo, las personas no piensan en un automóvil como un conjunto de
decenas de miles de partes individuales. Ellos piensan que es un objeto bien definido con su
propio comportamiento único. Esta abstracción permite a las personas usar un automóvil para
ir al supermercado sin sentirse abrumados por la complejidad de las partes individuales.
Pueden ignorar los detalles de cómo funcionan los sistemas de motor, transmisión y frenos. En
su lugar, son libres de utilizar el objeto como un todo.Una forma eficaz de gestionar la
abstracción es mediante el uso de clasificaciones jerárquicas. Esto le permite superponer la
semántica de sistemas complejos, dividiéndolos en piezas más manejables. Desde el exterior,
el coche es un solo objeto. Una vez dentro, se ve que el automóvil consta de varios
subsistemas: dirección, frenos, sistema de sonido, cinturones de seguridad, calefacción,
teléfono celular, etc. A su vez, cada uno de estos subsistemas está formado por unidades más
especializadas. Por ejemplo, el sistema de sonido podría consistir en una radio, un reproductor
de CD y / o reproductor de MP3. El punto es que usted administra la complejidad del
automóvil (o cualquier otro sistema complejo) mediante el uso de abstracciones
jerárquicas.Las abstracciones jerárquicas de sistemas complejos también pueden aplicarse a
programas informáticos. Los datos de un programa tradicional orientado a procesos se pueden
transformar por abstracción en sus objetos componentes. Una secuencia de pasos de proceso
puede convertirse en una colección de mensajes entre estos objetos. Por lo tanto, cada uno de
estos objetos describe su propio comportamiento único. Puede tratar estos objetos como
entidades concretas que responden a los mensajes que les dicen que Las abstracciones de
sistemas complejos también pueden aplicarse a programas de computadora. Los datos de un
programa tradicional orientado a procesos se pueden transformar por abstracción en sus
objetos componentes. Una secuencia de pasos de proceso puede convertirse en una colección
de mensajes entre estos objetos. Por lo tanto, cada uno de estos objetos describe su propio
comportamiento único. Puede tratar estos objetos como entidades concretas que responden a
mensajes que les dicen quehagan algo . Esta es la esencia de la programación orientada a
objetos.Los conceptos orientados a objetos forman el corazón de Java, al igual que forman la
base para la comprensión humana. Es importante que entiendas cómo estos conceptos se
traducen en programas. Como verá, la programación orientada a objetos es un paradigma
poderoso y natural para crear programas que sobrevivan a los cambios inevitables que
acompañan el ciclo de vida de cualquier proyecto de software importante, incluida la
concepción, el crecimiento y el envejecimiento. Por ejemplo, una vez que tiene objetos bien
definidos e interfaces limpias y confiables para esos objetos, puede retirar o reemplazar partes
de un sistema más antiguo sin temor.Los tres principios de OOPTodos los lenguajes de
programación orientados a objetos proporcionan mecanismos que lo ayudan a implementar el
modelo orientado a objetos. Son encapsulación, herencia y polimorfismo. Echemos un vistazo
a estos conceptos ahora.EncapsulacionEncapsulaciones el mecanismo que une el código y los
datos que manipula, y mantiene ambos a salvo de interferencias externas y mal uso. Una
forma de pensar acerca de la encapsulación es como una envoltura protectora que evita que el
código y los datos sean accedidos arbitrariamente por otro código definido fuera de la
envoltura. El acceso al código y a los datos dentro de la envoltura se controla estrictamente a
través de una interfaz bien definida. Para relacionar esto con el mundo real, considere la
transmisión automática en un automóvil. Encapsula cientos de bits de información sobre su
motor, como la velocidad a la que acelera, la inclinación de la superficie en la que se encuentra
y la posición de la palanca de cambios. Usted, como usuario, tiene un solo método para afectar
esta compleja encapsulación: moviendo la palanca de cambios. No puede afectar la
transmisión mediante el uso de la señal de giro o los limpiaparabrisas, por ejemplo. Por lo
tanto, la palanca de cambio es unaInterfaz bien definida (de hecho, única) para la transmisión.
Además, lo que ocurre dentro de la transmisión no afecta los objetos fuera de la transmisión.
Por ejemplo, ¡cambiar de marcha no enciende los faros! Debido a que una transmisión
automática está encapsulada, docenas de fabricantes de automóviles pueden implementar
una en cualquier forma que deseen. Sin embargo, desde el punto de vista del conductor, todos
funcionan igual. Esta misma idea se puede aplicar a la programación. El poder del código
encapsulado es que todos saben cómo acceder a él y, por lo tanto, pueden usarlo
independientemente de los detalles de la implementación, y sin temor a efectos secundarios
inesperados.En Java, la base de la encapsulación es la clase. Aunque la clase se examinará con
gran detalle más adelante en este libro, la siguiente breve discusión será útil ahora. Una clase
define la estructura y el comportamiento (datos y código) que serán compartidos por un
conjunto de objetos. Cada objeto de una clase dada contiene la estructura y el
comportamiento definidos por la clase, como si fueran estampados por un molde en la forma
de la clase. Por esta razón, los objetos a veces se denominan instancias de una clase . Así, una
clase es un constructo lógico; Un objeto tiene realidad física.Cuando cree una clase,
especificará el código y los datos que constituyen esa clase. En conjunto, estos elementos se
llaman miembros de la clase. Específicamente, los datos definidos por la clase se conocen
como variables miembro o variables de instancia . El código que opera en esos datos se conoce
como métodos miembros o simplemente métodos . (Si está familiarizado con C / C ++, puede
ser útil saber que lo que un programador de Java llama a un método , un programador de C / C
++ llama a una función.) En los programas Java correctamente escritos, los métodos definen
cómo se pueden usar las variables miembro. Esto significa que el comportamiento y la interfaz
de una clase están definidos por los métodos que operan en sus datos de instancia.Dado que
el propósito de una clase es encapsular la complejidad, existen mecanismos para ocultar la
complejidad de la implementación dentro de la clase. Cada método o variable en una clase
puede ser marcado como privado o público. La interfaz pública de una clase representa todo lo
que los usuarios externos de la clase necesitan saber o pueden saber. Lo privadoSolo se puede
acceder a los métodos y datos mediante un código que sea miembro de la clase. Por lo tanto,
cualquier otro código que no sea miembro de la clase no puede acceder a un método privado
o variable. Debido a que otras partes de su programa solo pueden acceder a los miembros
privados de una clase a través de los métodos públicos de la clase, puede asegurarse de que no
se realicen acciones impropias. Por supuesto, esto significa que la interfaz pública debe
diseñarse con cuidado para no exponer demasiado el funcionamiento interno de una clase
(consulte la Figura 2-1 ).Figura 2-1 Encapsulación: se pueden usar métodos públicos para
proteger datos privados.HerenciaHerencia es el proceso por el cual un objeto adquiere las
propiedades de otro objeto. Esto es importante porque apoya el concepto de clasificación
jerárquica. Como se mencionó anteriormente, la mayoría de los conocimientos se hacen
manejables mediante clasificaciones jerárquicas (es decir, de arriba hacia abajo). Por ejemplo,
un Golden Retriever es parte de la clasificación de perros , que a su vez es parte de la clase de
mamíferos , que está bajo la clase más grande de animales.. Sin el uso de jerarquías, cada
objeto tendría que definir todas sus características explícitamente. Sin embargo, mediante el
uso de la herencia, un objeto solo necesita definir aquellas cualidades que lo hacen único
dentro de su clase. Puede heredar sus atributos generales de su padre. Por lo tanto, es el
mecanismo de herencia el que hace posible que un objeto sea una instancia específica de un
caso más general. Echemos un vistazo más de cerca a este proceso.La mayoría de las personas,
naturalmente, ven el mundo como compuesto de objetos que están relacionados entre sí de
una manera jerárquica, como los animales, los mamíferos y los perros. Si quisieras describir a
los animales de una manera abstracta, dirías que tienen algunos atributos, como el tamaño, la
inteligencia y el tipo de sistema esquelético. Los animales también tienen ciertos aspectos de
comportamiento; Comen, respiran y duermen. Esta descripción de los atributos y el
comportamiento es la definición de clase para los animales.Si quisiera describir una clase de
animales más específica, como los mamíferos, tendrían atributos más específicos, como el tipo
de dientes y las glándulas mamarias. Esto se conoce como una subclase de animales, donde los
animales se conocen como superclase de mamíferos .Dado que los mamíferos son
simplemente animales especificados con mayor precisión, heredan todos los atributos de los
animales. Una subclase profundamente heredada hereda todos los atributos de cada uno de
sus ancestros en la jerarquía de clases .La herencia también interactúa con la encapsulación. Si
una clase dada encapsula algunos atributos, entonces cualquier subclase tendrá los mismos
atributos más cualquiera que agregue como parte de su especialización (vea la Figura 2-2 ).
Este es un concepto clave que permite a los programas orientados a objetos crecer en
complejidad de forma lineal en lugar de geométrica. Una nueva subclase hereda todos los
atributos de todos sus ancestros. No tiene interacciones impredecibles con la mayoría del
resto del código en el sistema.Figura 2-2 Labrador hereda la encapsulación de todas sus
superclases.PolimorfismoEl polimorfismo (del griego, que significa "muchas formas") es una
característica que permite utilizar una interfaz para una clase general de acciones. La acción
específica está determinada por la naturaleza exacta de la situación. Considere una pila (que es
una lista de último en entrar, primero en salir). Es posible que tenga un programa que requiere
tres tipos de pilas. Una pila se usa para valores enteros, una para valores de punto flotante y
otra para caracteres. El algoritmo que implementa cada pila es el mismo, aunque los datos que
se almacenan son diferentes. En un lenguaje no orientado a objetos, se le pedirá que cree tres
conjuntos diferentes de rutinas de pila, con cada conjunto usando nombres diferentes. Sin
embargo, debido al polimorfismo, en Java puede especificar un conjunto general de rutinas de
pila que comparten todos los mismos nombres.Más generalmente, el concepto de
polimorfismo se expresa a menudo con la frase "una interfaz, métodos múltiples". Esto
significa que es posible diseñar una interfaz genérica para un grupo de actividades
relacionadas. Esto ayuda a reducir la complejidad al permitir que se utilice la misma interfaz
para especificar una clase general de acción . Es tarea del compilador seleccionar la acción
específica (es decir, el método) que se aplica a cada situación. Usted, el programador, no
necesita hacer esta selección manualmente. Solo necesitas recordar y utilizar la interfaz
general.Extendiendo la analogía del perro, el sentido del olfato de un perro es polimórfico. Si el
perro huele a un gato, ladra y corre tras él. Si el perro huele su comida, salivará y correrá a su
tazón. El mismo sentido del olfato funciona en ambas situaciones. ¡La diferencia es lo que se
está oliendo, es decir, el tipo de datos que opera la nariz del perro! Este mismo concepto
general se puede implementar en Java, ya que se aplica a los métodos dentro de un programa
Java.El polimorfismo, la encapsulación y la herencia trabajan juntosCuando se aplica
correctamente, el polimorfismo, la encapsulación y la herencia se combinan para producir un
entorno de programación que apoya el desarrollo de programas mucho más robustos y
escalables que el modelo orientado a procesos. Una jerarquía de clases bien diseñada es la
base para reutilizar el código en el que ha invertido tiempo y esfuerzo desarrollando y
probando. La encapsulación le permite migrar sus implementaciones a lo largo del tiempo sin
romper el código que depende de la interfaz pública de sus clases. El polimorfismo le permite
crear código limpio, sensible, legible y resistente.De los dos ejemplos del mundo real, el
automóvil ilustra más completamente el poder del diseño orientado a objetos. Es divertido
pensar en los perros desde el punto de vista de la herencia, pero los autos se parecen más a
los programas. Todos los conductores confían en la herencia para conducir diferentes tipos
(subclases) de vehículos. Ya sea que el vehículo sea un autobús escolar, un sedán Mercedes, un
Porsche o la minivan familiar, los conductores pueden encontrar y operar más o menos el
volante, los frenos y el acelerador. Después de un poco de esmerilado de engranajes, la
mayoría de las personas pueden incluso manejar la diferencia entre un cambio de palanca y
una automática, porque comprenden fundamentalmente su superclase común, la
transmisión.Las personas interactúan con características encapsuladas en automóviles todo el
tiempo. ¡Los pedales de freno y de gas ocultan una increíble variedad de complejidad con una
interfaz tan simple que puede utilizarlos con los pies! La implementación del motor, el estilo
de los frenos y el tamaño de los neumáticos no tienen ningún efecto en la forma en que
interactúa con la definición de clase de los pedales.El atributo final, el polimorfismo, se refleja
claramente en la capacidad de los fabricantes de automóviles para ofrecer una amplia gama de
opciones básicamente en el mismo vehículo. Por ejemplo, puede obtener un sistema de frenos
antibloqueo o frenos tradicionales, dirección asistida o por piñón y motores de 4, 6 u 8
cilindros. De cualquier manera, seguirá presionando el pedal del freno para detenerse, gire el
volante para cambiar de dirección y presione el acelerador cuando desee moverse. La misma
interfaz se puede utilizar para controlar varias implementaciones diferentes.Como puede ver,
es a través de la aplicación de encapsulación, herencia y polimorfismo que las partes
individuales se transforman en el objeto conocido como automóvil. Lo mismo ocurre con los
programas informáticos. Mediante la aplicación de principios orientados a objetos, las diversas
partes de un programa complejo se pueden unir para formar un todo cohesivo, sólido y
mantenible.Como se mencionó al inicio de esta sección, cada programa Java está orientado a
objetos. O, para ser más precisos, cada programa Java involucra encapsulación, herencia y
polimorfismo. Si bien los programas de ejemplo cortos que se muestran en el resto de este
capítulo y en los siguientes capítulos pueden parecer no mostrar todas estas características, sin
embargo, están presentes.Como verá, muchas de las características proporcionadas por Java
son parte de sus bibliotecas de clase integradas, que hacen un uso extensivo de la
encapsulación, la herencia y el polimorfismo.Un primer programa simpleAhora que se ha
analizado el apuntalamiento básico de Java orientado a objetos, veamos algunos programas
Java reales. Comencemos por compilar y ejecutar el programa de ejemplo corto que se
muestra aquí. Como verás, esto implica un poco más de trabajo del que puedes imaginar.NOTA
Las descripciones que siguen utilizan el Kit de desarrollo estándar de Java SE (JDK), que está
disponible en Oracle. (Las versiones de código abierto también están disponibles). Si está
utilizando un entorno de desarrollo integrado (IDE), deberá seguir un procedimiento diferente
para compilar y ejecutar programas Java. En este caso, consulte la documentación de su IDE
para más detalles.Entrando al programaPara la mayoría de los lenguajes informáticos, el
nombre del archivo que contiene el código fuente de un programa no tiene importancia. Sin
embargo, este no es el caso con Java. Lo primero que debes aprender sobre Java es que el
nombre que le das a un archivo fuente es muy importante. Para este ejemplo, el nombre del
archivo fuente debe ser Example.java . A ver por qué.En Java, un archivo fuente se llama
oficialmente una unidad de compilación . Es un archivo de texto que contiene (entre otras
cosas) una o más definiciones de clase. (Por ahora, usaremos archivos de origen que contienen
solo una clase). El compilador de Java requiere que un archivo de origen use la extensión de
nombre de archivo .java .Como puede ver al mirar el programa, el nombre de la clase definida
por el programa también es Ejemplo . Esto no es una coincidencia. En Java, todo el código
debe residir dentro de una clase. Por convención, el nombre de la clase principal debe coincidir
con el nombre del archivo que contiene el programa. También debe asegurarse de que la
mayúscula del nombre del archivo coincida con el nombre de la clase. La razón de esto es que
Java distingue entre mayúsculas y minúsculas. En este punto, la convención de que los
nombres de los archivos corresponden a los nombres de clase puede parecer arbitraria. Sin
embargo, esta convención facilita el mantenimiento y la organización de sus programas.
Además, como verá más adelante en este libro, en algunos casos es necesario.Compilando el
programaPara compilar el programa de ejemplo , ejecute el compilador, javac , especificando
el nombre del archivo fuente en la línea de comando, como se muestra aquí:C:\>javac
Example.javaEl compilador javac crea un archivo llamado Example.class que contiene la
versión de bytecode del programa. Como se mencionó anteriormente, el código de bytes de
Java es la representación intermedia de su programa que contiene instrucciones que ejecutará
la Máquina Virtual de Java. Por lo tanto, la salida de javac no es un código que se pueda
ejecutar directamente.Para ejecutar realmente el programa, debe usar el iniciador de
aplicaciones Java llamado java . Para hacerlo, pase el Ejemplo de nombre de clase como un
argumento de línea de comando, como se muestra aquí:C:\>java ExampleCuando se ejecuta el
programa, se muestra la siguiente salida:This is a simple Java program.Cuando se compila el
código fuente de Java, cada clase individual se coloca en su propio archivo de salida que lleva
el nombre de la clase y utiliza la extensión .class . Por esta razón, es una buena idea darle a sus
archivos fuente de Java el mismo nombre que la clase que contienen: el nombre del archivo
fuente coincidirá con el nombre del archivo .class . Cuando ejecuta java como se acaba de
mostrar, en realidad está especificando el nombre de la clase que desea ejecutar. Buscará
automáticamente un archivo con ese nombre que tenga la extensión .class . Si encuentra el
archivo, ejecutará el código contenido en la clase especificada.NOTA A partir de JDK 11, Java
proporciona una forma de ejecutar algunos tipos de programas simples directamente desde un
archivo fuente, sin invocar explícitamente javac . Esta técnica, que puede ser útil en algunas
situaciones, se describe en el Apéndice C . Para los fines de este libro, se supone que está
utilizando el proceso de compilación normal que se acaba de describir.Una mirada más
cercana al primer programa de muestraAunque Example.java es bastante corto, incluye varias
características clave que son comunes a todos los programas Java. Examinemos de cerca cada
parte del programa.El programa comienza con las siguientes líneas:Este es un comentario .
Como la mayoría de los otros lenguajes de programación, Java le permite ingresar un
comentario en el archivo fuente de un programa. El compilador ignora los contenidos de un
comentario. En su lugar, un comentario describe o explica el funcionamiento del programa a
cualquiera que esté leyendo su código fuente. En este caso, el comentario describe el
programa y le recuerda que el archivo de origen debe llamarse Example.java . Por supuesto, en
las aplicaciones reales, los comentarios generalmente explican cómo funciona alguna parte del
programa o qué hace una característica específica.Java soporta tres estilos de comentarios. El
que se muestra en la parte superior del programa se llama comentario multilínea . Este tipo de
comentario debe comenzar con / * y terminar con * /. Cualquier cosa entre estos dos símbolos
de comentarios es ignorada por el compilador. Como su nombre lo indica, un comentario de
varias líneas puede tener varias líneas.La siguiente línea de código en el programa se muestra
aquí:class Example {Esta línea utiliza la clase de palabra clave para declarar que se está
definiendo una nueva clase. Ejemplo es un identificador que es el nombre de la clase. La
definición completa de la clase, incluidos todos sus miembros, estará entre la llave de apertura
({) y la llave de cierre (}). Por el momento, no se preocupe demasiado por los detalles de una
clase, excepto para tener en cuenta que en Java, toda la actividad del programa se produce
dentro de una. Esta es una de las razones por las que todos los programas Java están
orientados a objetos (al menos un poco).La siguiente línea en el programa es el comentario de
una sola línea , que se muestra aquí:// Your program begins with a call to main().Este es el
segundo tipo de comentario soportado por Java. Un comentario de una sola línea comienza
con un // y termina al final de la línea. Como regla general, los programadores utilizan
comentarios de varias líneas para comentarios más largos y comentarios de una sola línea para
descripciones breves, línea por línea. El tercer tipo de comentario, un comentario de
documentación , se tratará en la sección "Comentarios" más adelante en este capítulo.La
siguiente línea de código se muestra aquí:public static void main(String args[ ]) {Esta línea
comienza el método main () . Como lo sugiere el comentario anterior, esta es la línea en la que
el programa comenzará a ejecutarse. Como regla general, un programa Java comienza la
ejecución llamando a main () . El significado completo de cada parte de esta línea no se puede
dar ahora, ya que implica una comprensión detallada del enfoque de Java para la
encapsulación. Sin embargo, dado que la mayoría de los ejemplos en la primera parte de este
libro utilizarán esta línea de código, echemos un breve vistazo a cada parte ahora.La palabra
clave pública es un modificador de acceso , que permite al programador controlar la visibilidad
de los miembros de la clase. Cuando un miembro de la clase está precedido por público ,
entonces se puede acceder a ese miembro por un código fuera de la clase en la que se declara.
(Lo contrario de public es private , lo que impide que un miembro sea utilizado por un código
definido fuera de su clase). En este caso, main () debe declararse como público , ya que debe
ser llamado por un código fuera de su clase cuando el Se inicia el programa. La palabra clave
static permite main ()para ser llamado sin tener que instanciar una instancia particular de la
clase. Esto es necesario ya que la máquina virtual de Java llama a main () antes de crear
cualquier objeto. La palabra clave void simplemente le dice al compilador que main () no
devuelve un valor. Como verá, los métodos también pueden devolver valores. Si todo esto
parece un poco confuso, no te preocupes. Todos estos conceptos serán discutidos en detalle
en los capítulos siguientes.Como se indicó, main () es el método llamado cuando se inicia una
aplicación Java. Tenga en cuenta que Java distingue entre mayúsculas y minúsculas. Por lo
tanto, Main es diferente de main . Es importante comprender que el compilador de Java
compilará las clases que no contengan un método main () . Pero Java no tiene manera de
ejecutar estas clases. Por lo tanto, si hubiera escrito Main en lugar de main , el compilador
seguiría compilando su programa. Sin embargo, Java informaría un error porque no podría
encontrar el método main () .Cualquier información que necesite pasar a un método es
recibida por las variables especificadas dentro del conjunto de paréntesis que siguen al
nombre del método. Estas variables se llaman parámetros . Si no se requieren parámetros para
un método dado, aún debe incluir los paréntesis vacíos. En main () , solo hay un parámetro,
aunque complicado. String args [] declara un parámetro llamado args , que es una matriz de
instancias de la clase String . (Las matrices son colecciones de objetos similares). Los objetos de
tipo String almacenan cadenas de caracteres. En este caso, args.recibe cualquier argumento de
línea de comando presente cuando se ejecuta el programa. Este programa no hace uso de esta
información, pero otros programas que se muestran más adelante en este libro lo harán.El
último carácter en la línea es el {. Esto señala el inicio del cuerpo de main () . Todo el código
que comprende un método ocurrirá entre la llave de apertura del método y su llave de
cierre.Otro punto: main () es simplemente un punto de partida para su programa. Un
programa complejo tendrá docenas de clases, solo una de las cuales tendrá que tener un
método main () para comenzar. Además, para algunos tipos de programas, no necesitará main
() en absoluto. Sin embargo, para la mayoría de los programas que se muestran en este libro,
se requiere main () .La siguiente línea de código se muestra aquí. Observe que ocurre dentro
de main () .System.out.println("This is a simple Java program.");Esta línea genera la cadena
"Este es un programa Java simple". seguido de una nueva línea en la pantalla. La salida en
realidad se logra mediante el método println () incorporado . En este caso, println () muestra la
cadena que se le pasa. Como verá, println () también se puede usar para mostrar otros tipos de
información. La línea comienza con System.out . Si bien es demasiado complicado de explicar
en detalle en este momento, brevemente, el sistema es una clase predefinida que proporciona
acceso al sistema, y afuera está el flujo de salida que está conectado a la consola.Como
probablemente haya adivinado, la salida de consola (y la entrada) no se usa con frecuencia en
la mayoría de las aplicaciones Java del mundo real. Dado que la mayoría de los entornos
informáticos modernos son de naturaleza gráfica, la E / S de la consola se utiliza
principalmente para programas de utilidad simples, programas de demostración y código del
lado del servidor. Más adelante en este libro, aprenderá otras formas de generar resultados
utilizando Java. Pero por ahora, continuaremos usando los métodos de E / S de la
consola.Observe que la instrucción println () termina con un punto y coma. Muchas
declaraciones en Java terminan con un punto y coma. Como verá, el punto y coma es una
parte importante de la sintaxis de Java.El primer} en el programa finaliza main () , y el último}
finaliza la definición de la clase Ejemplo .Un segundo programa cortoQuizás ningún otro
concepto sea más fundamental para un lenguaje de programación que el de una variable.
Como usted puede saber, una variable es una ubicación de memoria con nombre que su
programa puede asignar un valor. El valor de una variable se puede cambiar durante la
ejecución del programa. El siguiente programa muestra cómo se declara una variable y cómo
se le asigna un valor. El programa también ilustra algunos aspectos nuevos de la salida de la
consola. Como los comentarios en la parte superior del estado del programa, debe llamar a
este archivo Example2.java .Cuando ejecute este programa, verá la siguiente salida:This is
num: 100The value of num * 2 is 200Echemos un vistazo de cerca por qué se genera esta
salida. La primera nueva línea en el programa se muestra aquí:int num; // this declares a
variable called numEsta línea declara una variable entera llamada num . Java (como la mayoría
de los otros lenguajes) requiere que las variables se declaren antes de ser utilizadas.A
continuación se presenta la forma general de una declaración de variable:escriba var-
name;Aquí, el tipo especifica el tipo de variable que se está declarando, y var-name es el
nombre de la variable. Si desea declarar más de una variable del tipo especificado, puede usar
una lista de nombres de variables separados por comas. Java define varios tipos de datos,
incluidos enteros, caracteres y puntos flotantes. La palabra clave int especifica un tipo
entero.En el programa, la línea.num = 100; // this assigns num the value 100asigna a num el
valor 100. En Java, el operador de asignación es un único signo igual.La siguiente línea de
código genera el valor de num precedido por la cadena "This is num:".System.out.println("This
is num: " + num);En esta declaración, el signo más hace que el valor de num se agregue a la
cadena que lo precede, y luego se genera la cadena resultante. (En realidad, num se convierte
primero de un número entero a su cadena equivalente y luego se concatena con la cadena que
lo precede. Este proceso se describe detalladamente más adelante en este libro). Este enfoque
puede generalizarse. Con el operador +, puede unir todos los elementos que desee dentro de
una sola declaración println () .La siguiente línea de código asigna num el valor de num veces 2.
Como la mayoría de los otros idiomas, Java usa el operador * para indicar la multiplicación.
Después de que esta línea se ejecute, num contendrá el valor 200.Aquí están las siguientes dos
líneas en el programa:System.out.print ("The value of num * 2 is ");System.out.println
(num);Varias cosas nuevas están ocurriendo aquí. Primero, el método incorporado print () se
usa para mostrar la cadena "El valor de num * 2 es". Esta cadena no es seguida por una nueva
línea. Esto significa que cuando se genere la siguiente salida, comenzará en la misma línea. El
método print () es como println () , excepto que no genera un carácter de nueva línea después
de cada llamada. Ahora mira la llamada a println () . Tenga en cuenta que num se utiliza por sí
mismo. Tanto print () como println () se pueden usar para generar valores de cualquiera de los
tipos incorporados de Java.Dos declaraciones de controlAunque el Capítulo 5 examinará
detenidamente las declaraciones de control, dos se presentan brevemente aquí para que
puedan usarse en programas de ejemplo en los Capítulos 3 y 4 . También ayudarán a ilustrar
un aspecto importante de Java: los bloques de código.La declaración ifLa sentencia if de Java
funciona de manera muy similar a la sentencia IF en cualquier otro idioma. Determina el flujo
de ejecución en función de si alguna condición es verdadera o falsa. Su forma más simple se
muestra aquí:sentencia if (condición);Aquí, la condición es una expresión booleana. (Una
expresión booleana es aquella que se evalúa como verdadera o falsa). Si la condición es
verdadera, entonces se ejecuta la instrucción. Si la condición es falsa, entonces se omite la
instrucción. Aquí hay un ejemplo:if(num < 100) System.out.println("num is less than 100");En
este caso, si num contiene un valor que es menor que 100, la expresión condicional es
verdadera y se ejecutará println () . Si num contiene un valor mayor o igual a 100, entonces se
omite el método println () .Como verá en el Capítulo 4 , Java define un complemento completo
de operadores relacionales que pueden usarse en una expresión condicional. Aquí hay
algunos:Observe que la prueba de igualdad es el doble signo igual.Aquí hay un programa que
ilustra la sentencia if :La salida generada por este programa se muestra aquí:x is less than yx
now equal to yx now greater than yNote otra cosa en este programa. La líneaint x, y;declara
dos variables, x e y , mediante el uso de una lista separada por comas.El bucle forLas
declaraciones de bucle son una parte importante de casi cualquier lenguaje de programación
porque proporcionan una manera de ejecutar varias tareas repetidamente. Como verá en el
Capítulo 5 , Java proporciona una gran variedad de construcciones de bucles. Quizás el más
versátil sea el bucle for . La forma más simple del bucle for se muestra aquí:para (inicialización;
condición; iteración) declaración;En su forma más común, la parte de inicialización del bucle
establece una variable de control de bucle en un valor inicial. La condición es una expresión
booleana que prueba la variable de control de bucle. Si el resultado de esa prueba es
verdadero, la instrucción se ejecuta y el bucle for continúa iterando. Si es falso, el bucle
termina. La expresión de iteración determina cómo se cambia la variable de control de bucle
cada vez que el bucle se itera. Aquí hay un programa corto que ilustra el bucle for :Este
programa genera la siguiente salida:This is x: 0This is x: 1This is x: 2This is x: 3 This is x: 4This is
x: 5This is x: 6This is x: 7This is x: 8This is x: 9En este ejemplo, x es la variable de control de
bucle. Se inicializa a cero en la parte de inicialización de for . Al comienzo de cada iteración
(incluida la primera), se realiza la prueba condicional x <10 . Si el resultado de esta prueba es
verdadero, se ejecuta la instrucción println () y luego se ejecuta la parte de iteración del bucle,
que aumenta x en 1. Este proceso continúa hasta que la prueba condicional es falsa.Como
punto de interés, en los programas Java escritos profesionalmente, casi nunca verá la parte de
iteración del bucle escrito como se muestra en el programa anterior. Es decir, rara vez verá
declaraciones como esta:x = x + 1;La razón es que Java incluye un operador de incremento
especial que realiza esta operación de manera más eficiente. El operador de incremento es ++.
(Es decir, dos signos más uno detrás del otro). El operador de incremento incrementa su
operando en uno. Mediante el uso del operador de incremento, la instrucción anterior puede
escribirse así:x++;Por lo tanto, el for en el programa anterior se escribirá así:for(x = 0; x<10;
x++)Es posible que desee probar esto. Como verá, el bucle sigue funcionando exactamente
igual que antes.Java también proporciona un operador de decremento, que se especifica como
- -. Este operador disminuye su operando en uno.Uso de bloques de códigoJava permite que
dos o más declaraciones se agrupen en bloques de código , también llamados bloques de
código . Esto se hace adjuntando las declaraciones entre abrir y cerrar llaves. Una vez que se
ha creado un bloque de código, se convierte en una unidad lógica que se puede usar en
cualquier lugar en el que se pueda usar una sola declaración. Por ejemplo, un bloque puede
ser un objetivo para las declaraciones if y for de Java . Considere esto si la declaración:Aquí, si x
es menor que y , entonces se ejecutarán ambas sentencias dentro del bloque. Por lo tanto, las
dos declaraciones dentro del bloque forman una unidad lógica, y una declaración no puede
ejecutarse sin que la otra también se ejecute. El punto clave aquí es que siempre que necesite
vincular lógicamente dos o más declaraciones, lo hace creando un bloque.Veamos otro
ejemplo. El siguiente programa utiliza un bloque de código como objetivo de un bucle for .La
salida generada por este programa se muestra aquí:This is x: 0This is y: 20This is x: 1This is y:
18This is x: 2This is y: 16This is x: 3This is y: 14This is x: 4This is y: 12This is x: 5This is y: 10This
is x: 6This is y: 8This is x: 7This is y: 6This is x: 8This is y: 4This is x: 9This is y: 2En este caso, el
objetivo del bucle for es un bloque de código y no solo una declaración. Por lo tanto, cada vez
que el bucle se repita, se ejecutarán las tres sentencias dentro del bloque. Este hecho es, por
supuesto, evidenciado por la salida generada por el programa.Como verá más adelante en este
libro, los bloques de código tienen propiedades y usos adicionales. Sin embargo, la razón
principal de su existencia es crear unidades de código lógicamente inseparables.Problemas
léxicosAhora que ha visto varios programas Java cortos, es hora de describir más formalmente
los elementos atómicos de Java. Los programas Java son una colección de espacios en blanco,
identificadores, literales, comentarios, operadores, separadores y palabras clave. Los
operadores se describen en el siguiente capítulo. Los otros se describen a continuación.Espacio
en blancoJava es un lenguaje de forma libre. Esto significa que no es necesario seguir ninguna
regla de sangría especial. Por ejemplo, el programa de Ejemplo podría haber sido escrito todo
en una línea o en cualquier otra forma extraña que tuvieras ganas de escribirlo, siempre y
cuando hubiera al menos un carácter de espacio en blanco entre cada token que no estuviera
delineado por un operador o separador. En Java, los espacios en blanco incluyen un espacio,
una pestaña, una nueva línea o un feed de formularios.IdentificadoresLos identificadores se
utilizan para nombrar cosas, como clases, variables y métodos. Un identificador puede ser
cualquier secuencia descriptiva de mayúsculas y minúsculas, números o los caracteres de
subrayado y signo de dólar. (El carácter de signo de dólar no está diseñado para uso general).
No deben comenzar con un número, para que no se confundan con un literal numérico. Una
vez más, Java distingue entre mayúsculas y minúsculas, por lo que VALUE es un identificador
diferente a Value . Algunos ejemplos de identificadores válidos sonLos nombres de
identificadores no válidos incluyen estos:NOTA A partir de JDK 9, el guión bajo no se puede
usar como un identificador.LiteralesSe crea un valor constante en Java utilizando una
representación literal de él. Por ejemplo, aquí hay algunos literales:De izquierda a derecha, el
primer literal especifica un entero, el siguiente es un valor de punto flotante, el tercero es una
constante de caracteres y el último es una cadena. Un literal se puede utilizar en cualquier
lugar donde se permita un valor de su tipo.ComentariosComo se mencionó, hay tres tipos de
comentarios definidos por Java. Ya has visto dos: una línea y multilínea. El tercer tipo se llama
un comentario de documentación . Este tipo de comentario se usa para producir un archivo
HTML que documenta su programa. La documentaciónel comentario comienza con un / ** y
termina con un * /. Los comentarios de documentación se explican en el Apéndice A
.SeparadoresEn Java, hay algunos caracteres que se utilizan como separadores. El separador
más utilizado en Java es el punto y coma. Como ha visto, a menudo se utiliza para terminar
declaraciones. Los separadores se muestran en la siguiente tabla:Las palabras clave de
JavaActualmente hay 61 palabras clave definidas en el lenguaje Java (consulte la Tabla 2-1 ).
Estas palabras clave, combinadas con la sintaxis de los operadores y los separadores, forman la
basedel lenguaje java. En general, estas palabras clave no se pueden usar como
identificadores, lo que significa que no se pueden usar como nombres para una variable, clase
o método. Las excepciones a esta regla son las palabras clave sensibles al contexto agregadas
por JDK 9 a los módulos de soporte. (Consulte el Capítulo 16 para obtener más información).
Además, a partir del JDK 9, un guión bajo en sí mismo se considera una palabra clave para
evitar su uso como el nombre de algo en su programa.Tabla 2-1 Palabras clave de JavaLas
palabras clave const y goto están reservadas pero no se utilizan. En los primeros días de Java,
varias otras palabras clave estaban reservadas para un posible uso futuro. Sin embargo, la
especificación actual para Java solo define las palabras clave que se muestran en la Tabla 2-1
.Además de las palabras clave, Java se reserva otros cuatro nombres. Tres han sido parte de
Java desde el principio: verdadero , falso y nulo . Estos son valores definidos por Java. No
puede usar estas palabras para los nombres de variables, clases, etc. A partir de JDK 10, la
palabra var se ha agregado como un nombre de tipo reservado y sensible al contexto. (Vea el
Capítulo 3 para más detalles sobre var .)Las bibliotecas de clases de JavaLos programas de
ejemplo que se muestran en este capítulo hacen uso de dos de los métodos incorporados de
Java: println () e print () . Como se mencionó, estos métodos están disponibles a través de
System.out.Systemes una clase predefinida por Java que se incluye automáticamente en sus
programas. En una vista más amplia, el entorno Java se basa en varias bibliotecas de clases
integradas que contienen muchos métodos integrados que brindan soporte para cosas como E
/ S, manejo de cadenas, redes y gráficos. Las clases estándar también proporcionan soporte
para una interfaz gráfica de usuario (GUI). Por lo tanto, Java como una totalidad es una
combinación del lenguaje Java en sí, más sus clases estándar. Como verá, las bibliotecas de
clases proporcionan gran parte de la funcionalidad que viene con Java. De hecho, parte de
convertirse en un programador de Java es aprender a usar las clases estándar de Java. A lo
largo de la Parte I de este libro, se describen varios elementos de las clases y métodos de la
biblioteca estándar según sea necesario. En la parte II, varias bibliotecas de clases se describen
en detalle.