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
- S’utilitza un IDE per escriure el codi font (.java)
- JDK compila el codi de byte (.java -> .class)
- El doci de byte s’executa amb una JVM, que forma part del JRE
Desenvolupament de Software Java
Punts de ruptura
- Crear un punt de ruptura clicant al número de la línia
- 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
- Operadors dins d’un parell de parèntesis
- Operadors d’augment i disminució
- Operadors de multiplicació i divisió, avaluats d’esquerra a dreta
- 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
- V8: (paquets + classes) https://docs.oracle.com/javase/8/docs/api/
- V14: (mòduls + paquets + classes) https://docs.oracle.com/en/java/javase/14/docs/api/index.html
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
- Els objectes s’emmagatzemen a la memòria pila
- 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();
- Un ArrayList solament pot contenir objectes, no primitius
- No pot accedir als elements a través de la notació d’índex sino a través de mètodes
- Canvi de tamany dinàmic
- 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)
- New project
- 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
Deixa un comentari