Bienvenidos a otro capítulo de este Curso Gratis de Java para Hackers – Sintaxis Avanzada de Java en 2024. Comparte este articulo y síguenos para recibir más capítulos, guías y cursos gratis.
Este curso está en constante actualización. Tendrá revisiones y actualizaciones anuales y correcciones y mejoras mensuales. Este curso está en un ciclo de crecimiento y mejora constante, agradecemos su apoyo difundiendo, compartiendo, comentando o simplemente leyéndolo.
¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?
Hábitos de programación
Proporcionando acceso a variables de instancia y de clase
No hacer nínguna variable de instancia o clase pública sin una buena razón. A menudo las variables de instancia no necesitan ser asignadas/consultadas explícitamente, a menudo esto sucede como efecto lateral de llamadas a métodos. Un ejemplo apropiado de una variable de instancia pública es el caso en que la clase es esencialemente una estructura de datos, sin comportamiento. En otras palabras, si usarías la palabra struct en lugar de una clase (si Java soportara struct), entonces es adecuado hacer las variables de instancia públicas.
Referencias a variables y métodos de clase
Evitar usar un objeto para acceder a una variable o método de clase (static). Usar el nombre de la clase en su lugar. Por ejemplo:
metodoDeClase(); //OK
UnaClase.metodoDeClase(); //OK
unObjeto.metodoDeClase(); //EVITAR!
Constantes
Las constantes numéricas (literales) no se deben codificar directamente, excepto -1, 0, y 1, que pueden aparecer en un bucle for como contadores.
Asignaciones de variables
Evitar asignar el mismo valor a varias varibles en la misma sentencia. Es difícil de leer. Ejemplo:
fooBar.fChar = barFoo.lchar = ‘c’; // EVITAR!
No usar el operador de asignación en un lugar donde se pueda confundir con el de igualdad.
Ejemplo:
if (c++ = d++) { // EVITAR! (Java lo rechaza)
…
}
se debe escribir:
if ((c++ = d++) != 0) {
…
}
No usar asignación embebidas como un intento de mejorar el rendimient en tiempo de ejecución. Ese es el trabajo del compilador. Ejemplo:
d = (a = b + c) + r; // EVITAR!
se debe escribir:
a = b + c;
d = a + r;
Paréntesis
En general es una buena idea usar paréntesis en expresiones que implican distintos operadores para evitar problemas con el orden de precedencia de los operadores. Incluso si parece claro el orden de precedencia de los operadores, podría no ser así para otros, no se debe asumir que otros programadores conozcan el orden de precedencia.
if (a == b && c == d) // EVITAR!
if ((a == b) && (c == d)) // CORRECTO
Valores de retorno
Intentar hacer que la estructura del programa se ajuste a su intención. Ejemplo:
if (expresionBooleana) {
return true;
} else {
return false;
}
en su lugar se debe escribir
return expressionBooleana;
Similarmente,
if (condicion) {
return x;
}
return y;
se debe escribir:
return (condicion ? x : y);
Expresiones antes de `?’ en el operador condicional
Si una expresión contiene un operador binario antes de ? en el operador ternario ?: , se debe colocar entre paréntesis. Ejemplo:
(x >= 0) ? x : -x;
Operadores
P | A | Operador | Operando(s) | Operación |
15 | I | . [ ] ( args ) ++, – – | Objeto, método (miembro) Array (indice) Método, lista de argumentos variable | Acceso a un miembro del objeto Acceso a un elemento de un array Llamada a un método Post incremento, post decremento |
14 | D | ++,- – +,- ~! | Variable Número Entero Booleano | Pre incremento, Pre decremento Cambio de signo (-) Complemento a nivel de bit NOT booleano |
13 | D | new ( type ) | Clase, lista de argumentos Tipo, cualquier tipo | Creación de objetos Cast (conversión de tipos) |
12 | I | * ,/, % | Número, número | Multplicación, división, módulo. Válido tb para fp |
11 | I | +,- + | Numero, número String, cualquiera | Suma, resta Concatenación de cadenas |
10 | I | << >> >>> | Entero, entero Entero, entero Entero, entero | Desplazamiento a izquierda Desplazamiento a derecha con signo Desplazamiento a derecha con ceros |
9 | I | <, <= >, >= instance of | Número, Número Número, Número Referencia, tipo | Menor que, menor igual que Mayor que, mayor igual que Comparación de tipo |
8 | I | == != == != | Primitiva , primitiva Primitiva , primitiva Referencia, referencia Referencia, referencia | Igual (tiene el mismo valor) No igual ( diferente valor) Igual (mismo objeto) No igual ( diferente objeto) |
7 | I | & & | Entero, entero Booleano, booleano | And booleano a nivel de bits And Booleano |
6 | I | ^ ^ | Entero, Entero Booleano, Booleano | XOR booleano a nivel de bits XOR Booleano |
5 | I | | | | Entero, Entero Booleano, Booleano | OR booleano a nivel de bits OR Booleano |
4 | I | && | Booleano, Booleano | AND Condicional |
3 | I | || | Booleano, Booleano | OR Condicional |
2 | D | ?: | Booleano, otro, otro | Operador condicional (if) |
1 | D | = *=,/=,%= +=,-= ,<<=,>>= >>>=, &=,^=,|= | Variable, otro | Asignación con operación |
Elementos
Elemento | Objetivo | Sintaxis |
Asignación | Evaluación de una expresión y almacenamiento del valor obtenido como resultado | var = expr; expr++; |
Llamada | Llamada a un método | method(); |
Instanciación | Creación de un objeto | new Type( ) |
Secuencia | Grupo de instrucciones | { instrucciones } |
Vacía | No hacer nada | ; |
Etiqueta | Etiquetado de una instrucción | etiqueta: instrucción |
Variable | Declaración de una variable | [final] tipo nombre [=valor] [, nombre [=valor]]…; |
if | Condicional | if (expr) instrucción [else instrucción] |
switch | Condicional | switch (expr) { [case expr : instrucciones ]… [default : instrucciones] } |
while | Bucle | while (expr) instrucción |
do | Bucle | do instrucción while (expr); |
for | Bucle | for (init; test; increment) instrucción |
break | Salir de un bloque | break [etiqueta] ; |
continue | Reiniciar un bucle | continue [etiqueta]; |
return | Resultado de un método | return [expr]; |
synchronized | Sección crítica | synchronized (expr) {instrucciones} |
throw | Lanzamiento de excepciones | throw expr; |
try | Manejo de excepciones | try {instrucciones} [catch (tipo) {instrucciones}]… [finally {instrucciones}] |
Primer programa Java
Veamos un código simple que imprimirá las palabras Hola Mundo .
Ejemplo
public class MyFirstJavaProgram {
/* Este es mi primer programa en Java
* Este programa imprimirá “Happy Hacker”
*/
public static void main(String []args) {
System.out.println(“Happy Hacker”);
}
}
Veamos cómo guardar el archivo, compilar y ejecutar el programa. Siga los pasos siguientes:
- Abra el bloc de notas y agregue el código como se indica arriba.
- Guarde el archivo como: MyFirstJavaProgram.java.
- Abra una ventana del símbolo del sistema y vaya al directorio donde guardó la clase. Supongamos que es C:\.
- Escriba ‘javac MyFirstJavaProgram.java’ y presione Intro para compilar su código. Si no hay errores en su código, el símbolo del sistema lo llevará a la siguiente línea (Supuesto: la variable de ruta está configurada).
- Ahora, escriba ‘java MyFirstJavaProgram’ para ejecutar su programa.
- Podrás ver ‘Hola mundo’ impreso en la ventana.
Producción
C:\> javac MyFirstJavaProgram.java
C:\> java MyFirstJavaProgram
Happy Hacker
Modificadores de Java
Al igual que otros lenguajes, es posible modificar clases, métodos, etc. mediante el uso de modificadores. Hay dos categorías de modificadores:
- Modificadores de acceso : predeterminado, público, protegido, privado
- Modificadores sin acceso : final, abstracto, estrictofp
Analizaremos más detalles sobre los modificadores en la siguiente sección.
Variables Java
Los siguientes son los tipos de variables en Java:
- Variables locales
- Variables de clase (variables estáticas)
- Variables de instancia (variables no estáticas)
Matrices Java
Las matrices son objetos que almacenan múltiples variables del mismo tipo. Sin embargo, una matriz en sí misma es un objeto en el montón. Analizaremos cómo declarar, construir e inicializar en los próximos capítulos.
Enumeraciones de Java
Las enumeraciones se introdujeron en Java 5.0. Las enumeraciones restringen una variable para que tenga uno de unos pocos valores predefinidos. Los valores de esta lista enumerada se denominan enumeraciones.
Con el uso de enumeraciones es posible reducir la cantidad de errores en su código.
Por ejemplo, si consideramos una aplicación para una tienda de jugos frescos, sería posible restringir el tamaño del vaso a pequeño, mediano y grande. Esto aseguraría que nadie pueda pedir ningún tamaño que no sea pequeño, mediano o grande.
Ejemplo
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String args[]) {
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
System.out.println(“Size: ” + juice.size);
}
}
Producción
El ejemplo anterior producirá el siguiente resultado:
Size: MEDIUM
Nota : las enumeraciones se pueden declarar como propias o dentro de una clase. También se pueden definir métodos, variables y constructores dentro de enumeraciones.
Usando líneas en blanco
Una línea que contiene sólo espacios en blanco, posiblemente con un comentario, se conoce como línea en blanco y Java la ignora por completo.
Herencia
En Java, las clases se pueden derivar de clases. Básicamente, si necesita crear una nueva clase y aquí ya hay una clase que tiene parte del código que necesita, entonces es posible derivar su nueva clase a partir del código ya existente.
Este concepto le permite reutilizar los campos y métodos de la clase existente sin tener que reescribir el código en una nueva clase. En este escenario, la clase existente se denomina superclase y la clase derivada se denomina subclase .
Interfaces
En lenguaje Java, una interfaz se puede definir como un contrato entre objetos sobre cómo comunicarse entre sí. Las interfaces juegan un papel vital cuando se trata del concepto de herencia.
Una interfaz define los métodos que debe utilizar una clase derivada (subclase). Pero la implementación de los métodos depende totalmente de la subclase.
SINTAXIS Y CÓDIGO EJEMPLO DE USO DEL MÉTODO MAIN
la clase con el método main podría tratarse como una clase más y el método main como un método más. Nosotros preferiremos diferenciarlo por motivos didácticos. La sintaxis que emplearemos para el método main será la siguiente:
public static void main (String [ ] args) {
//Aquí las instrucciones del método
}
la clase con el método main es especial porque podemos invocar al método main sin necesidad de crear antes un objeto de la clase. En las clases “normales” no podemos invocar ningún método si no hemos creado un objeto previamente.
Cuando creamos un programa para chequear el funcionamiento de otras clases a modo de prueba es frecuente ponerle como nombre TestNombreDelPrograma.
vamos a suponer que vamos a trabajar con el código de las clases Deposito y GrupoDepositos, por lo que vamos a llamar a la clase del programa principal TestDeposito. Para empezar, creamos una clase y escribimos esto:
// Clase principal iniciadora del programa ejemplo aprenderaprogramar.com
public class TestDeposito {
public static void main (String [ ] args) {
//Aquí las instrucciones de inicio y control del programa
System.out.println (“Empezamos la ejecución del programa”);
} //Cierre del main
} //Cierre de la clase
¿Qué diferencia a la clase iniciadora de otras clases? En primer lugar que contiene el método main y este es ejecutable sin necesidad de crear un objeto. En BlueJ lo visualizamos así:
Mientras que con Deposito, que es una clase “normal”, únicamente podemos invocar a los constructores de la clase para crear objetos, en TestDeposito podemos invocar al método main que dará lugar a la ejecución del código contenido en el mismo.
Ejecuta el código de la clase con método main que hemos escrito anteriormente y comprueba que obtienes el resultado esperado (que se muestre por pantalla un mensaje).
Sintaxis con BlueJ
BlueJ es una herramienta para escribir, compilar y ejecutar programas.
BlueJ nos permitirá crear diferentes tipos de programa. Comenzaremos por crear “clases”. Para grabar las clases en el sistema operativo utilizaremos la extensión .java. Cuando se las compilan y no tienen error se crean los archivos “.Class” que serán los que la máquina virtual “java.exe” ejecute.
El estilo de escritura de programas en Java es CamelCase que permite escribir nombres de identificadores legibles y lo más breve posible. Una clase se inicia con la(s) línea(s) import si es que se va a usar en la clase algún componente de otra clase o paquete externo al proyecto.
importjava.util.Scanner;
Sigue la declaración de la clase, indicando que es pública para ser accedida por otras clases de otra aplicación.
importjava.util.Scanner;
public class ComparaEnteros {
Siguen las declaraciones de los atributos y de los métodos, en este caso sigue la declaración de un método particular, “main” que es el punto de inicio de una aplicación.
importjava.util.Scanner;
public class ComparaEnteros {
public static void main(String [ ] args) {
Se han abierto dos llaves, una para la clase y otra para el primer método, si hubiera otro método, se debe cerrar una y declarar el nuevo método. Al final debe cerrarse la clase.
importjava.util.Scanner;
public class ComparaEnteros {
public static void main(String [ ] args) {
/* todo lo que contiene main */
} //cerramos main
public static void otroMetodo(String [ ] args) {
/* todo lo que contiene otroMetodo */
} //cerramos otroMetodo
} //final de la clase ComparaEnteros
Estructura secuencial
Scanner entrada = new Scanner(System.in);
int numerol, numer02;
System.out.print(“Escriba el primer entero: ‘l);
numer02 = Entrada.nextlnt();
Estructura repetitiva
while (contadorEstudiantes <= 1 0)
System.out.print(“Escriba el resultado
Resultado= entrada.nextlnt();
Estructura de bifurcación
if (resultado = 1)
aprobados = aprobados + 1;
else
reprobados = reprobados + 1;
Instrucciones y estructuras de control
Una instrucción de código, o sentencia, es una orden que se le da al procesador. La orden puede ser ejecutar un método, realizar una suma, guardar un dato en memoria, etc.
En el ejemplo anterior, había líneas de código que no terminaban con punto y coma “;”, y esto es básicamente porque no son instrucciones de código sino que son estructuras de control.
Una estructura de control determina la secuencia y el orden de ejecución de las instrucciones de código de un programa.
Estos, por lo general (hablando particularmente de Java) llevan al final una llave de apertura “{“, para indicar el código a ejecutar en el caso de cumplir con la estructura de control, y una llave de cierre “}” para indicar el fin de la estructura.
En base a esto podemos ver ahora, a nuestro simple código que muestra un simple mensaje por consola, con otros ojos.
Un detalle que no quiero dejar pasar es el de como se escribe un método. Aprovechando que se habló de convenciones de escritura y de métodos, la regla para escribir un método es la siguiente:
La primera palabra que conforma al nombre de un método se escribe en su totalidad en minúscula. Si el método contiene dos o más palabras, a partir de la segunda palabra, cada una de estas se escribirá con su primer letra en mayúscula.
En otro aspecto sigue las mismas reglas que al escribir el nombre de una clase, el cual debe comenzar con una letra, no puede comenzar con un número, no puede contener espacios y tampoco caracteres especiales.
Además de todo esto, ya que un método es una acción a realizar, se debe poner como nombre un verbo que sea descriptivo de la acción que realiza ese método.
Por ejemplo, nombres de métodos bien escritos son:
mostrarMensaje();
realizarOperacion();
dibujarGrafico();
Nombres de métodos mal escritos que producirán error son:
reproducir musica();
CalcularRA!zCuadrada?();
1determinaraltura();
Nombre de métodos que no producirán error pero que no siguen las convenciones de escritura son:
pedroSanchez();
ajustarcontenido();
RealizarAccion();
Por último voy a preguntar: ¿han notado que todo este tiempo hablamos de métodos como por ejemplo println, printf y print, pero que en realidad cuando se quiere llamar al método println, por nombrar a uno de ellos se debe anteponer System.out. ?
Dejaremos la respuesta para otra entrega del curso ya que por el momento tienen bastante información para procesar después de analizar un montón de cosas por un simple mensaje que se muestra en la consola de Java.
En la próxima entrega veremos como personalizar la apariencia de Eclipse para que empecemos a prepararnos para pasar largas horas programando frente a la pantalla de la computadora.
Cuando consideramos un programa Java, se puede definir como una colección de objetos que se comunican invocando los métodos de cada uno. Veamos ahora brevemente qué significan clases, objetos, métodos y variables de instancia.
- Objeto : los objetos tienen estados y comportamientos. Ejemplo: un perro tiene estados: color, nombre, raza y comportamiento como mover la cola, ladrar y comer. Un objeto es una instancia de una clase.
- Clase : una clase se puede definir como una plantilla/modelo que describe el comportamiento/estado que admite el objeto de su tipo.
- Métodos : un método es básicamente un comportamiento. Una clase puede contener muchos métodos. Es en los métodos donde se escriben las lógicas, se manipulan los datos y se ejecutan todas las acciones.
- Variables de instancia : cada objeto tiene su conjunto único de variables de instancia. El estado de un objeto es creado por los valores asignados a estas variables de instancia.
Nombres de ficheros
Esta sección lista las extensiones más comunes usadas y los nombres de ficheros.
Extensiones de los ficheros
El software Java usa las siguientes extensiones para los ficheros:
Tipo de fichero | Extensión |
Fuente Java | .java |
Bytecode de Java | .class |
Nombres de ficheros comúnes
Los nombres de ficheros más utilizados incluyen:
Nombre de fichero | Uso |
GNUmakefile | El nombre preferido para ficheros “make”. Usamos gnumake para construir nuestro software. |
README | El nombre preferido para el fichero que resume los contenidos de un directorio particular. |
Organización de los ficheros
Un fichero consiste de secciones que deben estar separadas por líneas en blanco y comentarios opcionales que identifican cada sección. Los ficheros de más de 2000 líneas son incómodos y deben ser evitados.
Ficheros fuente Java
Cada fichero fuente Java contiene una única clase o interface pública. Cuando algunas clases o interfaces privadas estan asociadas a una clase pública, pueden ponerse en el mismo fichero que la clase pública. La clase o interfaz pública debe ser la primera clase o interface del fichero.
Los ficheros fuentes Java tienen la siguiente ordenación:
- Comentarios de comienzo
- Sentencias package e import
- Declaraciones de clases e interfaces
Sentencias package e import
La primera línea no-comentario de los ficheros fuente Java es la sentencia package. Después de esta, pueden seguir varias sentencias import. Por ejemplo:
package java.awt;
import java.awt.peer.CanvasPeer;
El primer componente del nombre de un paquete único se escribe siempre en minúsculas con caracteres ASCII y debe ser uno de los nombres de dominio de último nivel actualmente com, edu, gov, mil, net, org, o uno de los códigos ingleses de dos letras que especifican el pais.
Declaraciones de clases e interfaces
La siguiente tabla describe las partes de la declaración de una clase o interface, en el orden en que deberian aparecer.
Partes de la declaración de una clase o interface | Notas | |
1 | Comentario de documentación de la clase o interface (/**…*/) | Ver “Comentarios de documentación” en la página 14 para más información sobre lo que debe aparecer en este comentario. |
2 | Sentencia class o interface | |
3 | Comentario de implementación de la clase o interface si fuera necesario (/*…*/) | Este comentario debe contener cualquier información aplicable a toda la clase o interface que no era apropiada para estar en los comentarios de documentación de la clase o interface. |
4 | Variables de clase (static) | Primero las variables de clase public, después las protected, después las de nivel de paquete (sin modificador de acceso) , y despúes las private. |
5 | Variables de instancia | Primero las public, después las protected, después las de nivel de paquete (sin modificador de acceso), y después las private. |
6 | Constructores | |
7 | Métodos | Estos métodos se deben agrupar por funcionalidad más que por visión o accesibilidad. Por ejemplo, un método de clase privado puede estar entre dos métodos públicos de instancia. El objetivo es hacer el código mas legible y comprensible. |
Gestión de memoria en Java
Para que un programa pueda ejecutarse en un sistema operativo, es necesario que exista una interfaz (linker), que se encargue de suministrar al programa un bloque de memoria sobre el cual se vaya a ejecutar.
Un óptimo manejo de la misma hará que un programa pueda ser más o menos eficaz cuando se ejecute. Es por ello que cada lenguaje utiliza algún sistema para gestionar la misma, y por lo general, es el programador quien debe estar atento de realizar esta gestión para no sobrecargar la misma.
Uno de los aspectos o características que incorporó el lenguaje Java es la gestión dinámica de memoria, en donde, desliga completamente al programador de esta tarea, administrando la memoria automáticamente.
Pero que Java desligue al programador en tareas de gestión de memoria, no significa que el mismo no deba conocer el funcionamiento de ésta gestión, ya que éstos conocimientos son útiles para la mejor comprensión de otros temas relacionados con la programación Orientada a Objetos.
Java trabaja con tres zonas de memoria: la zona de datos, La pila (stack) y el montículo (heap).
La zona de datos
En esta zona de memoria se guarda las instrucciones del programa ejecutable en código de máquina, las constantes, el código correspondiente a los métodos, y a las clases. esta zona de memoria es fija, y no variará a lo largo de la ejecución del programa.
El tamaño de ésta zona en memoria se establece en tiempo de compilación, por lo cual al compilador le es necesario saber de antemano el tamaño de cada elemento que vaya a guardar, asegurándose de que éstos no cambien en tiempo de ejecución
La pila (stack)
Con el surgimiento de lenguajes con estructura de bloques, surgió la necesidad de un manejo de memoria más flexible y eficiente, de manera que ésta pueda atender las necesidades en cuanto a demanda de memoria durante la ejecución del programa.
La pila funciona de manera en que lo primero que se guarda en ella será lo último en ser eliminado, y lo último que se guarda será lo primero en ser eliminado. Para entender el concepto se utiliza el acrónimo LIFO (last in first out), que hace referencia a lo explicado.
La analogía más común en este tema refiere al de una pila de platos. Para sacar platos se hará partiendo del primero, que fue el último en ser colocado en la pila, hasta el último, que fue el primero en ser colocado en la pila.
La pila cuenta con una cantidad limitada de memoria, y en ella se guardan variables locales, variables de referencia, parámetros y valores de retorno, resultados parciales, y el control de la invocación y retorno de métodos.
El montículo (heap)
El montículo o heap, a diferencia de la pila, es un espacio de memoria dinámico en donde se guardarán variables de instancia y objetos.
El encargado de administrar este espacio de memoria es el Garbage Collector o recolector de basura, que libera al programador de estas tareas, a diferencia de lenguajes como C, en donde ésta gestión la realizaba el programador.
Atributos
Se habla de atributos de una clase, y en un lenguaje de programación Orientado a Objetos refieren a espacios de memoria donde se pueden almacenar datos. En otro tipo de paradigmas como en el estructurado estos atributos son llamados variables.
Los mismos están conformados por un nombre que sirve para identificarlos dentro del programa y pueden estar asociados a un valor.
Así mismo este valor está asociado a un tipo de dato, por lo que un atributo puede ser, por ejemplo, de tipo entero, lo que significa que en el mismo podrán guardarse datos solo de tipo numérico y enteros, o de tipo cadena, en donde se podrán guardar cadenas de caracteres, etc.
Los atributos pueden ser de longitud fija o variable. En el caso de atributos de longitud fija, se definen indicándole la cantidad de datos que pueden almacenar, y ésta cantidad no variará a lo largo de la ejecución del programa.
Un ejemplo de atributos de longitud fija pueden ser los arreglos de datos (array). De la misma manera existen atributos de longitud variable, en donde como lo indica su definición, la cantidad de datos que pueden almacenar puede variar en la ejecución del programa.
Un ejemplo de estos tipos de atributos son las colecciones de datos.
Estructura general de un programa
Todo programa tiene una estructura básica que se debe conocer, y en el caso de Java presenta elementos que tienen que ver con la programación orientada a objetos, tema que se irá desarrollando de a poco.
Para explicar esta estructura se utilizará el ejemplo “Hola mundo”, ya visto en el primer capítulo.
// HolaMundo.java
// Programa para imprimir texto por pantalla
public class Principal {
// El método main comienza la ejecución de la aplicación
public static void main(String[] args) {
System.out.println(“Hola mundo”);
}// Fin del método main
} // Fin de la clase Principal
En Java un programa está conformado por clases, por lo tanto, siempre que se programe, se estará programando sobre una clase. Ésta hay que definirla, y para hacerlo se debe escribir la palabra clave class, seguida del nombre de la clase. Luego se debe escribir una llave de apertura { y una llave de cierre }, y todos el código de la clase irá dentro de estas llaves. En el ejemplo se observa la clase Principal definida, y dentro de ella un método con código.
public class Principal {
…
}
En primera instancia se trabajará anteponiendo la palabra clave public en la definición de una clase, para no crear restricciones que puedan interferir con el funcionamiento del programa, más adelante se desarrollara el tema pertinente a esta palabra clave.
Luego de definir la clase, se debe escribir el código con el cual se trabajará. En la clase principal de todo programa que se cree, siempre debe existir el método main.
Éste método es el primero que Java invocará al iniciar la ejecución del programa, luego de esto, podrán ser invocados otros métodos, según el programador lo defina. Debe tenerse en cuenta que el método main se debe definir solo una vez en un programa.
Ejemplo
Para definir el método main se debe poner siempre exactamente esto:
public static void main(String[] args) {
…
}
Con eclipse no hace falta estrictamente escribir todo esto para definir al método main, ya que cuando se crea una nueva clase, existe la opción de marcar una casilla con la leyenda “public static void main (String[] args)” lo cual hará que Eclipse escriba el método automáticamente.
Al igual que en la definición de una clase, se deben colocar las llaves que indicarán el alcance del método, y en donde se deben poner las expresiones que se consideren para darle funcionalidad al programa.
println y scanner
Java puede interaccionar con el usuario, por lo cual el usuario puede ingresar valores o datos al programa, crear archivos para que el mismo los lea, o interaccionar con elementos gráficos, mostrar información al usuario, en forma de texto, archivos o gráficos y así interaccionar con el mismo.
Println
En primer lugar println viene de print line (imprimir línea). Éste método muestra lo que nosotros le indiquemos que debe mostrar, y luego hace un salto de línea, o sea que, cuando vuelvo a hacer otro println, éste último se mostrará en una línea debajo de la anterior.
Para los que conozcan algo del lenguaje C habrán usado la función printf, que viene de print format (imprimir formato), y lo que hace es imprimir por consola una cadena en algún formato que le indiquemos, que también existe en Java.
el método print (imprimir) que sirve para mostrar un mensaje por consola pero a diferencia del primero no hace un salto de línea al final de lo que se muestra, por si escribo otro print, lo que muestre en este último, se hará a continuación del anterior sin ningún salto de línea.
println (así también como print y printf) es un método (también conocido como función para los que han programado en otros paradigmas).
Si bien no hemos visto métodos diremos que es una rutina de código, que recibe algún tipo de dato, que se le indica entre paréntesis, luego de escribir el nombre del método, y que hace algún tipo de operación con el o los datos que le enviamos.
println(“Hola Java”); traducido a nuestro idioma quiere decir que llamamos a una subrutina de código conocido como método, para llamar a este método se indica el nombre del método que se quiere ejecutar, en este caso el método llamado println,
luego entre paréntesis se le pasa algún tipo de dato, en este caso se le pasa una cadena de caracteres, que conforman la frase Hola Java, internamente este método tendrá código de programación para hacer que finalmente el dato que le pase al método, sea mostrado en la consola.
Ejemplo de println
Así como en este caso le hemos pasado una cadena de caracteres para que muestre por consola, también podríamos pasarle un valor numérico para mostrar e incluso una combinación de ambos.
System.out.println(1);
System.out.println(“Hola tengo ” + 20 + ” años de edad”);
Podemos seguir analizando código y ver que, cuando se pasa un valor numérico se hace sin comillas dobles, mientras que cuando se pasa una cadena de caracteres se hace con comillas dobles.
en Java siempre que se este refiriendo a una cadena de caracteres se hará encerrando a la misma entre comillas dobles. Por otro lado, en el segundo ejemplo, se le pasa una combinación de caracteres y números, y para hacer esta combinación se usa el operador de concatenación “+”.
siempre que se termina una instrucción se termina con un punto y coma, En el programa que hicimos para mostrar un mensaje por pantalla no tenía en todas sus líneas un punto y coma al final de cada una de ellas, esto es porque no todas estas líneas son estrictamente instrucciones.
En primera instancia, la forma más primitiva que utiliza Java para la interacción con el usuario es la consola, la cual está ubicada generalmente en la parte inferior del IDE.
Mediante la consola, se podrá mostrar texto, así como también pedir algún valor a un usuario. Para mostrar texto en la consola hay varias formas, dentro de las más utilizadas existen dos:
Ejemplo:
System.out.print(“”); // Sirve para mostrar texto en una sola línea
System.out.println(“”); // Sirve para mostrar texto seguido de un salto
// de línea
Ejemplo del uso de estos métodos:
public class Principal {
public static void main(String[] args) {
System.out.print(“Este es un mensaje
“);
System.out.print(“que se muestra en una sola línea”);
System.out.println(“Mientras este mensaje”);
System.out.println(“se muestra en”);
System.out.println(“varias líneas”);
} // fin del método main
} // fin de la clase Principal
Dentro de los paréntesis se pueden utilizar el operador de concatenación de cadenas, y mostrar valores de otros tipos como enteros, decimales y booleanos. La forma de interaccionar con el usuario, es pidiéndole que ingrese algún valor. Para esto existe la clase Scanner. Para poder utilizar una clase, por lo general, se la debe instanciar generando un objeto de ésta misma, concepto que se explicará más adelante. Para crear un objeto de una clase se debe:
Definir el atributo de instancia
Crear el objeto
Scanner:
Definir un atributo de instancia es parecido a definir un atributo de tipo primitivo, solo que en vez de utilizar los tipos primitivos, se utilizará la clase como tipo, y luego de esto se asignará un nombre que describa al atributo. Para definir el atributo de instancia de la clase Scanner se procede de la siguiente manera:
New
Una vez definido el atributo, se debe crear el objeto, se escribe la palabra clave new seguido del nombre de la clase la cual se debe escribir poniendo paréntesis “()” al final de este, como si se tratara de un método, y dentro de los paréntesis se deberán pasar argumentos, si la clase los requiera. Esto se debe a que, al crear un objeto, se llama al método principal o constructor del mismo, el cual se ejecutará y podrá recibir o no parámetros, según como este programado. Para crear un objeto de Scanner se procede de la siguiente manera:
Como se puede ver se crea el objeto de Scanner nombrado entrada, y luego entre paréntesis se pasa un parámetro a la función constructor de la clase Scanner, porque ésta así lo exige. Sin detallar mucho, este parámetro sirve para indicar que el objeto creado servirá como medio para el ingreso de datos.
Import
Para usar algunas clases, como por ejemplo la clase Scanner, se deben importar las librerías que la contengan. Las librerías se importan antes de la definición de la clase, y para hacerlo se debe poner el siguiente código: import rutaDeLaLibrería; Para poder utilizar la clase Scanner se debe importar mediante el siguiente código:
import java.util.Scanner;
Tip: Cuando se escribe Scanner entrada; eclipse acusará error, ya que no se ha importado la librería que contiene la clase Scanner, y se observa que la palabra Scanner estará subrayada en color rojo. Al hacer clic sobre la palabra que esta subrayada y presionar la combinación de teclas ctrl + o, eclipse importa automáticamente la librería necesaria para trabajar con la clase, ahorrando al programador el trabajo de escribir toda la ruta.
}
En el caso de que se encuentren clases con el mismo nombre en diferentes librerías, el IDE desplegará una lista con las opciones existentes de rutas a importar, y el programador deberá escoger la adecuada.Una vez hecho todo esto el objeto entrada, se encontrará listo para usar, y mediante este se podrán invocar métodos y atributos que pueda contener la clase Scanner.
Para invocar métodos o atributos de la clase mediante el objeto se debe escribir el nombre del atributo de instancia, y luego un punto “.” que actúa de comunicador, y de esta manera poder llamar métodos y atributos.
Los métodos que más pueden servir para el cometido de este tema son los siguientes:
next(); // Se espera que el usuario ingrese por consola un valor de tipo String
nextInt(); // Se espera que el usuario ingrese por consola un valor de tipo int
nextBoolean(); // Se espera que el usuario ingrese por consola un valor de tipo boolean
nextFloat(); // Se espera que el usuario ingrese por consola un valor de tipo float
nextDouble(); // Se espera que el usuario ingrese por consola un valor de tipo double
close(); // Se cierra el scanner para que no consuma más recursos
Los primeros cinco métodos esperan que el usuario ingrese un valor mediante la consola, y ese valor debe ser guardado en alguna variable para que el mismo no se pierda.
Cuando no se use más el scanner se debe cerrar para que éste no consuma recursos en memoria mediante el método close(). Ejemplos de utilización de estos métodos serían:
String nombre = entrada.next();
int edad = entrada.nextInt();
float impuesto = entrada.nextFloat();
Ejemplo:
import
java.util.Scanner;
public class Principal {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
String nombre, apellido;
byte edad;
System.out.println("Ingrese su nombre");
nombre = entrada.next();
System.out.println("Ingrese su apellido");
apellido = entrada.next();
System.out.println("Ingrese su edad");
edad = entrada.nextByte();
entrada.close();
System.out.println("Usted ha ingresado a la matrix");
System.out.println("Ahora se lo conocerá como " + nombre + " " +
apellido + " y comenzará una nueva vida con
la edad de " + edad + " años. ");
} // fin del método main
} // fin de la clase Principal
Buenas prácticas:
Cuando se utilizan objetos que pueden tener acceso a muchos métodos de una clase, es buena práctica dirigirse a la documentación oficial de Oracle para conocer todos los métodos y atributos de la clase a los que se puedan tener acceso.
Resolución de errores
Cuando se programa con algún tipo de error, eclipse lo detecta en tiempo de programación y subraya en rojo las palabras en donde se contiene el error. Una forma fácil es resolver errores utilizando la ayuda que proporciona el ide.
Para eso se debe posicionar el puntero del mouse sobe la palabra que se encuentra subrayada y si existen sugerencias para resolver el error, eclipse listará las posibles soluciones.
Para resolver el error marcado entonces, el programador debe elegir de la lista propuesta por eclipse, la opción que resulte más conveniente.
MAS SOBRE IMPORT
Para utilizar los objetos contenidos en un paquete, bien sea creado por ustedes o incluido con el entorno de programación de Java, es necesario importar dichos paquetes.
Por ejemplo para importar un objeto similar a “Applet” del paquete de clases “Java.applet” se deberá utilizar la siguiente instrucción: import Java.applet.Applet;
Y para importar todos los objetos del paquete entonces se escribe: import Java.applet.*;
Al importar todos los objetos o solamente uno del paquete de clases, estamos creando la definición e implementación disponible para el paquete actual, supongamos:
class NuestroApplet extends Applet {
. . .
}
Ahora si ustedes intentan compilar este applet sin importar la clase:
Java.applet.Applet
Entonces, el compilador se “molestara” y enviara un mensaje de error con algo similar a:
“Super class Applet of class NuestroApplet not found”
INSTRUCCIONES DE BLOQUE
Un bloque es un conjunto de sentencias encerradas por ({}) por ejemplo:
void bloque() {
int a = 20;
{ // Aquí empieza el bloque, Ah esto es un comentario.
int b = 30;
System.out.println(“Aquí estamos dentro del bloque:”);
System.out.println(“a:” + a);
System.out.println(“b:” + b);
} // Fin del bloque.
}
IDEA CLAVE
Escribimos código para que lo puedan leer otras personas, no sólo para que lo traduzca el compilador (si no fuese así, podríamos seguir escribiendo nuestros programas en binario).
§ No comente el código “malo” (uso de construcciones extrañas, expresiones confusas, sentencias poco legibles…): Reescríbalo.
§ No contradiga al código: Los comentarios suelen coincidir con el código cuando se escriben, pero a medida que se corrigen errores y el programa evoluciona, los comentarios suelen dejarse en su forma original y aparecen discrepancias.
Si cambia el código, asegúrese de que los comentarios sigan siendo correctos.
El código bien escrito es más fácil de leer, entender y mantener (además, seguramente tiene menos errores)
Tipos de Errores de programación
Errores sintácticos Errores detectados por el compilador en tiempo de compilación.
Errores semánticos Sólo se detectan en tiempo de ejecución: Causan que el programa finalice inesperadamente su ejecución (p.ej. división por cero) o que el programa proporcione resultados incorrectos.
Estructura de programación secuencial
Cuando en un problema sólo participan operaciones, entradas y salidas se la denomina una estructura secuencial. Los problemas diagramados y codificados previamente emplean solo estructuras secuenciales.
La programación requiere una práctica ininterrumpida de diagramación y codificación de problemas.
Problema: Realizar la carga de dos números enteros por teclado e imprimir su suma y su producto.
Diagrama de flujo:
Tenemos dos entradas num1 y num2 (recordar cuáles son los nombres de variables correctas), dos operaciones: realización de la suma y del producto de los valores ingresados y dos salidas, que son los resultados de la suma y el producto de los valores ingresados.
En el símbolo de impresión podemos indicar una o más salidas, eso queda a criterio del programador, lo mismo para indicar las entradas por teclado.
import java.util.Scanner;
public class SumaProductoNumeros {
public static void main(String[] ar) {
Scanner teclado=new Scanner(System.in);
int num1,num2,suma,producto;
System.out.print(“Ingrese primer valor:”);
num1=teclado.nextInt();
System.out.print(“Ingrese segundo valor”);
num2=teclado.nextInt();
suma=num1 + num2;
producto=num1 * num2;
System.out.print(“La suma de los dos valores es:”);
System.out.println(suma);
System.out.print(“El producto de los dos valores es:”);
System.out.println(producto);
}
}
Recordemos que tenemos que seguir todos los pasos vistos para la creación de un proyecto, su clase, definición de la función main y la codificación del diagrama de flujo (como son problemas muy sencillos con una única clase puede especificar el nombre del proyecto con el mismo nombre de la clase: SumaProductoNumeros)
Algunas cosas nuevas que podemos notar:
- Podemos definir varias variables en la misma línea:
int num1,num2,suma,producto; - Si llamamos a la función println en lugar de print, la impresión siguiente se efectuará en la próxima línea:
System.out.println(suma);
Problemas propuestos
- Realizar la carga del lado de un cuadrado, mostrar por pantalla el perímetro del mismo (El perímetro de un cuadrado se calcula multiplicando el valor del lado por cuatro)
- Escribir un programa en el cual se ingresen cuatro números, calcular e informar la suma de los dos primeros y el producto del tercero y el cuarto.
- Realizar un programa que lea cuatro valores numéricos e informar su suma y promedio.
- Se debe desarrollar un programa que pida el ingreso del precio de un artículo y la cantidad que lleva el cliente. Mostrar lo que debe abonar el comprador.
No te detengas, sigue avanzando
Aquí tienes un propósito para este 2024 que debes considerar seriamente: si has querido mejorar tus habilidades en hacking, Ciberseguridad y programación ahora es definitivamente el momento de dar el siguiente paso. ¡Desarrolla tus habilidades aprovechando nuestros cursos a un precio increíble y avanza en tu carrera! El mundo necesita más hackers…
Universidad Hacking. Todo en Ciberseguridad. Curso Completo
Aprende Hacking Ético y Ciberseguridad sin necesitar conocimientos Previos. Practica Hacking Ético y Ciberseguridad aquí
Calificación: 4,6 de 5 (2.877 calificaciones) 15.284 estudiantes Creado por Alvaro Chirou • 1.800.000+ Enrollments Worldwide
Lo que aprenderás
- Seguridad informática
- Hacking Ético en profundidad
- Redes
- Programación (Python) (Hacking con Python)
- Análisis de Malware con laboratorios, practicas y ejecución de Malware para que veas su comportamiento.
- Cómo reforzar tu Privacidad y Anonimato
- Uso avanzado de Metasploit
- Top 10 de Owasp Web, Top 10 de Owasp mobile y Top 10 de Owasp API
- Seguridad informática para empresas
- Kali linux de 0 a 100, Veremos su suite de herramientas de hacking y como explotar fallos en sistemas.
- Termux y como hackear desde el celular
- Seguridad informática server/web, profundizaremos en WordPress
- Análisis de trafico en Wireshark
- Y mucho, pero mucho más
¿Esto que significa?
Hoy más que nunca, se necesitan personas capacitadas en este rubro para trabajar.
Por esa razón cree esta formación profesional para compartirte mis conocimientos y experiencia en la materia y puedas iniciar en este mundo del Hacking Ético y Ciberseguridad.
Te voy a estar acompañando en el proceso de aprendizaje, donde si estas empezando desde 0, sin conocimientos previos, no es un impedimento ya que iniciaremos como si no supieras nada de la materia.
Si sos una persona con conocimientos, podrás iniciar directamente en el nivel más avanzado o en el que tu elijas.
Como en todos mis cursos en udemy, tendrás muchísima practica para que materialices lo que vas aprendiendo.
Aprende con nuestros más de 100 cursos que tenemos disponibles para vos
No solo te enseñamos, tambien te guíamos para que puedas conseguir trabajo como desarrollador y hacker…
¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?
Sobre los autores
Álvaro Chirou
Yo soy Álvaro Chirou, tengo más de 20 Años de experiencia trabajando en Tecnología, eh dado disertaciones en eventos internacionales como OWASP, tengo más de 1.800.000 estudiantes en Udemy y 100 formaciones profesionales impartidas en la misma. Puedes serguirme en mis redes:
Laprovittera Carlos
Soy Laprovittera Carlos. Con más de 20 años de experiencia en IT brindo Educación y Consultoría en Seguridad de la Información para profesionales, bancos y empresas. Puedes saber más de mi y de mis servicios en mi sitio web: laprovittera.com y seguirme en mis redes:
¿Quieres iniciarte en hacking y ciberseguridad pero no sabes por dónde empezar? Inicia leyendo nuestra guia gratuita: https://achirou.com/como-iniciarse-en-ciberseguridad-y-hacking-en-2024/ que te lleva de 0 a 100. Desde los fundamentos más básicos, pasando por cursos, recursos y certificaciones hasta cómo obtener tu primer empleo.