Introducció

Relació de productes de tecnologia Java i tipus de dispositiu de destí

Java és un llenguatge indendent de la plataforma i els programes s’executen en una MV

  • Java Runtime Environment (JRE) = JVM + Biblioteques de classes Java
  • Java Developement Kit (JDK) = JRE + Compllador Java +  Eines adicionals
  • IDEs: Netbeans, Greenfoot and BlueJ, Alice

Procediment

  1. S’utilitza un IDE  per escriure el codi font (.java)
  2. JDK compila el codi de byte (.java -> .class)
  3. El doci de byte s’executa amb una JVM, que forma part del JRE

Desenvolupament de Software Java

Punts de ruptura

  1. Crear un punt de ruptura clicant al número de la línia
  2. Executar el Debugador

Espais en blanc i {}

  • Els espais en blanc serveixen per ordenar el codi (espais entre paraules – espais – línies en blanc – sagnat davant d’una línia de codi).
  • Darrere de { deixar 4 espais i  darrere de } deixar 4 espais

Comentaris

  • Una línia //
  • Vàries línies /* comentari */

Mètode principal

public static void main(String[] args){
//Your program starts here.
}

Classes, instàncies, propietats i comportaments

Tipus de dades Java

Variables

Tipus principals de variables

  • boolean
  • int
  • double
  • String (cadena)

Declarar i assignar valors a les variables

  • boolean bool = true;
  • boolean bool; bool = true;

int x = “Hola”; INCORRECTE!!!

  • double doubleVar1, doubleVar2, doubleVar3;
  • double doubleVar1, doubleVar2, doubleVar3 = 3.1;

Anomenar variables segons les convencions

  • No curtes (x)
  • No començar per números (123paswd)
  • No paraules clau
  • No espais en blanc
  • Comencen amb minúscula (edatAlumne)

Dades numèriques

Informació sobre dades

Dades numèriques

Enters

Operadors matemàtics estàndard

Operadors per fer assignacions

Operadors augment i disminució

Coma flotant

Els enters a Java no s’arredoneixen, es trunquen.

int x = 9/2;
System.out.println(x); //prints 4

public float pi = 3.141592F;
public double pi = 3.141592;
double x = 9/2;
System.out.println(x); //prints 4.0
double x = 9/2,0;
System.out.println(x); //prints 4.5

Si volem que una variable no canviï mai de valor hem de fer servir la paraula clau final

final double PI = 3.141592;
PI = 3.0;//Not Allowed

Les variables final han de:

  • Escriure amb majúscula (PI)
  • Les paraules es separem amb guió baix (CONSTANT_PI)

Ordre operadors

Regles de prioritat

  1. Operadors dins d’un parell de parèntesis
  2. Operadors d’augment i disminució
  3. Operadors de multiplicació i divisió, avaluats d’esquerra a dreta
  4. Operadors de suma i resta, avaluats d’esquerra a dreta

Dades textuals

Caràcters (char) i cadenes (String)

Concatenació de caràcters

char letter1 = 'H';
char letter2 = 'e';
char letter3 = 'l';
char letter4 = 'l';
char letter5 = 'o';
//Long sentences would be painful to code
System.out.println(letter1 +letter2 +letter3 +letter4 +letter5);
String greeting = "Hello World!";
//Notice the double quotes
System.out.println(greeting);

Concatenació cadenes

  • stringVariable1 + stringVariable2
  • stringVariable1 + “Stringliteral”
  • stringVariable1 + “Stringliteral” + stringVariable2

Combinació de caràcters i números

String totalPrice = "Total: $"+3;
System.out.println(totalPrice); //Total: $3 
String totalPrice = "Total: $" +3 +2 +1;
System.out.println(totalPrice); //Total: $321

Sentències print

Seqüències d’escapada

The cat said “Meow!” to me.

System.out.println("The cat said \"Meow!\" to me.");

System.out.println(“Print Line method”); = System.out.print(“Hola \n“);

sout+tab => Sistem.out.println(“???”);

 Conversió entre tipus de dades

Java ascendeix el valor enter a una variable doble

double x = 4;
System.out.println(x); //prints 4.0 

Conversió de tipus

int myInt;
double myPercent = 51.9; 
myInt = (int)myPrecent; // Number is "chopped"
                        // myInt is 51

 Desbordament

El tipus byte pot assignar valors entre -128 i 127. Si assignem valors superiors o inferiors tenim un desbordament.

Caràcter de subratllat

int 123456789: és equivalent a int 123_456_789;

 Conversió de cadenes a dades numèriques

Convertir un valor String a int

int intVar1 = Integer.parseInt("100");

Convertir un valor String a double

double doubleVar2 = Double.parseDouble("2.72");

Entrada del teclat

 Formes d’obtenir l’entrada de l’usuari:

  • Botons (físics o virtuals)
  • Rodes i dials
  • Reconeixement de veu
  • Quadres de diàleg de text
  • Arxius de propietats

Formes d’obtenir l’entrada de l’usuari de Java:

  • Swing JOptionPane
  • JavaFX (un successor de Swing)
  • Scanner

JOptionPane

import javax.swing.JOptionPane; 
String input = JOptionPane.showInputDialog("Type something:");
String input = (String)JOptionPane.showInputDialog(
null, "Is this a question?", "Dialog Title", 2, null, null, "Type something here.");

String[] acceptableValues = {“Choice 1”, “Choice 2”, “Choice 3”}; String input2 = (String)JOptionPane.showInputDialog( null, “Is this a question?”, “Dialog Title”, 2, null, acceptableValues, acceptableValues[1]);

JOptionPane.showMessageDialog(null, “There’s no input here, just a message”, “Title”, 0);

Scanner

  • Un objecte Scanner obre un flux per recopilar entrades
  • Un objecte Scanner busca tokens
  • Els tokens estan separats per un delimitador (espai per defecte)
import java.util.Scanner;

Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
double  y = sc.nextDouble();
String z = sc.next(); 
sc.close();

Excepcions

  • Exception in thread “main” java.util.InputMismatchException
  • Exception in thread “main” java.lang.IllegalStateException: Scanner closed
  • Exception in thread “main” java.lang.NullPointerException

Lectura des d’un arxiu

Scanner sc = new Scanner(Input04.class.getResourceAsStream("input04text.txt")); 

sc.nextLine();
sc.findInLine("BlueBumper");

Què és un mètode?

Estructurar codi en una classe

public class Calculator{

//Camps
public double tax = 0.05;
public double tip = 0.15;
public double originalPrice = 10;

//Comportaments
public void findTotal(){

}

public void printTip(){

}

}

public class CalculatorTest{

public static void main(String args[]){

//instanciar un objecte
Calculator calc = new Calculator();

//utilitzar l’operador de punt per accedir als camps i als mètodes d’un objecte.
calc.tip = 0.10;
calc.findTotal():

}

}

Paràmetres de mètode

public void calculadora0 {

System.out.println(“No parameters”);

}

public void calculadora1(int x, double y){

System.out.println(x/y);

}

Àmbits dels paràmetres

  • Paràmetres de mètode: variables que existeixen en tot l’àmbit d’un mètode. Es creen a la declaració de mètode.
  • Àmbit: fa referència al {bloc de codi} que pertany a un mètode després de la seva delcaraicó.

Tipus de retorn de mètode.

public String returnString(){

return (“Hello”);

}

public int sum(int x, int y){

return (x + y);

}

Declaració import i paquets

Bblioteca de classes Java

NOM QUALIFICAT COMPLET:  com.Java.util.Scanner

com.java.util.Scanner keyboard = new com.java.util.Scanner(System.in);

IMPORT com.java.util.Scanner

Scanner Keyboard = new Scanner(System.in);

IMPORT com.Java.util.* (importa totes les classes d’un paquet)

La classe String

Tipus de dada primitiu. (java.lang.String)

Mètodes

  • lenght()
  • indexOf(char c)
  • indexOf(char c, int beginIdx)
  • charAt(int index)
  • substring(int beginIdx)
  • substring(int beginIdx,int endIdx)
  • replace(char oldChar, char newChar)
  • replaceFirst(String pattern, String relacement)

Declaració i creació d’una cadena

  • String herName = “Mònica Buj”;
  • String herName = new String(“Mònica Buj”);  (No recomanable)

Concatenació de cadenes

  • Operador de concatenació de cadenes +
  • Mètode concat(): Somament pot concatenar cadenes

Comparació de cadenes

  • Mètode compareTo()

Class Random

java.util.Random

Random rndNumber = new Random();

Mètodos que proporcionan la clase Random

import java.util.Random;

public class RandomNum {

public static void main(String[] args) {

Random rndNum = new Random();
int randomNum = rndNum.nextInt();
System.out.println(“Random Number: ” + randomNum);

}

}

Generació de números aleatories en un rang de números

  • nextInt(int maxValue); Obté un nombre aleatori [0-maxValue)
  • Obtenir un nombre aleatòri entre [5-35)

Random rand = new Random();
int randomnum = rand.nextInt(31)+5;     //35-5 = 30 +1 = 31

NOTA: si sempre es genera el mateix número aleatori cal utilitzar un valor constant anomenat inicial.

Random rndNumbers = new Random(20L);

Per canviar el valor inicial es pot fer mitjançant la crida al mètode setSeed()

rand.setSeed(20L);

Expressions boolean i construccions if/else

boolean isFive = true;
boolean isFive = x==5;

Operadors relacionals

Sentències Condicionals

  • if
  • if/else

Comparació de variables String

  • mètode equals() de la classe String

boolean test = z.equals(x + y);

Sentència Switch

Bucles for

Tipus de bucle:

  • for
  • while
  • do-while

Una sentència continue s’utilitza per ometre les sentències qe queden al cos del bucle i continuar amb la següent interacció del bucle.

Es poden ometre expressions del bucle, però no és recomanable.

for(;;){ System.out.println(“Welcome to Java”); }

Aquest bucle es repeteix infinitament

Animació de l’àmbit de les variables

  • La variable i es crea abans del bucle for.
  • Dins del for no hi podria existir una variable i perquè estaria dins del mateix àmbit.

Bucles while i do-while

L’expressió d’inicialització inicialitza el bucle i l’executa una sola vegada, conforme comença el bule.

Els bucles for i while són previs a la prova, evaluen la condició abans de que el bucle s’executi.

El bucle do-while és posterior a la prova, avaluen la condició al final del bucle.

El número de vegades que s’executa un bucle do-while depen del valor de la variable de contador.

Quin bucle utilitzar?

Creació d’una classe i un projecte Java

El mètode main ha de ser el més petit possible.

  • No es possible accedir a les variables creades en un mètode des de fora del mètode

Instanciació d’objectes

Al comparar dos objectes es comparen les adreces de memòria on es guarden, no els valors dels seus camps.

La memòria de pila s’utilitza per emmagatzemar:

  • variables locals
  • primitius
  • referències a ubicacions a la memòria del munt

La memòria del munt s’utilitza per emmagatzemar objectes

Referències i objectes a memòria

  1. Els objectes s’emmagatzemen a la memòria pila
  2. Els desenvolupadors de Java no tenen que saber l’ubicació d’un objecte a la memòria

Assignació d’una referència a un altra

Com que no hi ha cap variable de referència que apunti a l’objecte que abans era el bubba, Java l’esborra automàticament (recol·lecció de brossa)

Instanciació d’objectes String

Constructors

Si els camps no s’han inicialitzar, adquireixen un valor per defecte:

Referència a objectes nuls

  • Els objectes poden tenir un valor null
  • Un objecte null apunta a una ubicació buida a la memòria
  • Si un objecte té un altre objecte com un camp, per exemple String, el seu valor per defecte és null.

Crida a constructors

  • Un constructor és un mètode especial
  • Es crida una vegada durant la instanciació
  • S’anomena constructor per defecte
  • Es considera un constructor sense arguments

Prisioner p01 = new Prisioner();

  • Es pot substituir un constructor per defecte per un de propi
  • No tenen tipus de devolució (ni tan sols void)
  • Tenen el mateix nom que la classe
  • Poden acceptar arguments
  • S’utilitzen per definir els valors inicials dels camps
  • Un mètode constructor té un tipus de retorn nul

public Prisioner(){

System.out.println(“Tis is a constructor”);

}

Paraula clau this

  • this fa referència a l’objecte actual

Sobrecàrrega de mètodes

Interacció d’objectes

  • Una referència d’objecte és una adreça de memòria
  • Els objectes interactuen mitjançant l’accés dels camps d’un altre objecte i la crida als mètodes d’un altre objecte
  • Si l’objecte main instancia cada objecte
    • El mètode main conté totes les referències d’objecte
    • El mètode main pot accedir als camps i mètodes de tots els objectes

Modificadors d’accés

  • public: visible per qualsevol classe
  • paquet: visible per al paquet actual
  • private: solament visible per la classe actual
    • Els camps de classe marcats com privats són les més segures
    • Els camps de classe solen estar marcats com privats

Mètodes getter i setter

  • Els métodes getter/setter són públics
  • Els getters no acostumen a acceptar arguments i els mètodes setter si
  • Els mètodes getter retornen el valor d’una variable en concret i els mètodes setter són del tipus void

Encapsulació (canviar els camps a private i proporcionar mètodes getter i setter per cada camp)

Netbeens: Refactor >> Encapsulate Fields

Variables i mètodes estàtics

  • A la classe Math no s’ha de crear un objecte Math cada vegada que es vulgui realitzar alguna operació matemàtica.
  • Es pot accedir als camps i als mètodes de Math directament fent referència a la classe Math.
  • S’anomenen variables estàtiques i mètodes estàtics
  • S’ha d’instanciar un objecte abans de poder accedir als seus mètodes i camps no estàtics

Escriptura de camps estatic final

  • Escrits en majúscula
  • Utilitzen guions baixos (_) per separar les paraules

Matrius unidimensionals

Declaració d’una matriu

type[] arrayIdentifier;

double[] temperatura;
double temperatura[];

data_type[] variable_name = new data_type[size];
variable_name[index] = value; //repeat for each element

int[] ages;
ages = new int[3];

in[] ages = new int[3];

Declaració i inicialització

type[] arrayIdentifier = {comma-separated list of values};

int[] ages = {25, 27, 48};

Recòrrer una matriu: for i for-each

for(String name: names){

System.out.println(name);

}

ArrayLists

java.util.ArrayList

ArrayList <String>names = new ArrayList();

  1. Un ArrayList solament pot contenir objectes, no primitius
  2. No pot accedir als elements a través de la notació d’índex sino a través de mètodes
  3. Canvi de tamany dinàmic
  4. Es pot recòrrer amb for- each, Iterator o ListIterator

For-each

Iterator

java.util.Iterator

  • Mètodes: hasNext(). next(), remove()
  • Avança cap endavant

ListIterator

java.util.ListIterator

  • Permet recòrrer l’ArrayList a les dos direccions
  • No conté el mètode remove

Classes envoltori

Un ArrayList no pot contenir primitius, però si classes envoltori

Java per convertir un tipus primitiu a un tipus envoltori té

  • Conversió automàtica (Double score = 18.58;)
  • Anul·lació automàtica (double goal = score;)

Excepcions

Tipus d’excepcions:

  • Excepcions comprovades: el compilador SI comprova i es fa càrrec de les excepcions (FileNotFoundException, IOException)
  • Excepcions no comprovades: el compilador NO comprova i NO es fa càrrec de les excepcions (ArrayIndexOutOfBoundsException, NullPointerException, ArithmeticException)

Manipulació d’excepcions – Bloc try-catch

Exemple

Exemples d’Exceptions

  • Java.lang.ArrayIndexOutOfBoundsException: intenta accedir a un índex de matriu no existent
  • Java.lang.NullPointerException: intenta utilitzar una referència d’objecte que no s’instanciava
  • Java.io.IOException: operacions d’E/S fallides o interrumpudes

Tècniques i conceptes de depuració

  • Prova: determinar si un codi conté errors
  • Depuració: identificar un error i corregir-lo

Tipus d’error

  • Error de compilació (error de sintaxi)
  • Error de lògica (s’executa el programa però genera un resultat incorrecte)
  • Error de temps d’execució (es produeixen en temps d’execució)

Tècniques de depuració

  • Sentències print
    • f`cils d’agregar
    • Informació dels mètodes als que s’ha cridat
    • Valor dels paràmetres
    • Ordre en el que s’ha ridat als mètodes
    • Valors de variables i els camps locals en punts estratiègics
  • Ús del depurador Netbeans (punts de ruptura, finestra de variables)

Errors comuns

  • = vs ==
  • ;
  • crida a mètodes amb arguments erronis
  • condicions de límit

Fonaments de JavaFX

Aplicacions de GUI

Creació d’un programa JavaFX (Netbeans)

  1. New project
  2. JavaFX – JavaFX Application – Next

Projecte JavaFX per defecte

Mètodes

  • start(): punt d’entrada per totes les aplicacions JavaFX
  • main(): inicia l’aplicació JavaFX

Els objectes s‘anomenen nodes a JavaFX

Tipus de nodes

  • Button
  • ScrollBar
  • Rectangle
  • Text
  • PieHart
  • ImageView

Creació de nodes

Button btn1 = new Button();

btn1.setText(” Say ‘Hello World’ “);

Node arrel

  • El node arrel és un StackPane i s’anomena root
  • es pot agregar cada node per separat:

root.getChildren().add(btn1);
root.getChildren().add(btn2);
root.getChildren().add(btn3);

  • es poden agregar molts nodes a la vegada

root.getChildren().addAll(btn1, btn2, btn3);

Cada panel determina el disseny dels nodes – Tipus de node arrel

Node arrel Group

  • Un Group permet colocar els nodes a qualsevol lloc

Group root = new Group();
root.getChildren().addAll(btn1, btn2);
btn1.setLayoutY(100);

  • Un StakePane no  permet que es moguin els nodes, se’ls hi faci clic o  que s’arrastrin.
  • Un Group pot contenir un StakePane

El gràfic d’escenes, escena i etapa

Gràfic d’escena

Escena

  • Una escena conté el node arrel
  • Una etapa conté una escena

Etapa

L’etapa és la finestra de l’aplicació i té 2 propietats importants

  • Title
  • Escena

Animacíó de jerarquia

  • Una etapa és un contenidor de nivell superior
  • Una etapa conté una escena
  • Una escena conté un node arrel
  • Un node arrel conté altres nodes

Colors, formes i JavaFX ensemble

Color

import javafx.scene.paint.Color;

Color color = new Color.rgb(255, 255, 20);

Forma

import javafx.scene.shape.Rectangle;

Rectangle rect = new Rectangle(20, 20, 100, 200);

setStrokeWidth(double d) defineix l’ample del contron d’un rectamgle

Canvis de posició d’un node

La majoria dels casos

setX(double d)  ————- setX(100)  => (100, 0)
setY(double d)

Si el node està bloquejat o si setX() no está disponible

setLayoutX(double d) 
setLayoutY(double d)

Els nodes estan ubicats respecte la cantonada superior esquerra

 Gràfics, àudio i MouseEvents

Una imatge és un objecte que descriu l’ubicació d’un arxiu de gràfics

Es pot reproduir el so fent referència a l’objecte d’audio directament

Les ecpressions Lambda ofereixen una sintaxi molt més efectiva i neta per treballar amb aplicacions de GUI i ordenar llistes.

JavaFX ensemble conté exemples de codi de caraacgterístiques de JavaFX