You are on page 1of 31

Objektno orijentirano

programiranje

1. Programski jezik Java

Zaštićeno licencom http://creativecommons.org/licenses/by-nc-


sa/3.0/hr/
Creative Commons

slobodno smijete:
⚫ dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo
⚫ remiksirati — prerađivati djelo
pod sljedećim uvjetima:
⚫ imenovanje. Morate priznati i označiti autorstvo djela na način kako je
specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše
korištenje njegova djela imate njegovu izravnu podršku).
⚫ nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe.
⚫ dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate
koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična
ovoj.

U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela.
Najbolji način da to učinite je linkom na ovu internetsku stranicu.
Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava.
Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.

Tekst licencije preuzet je s http://creativecommons.org/.

Objektno orijentirano programiranje 2


Klasičan pristup izvođenja programa

Prevoditelji Binarni kod

Windows

Izvorni *.exe
kod
Macintosh

*.java Solaris

Objektno orijentirano programiranje 3


Izvođenje programa pomoću virtualnog stroja

Prevoditelji Interpreter
Interpretor

Windows
Izvorni Byte kod
kod Click to add text

Macintosh

*.class

*.java Solaris

Objektno orijentirano programiranje 4


Svojstva Jave

♦ jednostavnost i poznatost ako je ♦ prenosivost


poznat C ili C++ ▪ byte kod prenosiv na bilo koji sustav
▪ izbačeni elementi: koji ima JVM
– typedef i define, predprocesorske ▪ definira jedinstvene podatke na svim
naredbe platformama (veličina i aritmetika)
– strukture i unije ▪ izvršni sustav je napisan u ANSI C-u
– funkcije
– višestruko nasljeđivanje ♦ robusnost
– naredba goto ▪ rana i kasna dinamička provjera koda
– preopterećivanje operatora ▪ stroga sintaksa
– uzimanje adrese proizvoljnog ♦ sigurnost
elementa razreda te pokazivači ▪ memorijska alokacija u JVM-u
♦ nezavisnost arhitekture ▪ provjera byte kodova
▪ kod neutralan s obzirom na arhitekturu ▪ sigurnost u čitaču byte kodova
(byte kod)
▪ napisani za izmišljeno računalo (Java
Virtual Machine - JVM)
Objektno orijentirano programiranje 5
Java Development Kit

Svi primjeri, osim gdje je to eksplicitno navedeno rade s verzijom


Jave 8 ili više
⚫ upute za instalaciju su za trenutnu verziju Jave - Java SE 11
⚫ Open JDK (Java Development Kit) http://jdk.java.net
⚫ Za instalaciju i podešavanje postavki na Windows računalima pogledati
predavanje 1.2
Programska dokumentacija: http://docs.oracle.com/javase

Objektno orijentirano programiranje 6


Kako organizirati program i mape za program u Javi?

Odrediti mapu u kojoj će se nalaziti program


⚫ Važno je da mapa ima adekvatne dozvole pisanja i čitanja
– Preporuka je izbjegavati razmake u nazivu
⚫ Npr. to može biti C:\OOP\podmapa ~/OOP/podmapa i slično
⚫ Unutar mape napraviti dva podddirektorija
– src za izvorni kôd: C:\OOP\podmapa\src
– bin:za izvršne datoteke C:\OOP\podmapa\bin
⚫ Unutar direktorija za izvorni kôd stvoriti strukturu koja odgovara strukturi
paketa, npr. za package hr.fer.oop.introduction
– src
– src\hr
– src\hr\fer\
– src\hr\fer\oop\
– src\hr\fer\oop\introduction
Objektno orijentirano programiranje 7
Kako utipkati program?

Za početak koristiti običan program za pisanje teksta (npr.


Notepad)
Datoteku imenovati HelloWorld.java
⚫ Paziti!!! Notepad, odnosno Windowsi ponekad doda ekstenziju .txt na
program (npr. HelloWorld.java.txt) što nije dobro
⚫ Vrlo važno: ime datoteke mora odgovarati imenu razreda (u ovome
primjeru HelloWorld). Pri tome treba paziti na velika i mala slova.
– class HelloWorld <-> HelloWorld.java
⚫ Jedan razred - jedna datoteka
– Osim za ugniježđenog razreda i razreda kojima nije eksplicitno definirana vidljivost
(o tome naknadno)
Program pohraniti u podmapu:
– src\hr\fer\oop\introduction

Objektno orijentirano programiranje 8


Prvi program u Javi - “Hello World” program
package hr.fer.oop.introduction; Naziv paketa
public class HelloWorld { Razred
public static void main(String[] args){ Metoda main
System.out.println("Hello World!");
}
}

Objektno orijentirano programiranje 9


Kako prevesti program u Javi?

Potrebno je biti pozicioniran u mapi koja sadrži bin i src mape


Potrebno je pokrenuti ovu naredbu (sve u jednom retku):
⚫ javac -d bin -sourcepath src
src\hr\fer\oop\introduction\HelloWorld.java
⚫ Parametrom –d bin određuje se mjesto za datoteke nastale prevođenjem
– Ako se ne navede stvorit će se na istom mjestu gdje su i .java datoteke
– Parametrom –sourcepath navodi se lokacija datoteka s izvornim kodom
– Potrebno ako se program sastoji od više datoteka
⚫ Često se koristi i parametar –cp za navođenje lokacije dodatnih .class
datoteka

Rezultat izvođenja gornje naredbe je datoteka HelloWorld.class


u mapi bin\hr\fer\oop\introduction

Objektno orijentirano programiranje 10


Potencijalni problemi

Ne postoji odredišna mapa → stvoriti je na disku

Nije moguće pronaći javac unutar radnog okruženja

→ JDK je instaliran?
→ Pogledati dodatak ovim predavanjima
(Podešavanje varijabli okruženja)

Objektno orijentirano programiranje 11


Kako pokrenuti prevedeni program?

Potrebno je pokrenuti ovu naredbu (sve u jednom retku)


⚫ java -cp bin
hr.fer.oop.introduction.HelloWorld
U gornjoj naredbi uočiti:
⚫ Ne piše se ekstenzija .class
⚫ Navodi se puno ime razreda
⚫ “-cp bin” određuje gdje se traži datoteka .class
– (to je kao varijabla okruženja PATH za virtualni stroj koji izvodi program)
U općem slučaju pokretanje programa se obavlja ovako:
⚫ java –cp staze puno.ime.razreda argumenti
⚫ “-cp staze” se može izostaviti ako postoji varijabla okruženja
CLASSPATH

Objektno orijentirano programiranje 12


“Hello World” program

Prilikom pokretanja programa prvo se poziva metoda main


public static void main(String[] args) {

}
Ako je program pozvan s argumentima iz naredbenog
retka (dodatnim riječima iza imena programa), oni se prosljeđuju
u program kao polje stringova
⚫ String[] args → polje stringova

Objektno orijentirano programiranje 13


Uobičajena razvojna okruženja (1)

Eclipse: https://www.eclipse.org/downloads/packages/
⚫ Odabrati Eclipse IDE for Enterprise Java Developers i raspakirati arhivu
na željeno mjesto
⚫ Trenutna inačica: Eclipse IDE 2019-09 R
⚫ Java već mora biti instalirana na računalu
Opcionalno
⚫ Alat za izradu UML dijagrama
⚫ ObjectAid UML Explorer
– http://www.objectaid.com/installation
– Samo za dijagram klasa
(besplatna verzija)

Objektno orijentirano programiranje 14


Napomena za Eclipse

Prilikom stvaranja novog projekta


potrebno je isključiti opciju
Create module-info.java
⚫ O modulima u Javi nećemo govoriti

Objektno orijentirano programiranje 15


Uobičajena razvojna okruženja (2)

NetBeans (trenutno 9.0): https://netbeans.apache.org


⚫ Raspakirati arhivu
⚫ U etc/netbeans.conf
izmijeniti redak:
#netbeans_jdkhome="/path/to/jdk"
u (primjerice)
netbeans_jdkhome="D:/Java/jdk-11"
Opcionalno
⚫ Dodatak za UML
⚫ Tools → Plugins
→ Available Plugins
→ easyUML
⚫ (trenutno nedostupan
za NetBeans 9)
Objektno orijentirano programiranje 16
Sintaksa Jave je u osnovi slična sintaksi C-a

Dobro poznavanje sintakse C-a može


jako pomoći u učenju Jave.
Predlaže se ponoviti i utvrditi
programiranje u C-u.

Objektno orijentirano programiranje 17


Tipovi podataka u Javi

Primitivni Objektni omotači Veličina primitivnih tipova


(wrappers)
byte Byte 1 oktet, signed

short Short 2 okteta, signed

int Integer 4 okteta, signed

long Long 8 okteta, signed

char Character 2 okteta, UTF-16 (Java 8), UTF-8


(Java 9+)
- String ?

boolean Boolean ? 1 bit / 1 oktet / 4 okteta (?)

float Float 4 okteta

double Double 8 okteta

Objektno orijentirano programiranje 18


Izrazi (neke specifičnosti Jave u odnosu na C)

Novi tip boolean:


⚫ Poprima vrijednosti true, false (različito od 0, 1)
if(boolean_izraz) {…}
⚫ U Javi je pogrešno pisati:
int v = 7; if(v) {...}
⚫ Također je pogrešno pisati:
int x = 7; while(x) { x--; }

Paziti pri korištenju brojeva s pomičnom točkom


⚫ Nikad:
double x = calculateSomething();
if(x==0.7) {}
⚫ Alternativa
if(Math.abs(x-0.7)<1E-6) {…}

Objektno orijentirano programiranje 19


Konverzija između primitivnih tipova i teksta

Potrebno je koristiti ugrađene funkcije za konverziju


⚫ te funkcije su statičke (detalji o tome što znači statičko će se učiti kasnije
u predavanjima)
⚫ s obzirom da svaki primitivni tip ima omotač (vidjeti prethodnu tablicu),
on se koristi za konverziju
Pogledati javadoc za dokumentaciju

String sBroj = "377.78";


double dBroj = Double.parseDouble(sBroj);
String sBroj2 = Double.toString(dBroj);

Objektno orijentirano programiranje 20


Oprez! Usporedba stringova (1)

stringovi se uspoređuju s equals


⚫ operator == uspoređuje radi li se o istoj referenci tj. istim objektima u memoriji
⚫ slično kao usporedba dva znakovna pokazivača u C-u
Iste znakovne konstante pojavljuju se samo jednom u memoriji!
s1==s2
Primjer: hr.fer.oop.introduction.WorkingWithStrings false
String s1 = new String("Some text.");
s1.equals(s2)
String s2 = new String("Some text.");
true
System.out.println("s1==s2 " + (s1 == s2));
System.out.println("s1.equals(s2) " + s1.equals(s2));

s3==s4 true
String s3 = "Some other text";
String s4 = "Some other text";
System.out.println("s3==s4 " + (s3 == s4));
System.out.println("s3.equals(s4) " + s3.equals(s4));

s3.equals(s4)
Objektno orijentirano programiranje 21
Primjer 1. Argumenti programa

Napisati program koji će na zaslon ispisati argumente koje


program dobiva prilikom pokretanja
package hr.fer.oop.introduction;
/**
* @author OOP course
* @version 1.0
*/
public class ArgumentDisplay { Svako polje ima svojstvo
public static void main(String[] args) { .length preko kojeg se dobiva
int argumentNum = args.length; broj predanih argumenata
for(int i = 0; i < argumentNum; i++) {
System.out.println("Argument " + (i+1) + ": " + args[i]);
}
}
}

Objektno orijentirano programiranje 22


Primjer 2. Predaja argumenta funkciji (1)

Napisati program koji će prilikom pokretanja primiti jedan argument (x),


te izračunati koliko iznosi e x razvojem u Taylorov red
Razvoj riješiti u zasebnoj funkciji
Program na zaslon mora ispisati rezultat
Kostur kôda:
package hr.fer.oop.introduction;
/**
* @author OOP course
* @version 1.0
*/
public class TaylorSeriesSum {
public static void main(String[] args) {

}
public static double ePowerX(double x) {

}
}
Objektno orijentirano programiranje 23
Primjer 2. Predaja argumenta funkciji (2)
public static void main(String[] args) { Ispis na izlaz za
if(args.length != 1) { pogrešku
System.err.println("A program needs argument x for e^x!");
System.exit(1);
} Poziv postupka u
double x = Double.parseDouble(args[0]); istoj klasi
System.out.println("Calculating e^x...");
double sum = ePowerX(x);
System.out.format("e ^ %.2f = %.2f%n", x, sum);
}
Formatirani ispis
... (slično kao u C-u)

Objektno orijentirano programiranje 24


Primjer 2. Predaja argumenta funkciji (3)
/**
* Calculates e^x for Taylor series, according to formula:
* e^x=1+x+(x^2/(2!))+(x^3/(3!))+(x^4/(4!))+...
* @param x argument of function e^x
* @return function result for the point x=number calculated as sum
* of first 10 numbers in Taylor series.
*/
public static double ePowerX(double x) {
double sum = 0.0;
double power = 1.0;
double factorial = 1.0;
sum += 1.0;
for(int i = 1; i < 10; i++) {
power = power * x;
factorial = factorial * i;
sum += power/factorial;
}
return sum;
}
Objektno orijentirano programiranje 25
Komentiranje koda

Komentiranje koda se radi iz dva razloga (i na dva načina)


⚫ Da se onome tko naknadno čita program olakša razumijevanje
– Obični komentari:
– /* komentar */
– // komentar
⚫ Komentari iz kojih se generira dokumentacija (javadoc komentari)
– /** komentar */
– Same razrede (klase)
– Pojedine metode
Javadoc komentari sadrže oznake oblika @naziv vrijednost, npr.
⚫ @author ime_autora, npr. @author OOP
⚫ @version verzija_razreda, npr. @version 1.0
⚫ @param ime_argumenta opis, npr. @param x broj čiji sinus treba izračunati
⚫ @return opis, npr. @return vraća sinus zadanog broja
Objektno orijentirano programiranje 26
Javadoc komentari
package hr.fer.oop.introduction;
/**
* @author OOP course
* @version 1.0
*/
public class TaylorSeriesSum {
/**
* This method is called once the program is run.
* Arguments are described below
* @param args Command line arguments.
*/
public static void main(String[] args) {
...
}
/**
* Calculates e^x for Taylor series, according to formula:
* e^x=1+x+(x^2/(2!))+(x^3/(3!))+(x^4/(4!))+...
* @param x argument of function e^x
* @return function result for the point x=number calculated as
* sum of first 10 numbers in Taylor series.
*/
public static double ePowerX(double x) {
...
Objektno orijentirano programiranje 27
Napredniji mehanizmi obrade ulaznih podataka

Za napredniju obradu ulaza postoji razred java.util.Scanner


⚫ Na vrhu programa potrebno dodati import java.util.Scanner;
Scanner sc = new Scanner(System.in);
int i = sc.nextInt(); double d = sc.nextDouble();
String s = sc.nextLine();

Scanner sc = new Scanner(new File("myNumbers"));


while (sc.hasNextLong()) {
long aLong = sc.nextLong();
}

String input = "1 fish 2 fish red fish blue fish";


Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close(); // ovo zatvara ulazni tok
Objektno orijentirano programiranje 28
Napredniji mehanizmi generiranja izlaznih podataka

Za detalje oko formatnog stringa pogledati dokumentaciju:


⚫ https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Fo
rmatter.html#syntax

System.out.printf("%s%n", "bla");

System.out.format("%s%n", "bla");

String novi = String.format("%4$s %3$s %2$s %1$s %4$s


%3$s %2$s %1$s",
"a", "b", "c", "d");
//u novi je upisano: "d c b a d c b a"

Objektno orijentirano programiranje 29


Primjer 3. hr.fer.oop.introduction.ReadDecimalFromKeyboard

package hr.fer.oop.introduction; Napisati program koji će s tipkovnice čitati


import java.util.Scanner; decimalni broj po broj i računati njihovu
... sumu, sve dok se upisuju pozitivni brojevi
public class ReadDecimalFromKeyboard{
public static void main(String[] args) {
...
double sum = 0.0;
Scanner sc = new Scanner(System.in);
while(true) {
double number = sc.nextDouble();
if(number<=0) break;
sum += number;
}
System.out.format("Sum is: %f%n", sum);
sc.close();
}
}

Objektno orijentirano programiranje 30


Dodatci uz predavanja

Dodatni zadaci za vježbu uz 1. predavanje nalaze se u


1a (1.1) Dodatni zadaci uz prvo predavanje.pdf
Dodatak vezan za podešavanje varijabli okruženja nalazi se u
1b (1.2) Podešavanje varijabli okruženja.pdf

Objektno orijentirano programiranje 31

You might also like