2.Introducción a Java
2.Introducción a Java
Introducción a Java
Java
● No es OO puro
● No todo es un objeto
● Tipado estático
● Tipos built-in (int, long, etc.)
● Instrucciones de control
● Sintaxis similar a C https://go.java
Aplicaciones a desarrollar
Age Of Empires II
Mobile en Java ME
● Applets (2005)
● Aplicaciones desktop
○ interface gráfica
○ de consola
● Aplicaciones web
● Se necesita
○ JRE: Para ejecutar código Java (cliente)
○ JDK: Para crear código Java (desarrollador)
● Las clases se escriben en un archivo .java con el mismo
nombre de la clase
● El código se compila (javac) y se genera código intermedio:
archivo binario .class
● El código intermedio es pasado a código de máquina en el
equipo final por la JVM: Java Virtual Machine
● Para generar un programa ejecutable una clase tiene que
implementar el método main.
Hello, world!
Archivo de texto MyClass.java Correspondencia entre archivo y clase
Clase que no se puede instanciar con tres campos: in, err, out
Clases abstractas
package ar.edu.itba.poo;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
Para usar clases de otros packages
se deben importar esas clases (o el
import javafx.scene.Scene;
package completo)
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
@Override
public void start(Stage primaryStage) {
Button btn = new Button("Say 'Hello World'");
btn.setOnAction(new MyAction());
StackPane root = new StackPane(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show(); Hello World!
}
@Override
public void start(Stage primaryStage) {
Button btn = new Button("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
System.out.println("Hello World!"); Clase Anónima
}
});
StackPane root = new StackPane(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
Hello, world!
@Override
public void start(Stage primaryStage) {
Button btn = new Button("Say 'Hello World'");
btn.setOnAction(aE -> System.out.println("Hello World!"));
StackPane root = new StackPane(btn);
primaryStage.setScene(new Scene(root, 300, 250)); Expresión
primaryStage.show(); Lambda
} (Funcional)
}
Métodos y propiedades
public class Date {
public Date() {
this(1970, 1, 1);
}
Polimorfismo
public Date() {
}
...
}
Métodos: alcance
}
Alcance de los modificadores
@Override
public Integer publicMethod() { ... } // OK
@Override
protected Integer protectedMethod() {
Integer n = privateMethod(); // ERROR
}
}
Métodos: modificadores
public abstract class Foo {
public static int staticMethod() { ... };
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Date))
return false;
Date date = (Date) o;
// Si son int usar ==, si son Integer usar equals
return year == date.year && month == date.month && day == date.day;
}
}
Pattern Matching instanceof
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Date date))
return false;
return year == date.year && month == date.month && day == date.day;
}
}
==, equals
System.out.println(d1==d2); // false
System.out.println(d1.equals(d2)); // true
Herencia
public class DateTime extends Date {
private int hour, minute, second;
public DateTime(int year, int month, int day, int hour, int min, int secs){
super(year, month, day);
...
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
if (!super.equals(o))
return false;
...
}
}
toString()
n3 = null; // OK
n2 = null; // Error: Incompatible types
...
method(10);
Para casos puntuales donde se presenten estos conflictos se puede optar por utilizar
wrappers en los tipos de dato de los parámetros de los métodos.
Loops
while(boolean_expression)
proposition
do
proposition
while(boolean_expression);
System.out.println(v1.length); // 10
System.out.println(v1.toString()); // [I@2626b418
System.out.println(Arrays.toString(v1)); // [0, 0, 10, 0, 0, 0, 0, 0, 0, 0]
static int binarySearch(long[] a, long key) // byte, char, int, short, float, …
...
Ver https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/Arrays.html
Loops
int sum = 0;
for(int value : v1) {
sum += value;
}
String s1 = "Hello";
String s2 = "world";
String s3 = s1 + ", " + s2;
int ch;
String s;
s.toUpperCase(); s no se modifica
Strings
int ch;
String s= "";
s = s.toUpperCase();
int ch;
StringBuilder s = new StringBuilder();
String()
String(byte[] bytes)
String(byte[] bytes, Charset charset)
String(byte[] bytes, int offset, int length)
String(byte[] ascii, int hibyte, int offset, int count)
String(char[] value)
String(char[] value, int offset, int count)
String(StringBuffer buffer)
String(StringBuilder builder)
● java.lang.Object
○ java.lang.Throwable
■ java.lang.Error
● java.lang.AssertionError
● ...
■ java.lang.Exception
● java.lang.CloneNotSupportedException
● java.lang.InterruptedException
● java.lang.ReflectiveOperationException
● java.lang.ClassNotFoundException
● ...
● java.lang.RuntimeException
● java.lang.ArithmeticException
● ...
Excepciones
Si un método puede lanzar una excepción que no extienda a RuntimeException, debe
indicarlo en su signature.
void method3() {
try {
method();
} catch (DataAccessException e) {
//
}
}
Excepciones: catch
try {
// Código que puede lanzar una excepcion
} catch (Exception1 e) {
...
} catch (Exception2 e) { // Exception1 no debe ser ancestro de Exception2
...
}
try {
// Código que puede lanzar una excepcion
} catch (Exception1 | Exception2 e) { // Exception1 no debe ser
ancestro
... // de Exception2 y viceversa
}
Excepciones
Ejemplo: método para copiar dos archivos usando java.nio