Java

1.- PRIMEROS PASOS CON JAVA (en Linux)

1.1.- HOLAMUNDO

Instalas el JDK (manual para Windows [1], [2], [3] y manual para linux [1], [2], [3] )

Instalas NetBeans (ahora no lo vamos a usar)

Creas un fichero que se llame HolaMundo.java y en él escribes esto:

public class HolaMundo {
public static void main(String[] args) {
System.out.println(“Hola Mundo”);
System.out.println(“”);
System.out.println(“Tienes que guardar este código como HolaMundo.java”);
System.out.println(“Despues compilarlo así: javac HolaMundo.java”);
System.out.println(“Despues lo puedes ejecutar haciendo: java HolaMundo”);
System.out.println(“\n\n\t\t\t\tSaludos\n\n\n\t\t\t\t\t\tJxXx”);

}
}

Y Tal y como dice este fichero:

  1. Guardas
  2. Compilas con javac HolaMundo.java
  3. Ejecutas con java HolaMundo

1.2.- INFORMÁTICOS

Tenemos 4 ficheros:

InformaticoAbs.java, Programador.java, Analista.java y PruebaInformaicos.java

InformaticoAbs.java:

public abstract class InformaticoAbs
{
//Atributos
private String empresa;
private double sueldo;

//Constructor
public InformaticoAbs(String empresa)
{
this.empresa = empresa;
}

//Métodos
public String getEmpresa() { return this.empresa; }
public void setEmpresa(String nueva) { this.empresa = nueva; }
public double getSueldo() { return this.sueldo; }
public void setSueldo(double euros) { this.sueldo = euros; }
//método abstracto
public abstract double pagarSueldo(double horas);
}

Programador.java

public class Programador extends InformaticoAbs
{
String lenguaje;

public Programador(String empresa, String lenguaje)
{
super(empresa);
this.lenguaje = lenguaje;
}

public double pagarSueldo(double horas)
{
return horas*6;
}
}

Analista.java

public class Analista extends InformaticoAbs
{
String especialidad;

public Analista(String empresa, String especialidad)
{
super(empresa);
this.especialidad = especialidad;
}

public double pagarSueldo(double horas)
{
return horas*12;
}
}

PruebaInformaticos.java

public class PruebaInformaticos
{
public static void main(String args[])
{
//Creamos informáticos
InformaticoAbs inf1 = new Analista(“IBM”,”BBDD”);
InformaticoAbs inf2 = new Programador(“Indra”,”Java”);
System.out.println(“He creado un Analista de BBDD que trabaja para IBM y uno de Java para Indra. “);

//Pagamos los sueldos utilizando polimorfismo
inf1.setSueldo(inf1.pagarSueldo(500));
inf2.setSueldo(inf2.pagarSueldo(450));
System.out.println(“El primero gana 500€ y el segundo 450.(Polimorfismo)”);

System.out.println(“El sueldo del analista: “+inf1.getSueldo()+” He llamado a Analista.getSueldo()”);
System.out.println(“El sueldo del programador: “+inf2.getSueldo()+” He llamado a Programador.getSueldo()”);
}
}

Una vez guardado todo (cuidado con las mayúsculas de los nombres de los ficheros) hacemos desde la consola

$ javac InformaticoAbs.java Programador.java Analista.java PruebaInformaticos.java

Hemos compilado nuestros ficheros, ahora para ejecutar la prueba hacemos:

java PruebaInformaticos

1.3.- DIAGRAMAS UML

Bien… Necesitamos un suft que nos facilite el asunto (con el paint o similar tb se puede pero yo usaré umbrello:)

# apt-get install umbrello

Cargo InformaticoAbs.java, Programador.java, Analista.java y PruebaInformaicos.java en Umbrello, me lo curro un poco para que aparezca todo ordenado y capturando pantalla y editando con el Gimp nos queda esto:

informaticosuml.png

2.- Programación Orientada a Objetos con Java

La programación orientada a objetos es una nueva forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

  • Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa).—
  • Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.
  • Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un “mensaje”. Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un “evento” con un nuevo mensaje para otro objeto del sistema.

Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como “orientado a objetos”, pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):

  • Abstracción: Cada objeto en el sistema sirve como modelo de un “agente” abstracto que puede realizar trabajo, informar y cambiar su estado, y “comunicarse” con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.
  • Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.
  • Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.
  • Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en “tiempo de ejecución”, esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en “tiempo de compilación”) de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
  • Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple; esta característica no está soportada por algunos lenguajes (como Java).

El lenguaje Java se creó con cinco objetivos principales:

  1. Usar la metodología de la P.O.O.
  2. Permitir la ejecución de un mismo programa en múltiples sistemas operativos.
  3. Incluir por defecto soporte para trabajo en red.
  4. Ejecutar código en sistemas remotos de forma segura.
  5. Ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos.

La segunda característica, la independencia de la plataforma, significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware. Es lo que significa ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, ‘’’write once, run everywhere’’’.

Recolector de basura

Un argumento en contra de lenguajes como C++ es que los programadores se encuentran con la carga añadida de tener que administrar la memoria solicitada dinámicamente de forma manual. La recolección de basura de Java es un proceso prácticamente invisible al desarrollador. Es decir, el programador no tiene conciencia de cuándo la recolección de basura tendrá lugar, ya que ésta no tiene necesariamente que guardar relación con las acciones que realiza el código fuente.

Sintaxis

La sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de éste, que combina la sintaxis para programación genérica, estructurada y orientada a objetos, Java fue construido desde el principio para ser completamente orientado a objetos. Todo en Java es un objeto (salvo algunas excepciones), y todo en Java reside en alguna clase.

Hola Mundo

”Para conocer el origen del programa “Hola Mundo” véase: Hello world program

Aplicaciones autónomas

 

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

Este ejemplo necesita una pequeña explicación.

  • Todo en Java está dentro de una clase, incluyendo programas autónomos.
  • El código fuente se guarda en archivos con el mismo nombre que la clase que contienen y con extensión “.java”. Una clase (class) declarada pública (public) debe seguir este convenio. En el ejemplo anterior, la clase es Hola, por lo que el código fuente debe guardarse en el fichero “Hola.java”
  • El compilador genera un archivo de clase (con extensión “.class”) por cada una de las clases definidas en el archivo fuente. Una clase anónima se trata como si su nombre fuera la concatenación del nombre de la clase que la encierra, el símbolo “$”, y un número entero.
  • Los programas que se ejecutan de forma independiente y autónoma, deben contener el método ”main()”.
  • La palabra reservada ”void” indica que el método main no devuelve nada.
  • El método main debe aceptar un array de objetos tipo String. Por acuerdo se referencia como ”args”, aunque puede emplearse cualquier otro identificador.
  • La palabra reservada ”static” indica que el método es un método de clase, asociado a la clase en vez de a instancias de la misma. El método main debe ser estático o ’’de clase’’.
  • La palabra reservada public significa que un método puede ser llamado desde otras clases, o que la clase puede ser usada por clases fuera de la jerarquía de la propia clase. Otros tipos de acceso son ”private” o ”protected”.
  • La utilidad de impresión (en pantalla por ejemplo) forma parte de la librería estándar de Java: la clase ‘’’System’’’ define un campo público estático llamado ‘’’out’’’. El objeto out es una instancia de ‘’’PrintStream’’’, que ofrece el método ‘’’println(String)’’’ para volcar datos en la pantalla (la salida estándar).
  • Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo método main debe invocarse. Por ejemplo, una línea de comando (en Unix o Windows) de la forma java –cp . Hola ejecutará el programa del ejemplo (previamente compilado y generado “Hola.class”) . El nombre de la clase cuyo método main se llama puede especificarse también en el fichero “MANIFEST” del archivo de empaquetamiento de Java (.jar).

Applets

Las applets de Java son programas incrustados en otras aplicaciones, normalmente una página Web que se muestra en un navegador.

 

// Hola.java
import java.applet. Applet;
import java.awt. Graphics; 

public class Hola extends Applet {
    public void paint(Graphics gc) {
        gc.drawString("Hola, mundo!", 65, 95);
    }
}
 <!-- Hola.html -->
<html>
  <head>
    <title>Applet Hola Mundo</title>
  </head>
  <body>
    <applet code="Hola" width="200" height="200">
    </applet>
  </body>
</html>

La sentencia import indica al compilador de Java que incluya las clases java.applet. Applet y java.awt. Graphics, para poder referenciarlas por sus nombres, sin tener que anteponer la ruta completa cada vez que se quieran usar en el código fuente.

La clase Hola extiende (extends) a la clase Applet, es decir, es una subclase de ésta. La clase Applet permite a la aplicación mostrar y controlar el estado del applet. La clase Applet es un componente del AWT (Abstract Windowing Toolkit), que permite al applet mostrar una inteterfaz gráfica de usuario o GUI (Graphical User Interface), y responder a eventos generados por el usuario.

La clase Hola sobrecarga el método paint(Graphics) heredado de la superclase contenedora (Applet en este caso), para acceder al código encargado de dibujar. El método paint() recibe un objeto Graphics que contiene el contexto gráfico para dibujar el applet. El método paint() llama al método drawString(String, int, int) del objeto Graphics para mostrar la cadena de caracteres Hola, mundo! en la posición (65, 96) del espacio de dibujo asignado al applet.

La referencia al applet es colocada en un documento HTML usando la etiqueta <applet>. Esta etiqueta o tag tiene tres atributos: code="Hola" indica el nombre del applet, y width="200" height="200" establece la anchura y altura, respectivamente, del applet. Un applet también pueden alojarse dentro de un documento HTML usando los elementos object, o embed, aunque el soporte que ofrecen los navegadores Web no es uniforme.[5][6]