12. oo programiranje, java
Post on 29-Jan-2017
262 Views
Preview:
TRANSCRIPT
OTVORENO RA^UNARSTVOo OO PROGRAMIRANJE I JAVA
MARIO @AGAR
Otvoreno računarstvo
Otvoreno računarstvoo OO programiranje i Java
Mario Žagar
Otvoreno računarstvo - OO programiranje i Java3
Za domaću zadaću:o Proučiti jezik Javuo Poveznice (korisne i potrebne za lab. vježbe):
o J2SE 6 dokumentacijahttp://java.sun.com/reference/docs/
o Java Tutorialhttp://java.sun.com/developer/onlineTraining/
o Poveznice (korisne):o Razvojni alat JDK i JRE
http://java.sun.com o Knjiga "Thinking in Java" (u elektroničkom obliku):
http://www.mindview.net/Books/TIJ/ o I sve ostalo što dođe pod ruku :-)
Otvoreno računarstvo - OO programiranje i Java4
Struktureo Ako trebamo složeni tip podatka u jeziku C,
koristimo strukture:typedef struct _pravokutnik{ int a; int b; char *opis;} pravokutnik;
o Problem: svatko može promijeniti vrijednost člana strukture (npr. postaviti negativnu duljinu stranice) o Rješenje: napisati posebnu funkciju za postavljanje
vrijednosti, koja će prvo provjeriti vrijednosto kako osigurati da svi koriste tu funkciju i ne pristupaju članu
strukture izravno?
Otvoreno računarstvo - OO programiranje i Java5
Struktureo Problem: kako specijalizirati strukturu
o Kvadrat je poseban slučaj pravokutnika, s dvije iste stranice?
o Struktura jednaka pravokutniku + dodatno svojstvo o Kako to ostvariti strukturama?
Otvoreno računarstvo - OO programiranje i Java6
Objektno orijentirano programiranjeo Drugačiji način razmišljanja
strukture podataka i algoritmi <-> objekt
o OBJEKT – skup varijabli i s njima povezanih funkcijao oponaša objekt iz stvarnog svijeta o pamti stanje i modelira ponašanje
o RAZRED, KLASA – nacrt po kojem se stvara objekto sadrži varijable i svojstvene funkcije (metode), postoji
kontrola pristupa varijablama i funkcijama
o OBJEKT = primjerak, instanca razreda
Otvoreno računarstvo - OO programiranje i Java7
Objektno orijentirano programiranjeo Principi objektno orijentiranog programiranja
(OOP):o apstrakcija (abstraction)o enkapsulacija, učahurivanje (encapsulation)o nasljeđivanje (inheritance)o polimorfizam, višeobličje (polymorphism)
Otvoreno računarstvo - OO programiranje i Java8
Apstrakcijao Primjer automobila:
o država - kupovina, carina, PDV, registracija, brojevi, vlasništvo, porezi, ...
o vlasnik - potrošnja, servisi, pranje, ...o mehaničar - vlasnik, dijelovi, kilometri, cijena rada, ...
o Sve su to primjeri apstrakcije podatakao Apstrakcija - proces odbacivanja nepotrebnih
detalja o objektu, a zadržavanje onih podataka koji ga dovoljno opisuju
Otvoreno računarstvo - OO programiranje i Java9
Enkapsulacijao Korak dalje od apstrakcije je prepoznavanje
važnosti operacija nad podacimao podaci i operacije nad njima postaju cjelinao cilj je skrivanje implementacije (korisniku se na uvid
daje samo sučelje)o Podaci i operacije (metode, postupci - methods)
zajedno čine razred ili klasu (class) o Varijablu tipa određenog razreda zovemo objektom
ili instancom (instance)
Otvoreno računarstvo - OO programiranje i Java10
Enkapsulacijao Metode = funkcije koje pripadaju razredu (ime iz
Smalltalk-72) (plan, put, shema, postupak)o OOP bi se trebalo zvati Programiranje temeljeno
na razredima (Class-Based Programming - CBS)o primjer (tko zna što ovdje piše?):
DbrVmdn!a a ao
Dobar Vam dan!
Otvoreno računarstvo - OO programiranje i Java11
Nasljeđivanjeo Nasljeđivanje je proširivanje razreda (klase) koji je
već definiran o Preuzimanje iz “prošlosti”
o npr: Automobil ima upravljač. Golf je automobil s četiri kotača. Golf naravno ima upravljač, iako to nije posebno naglašeno.
o Pogodno za dodavanje svojstava (specifičnosti, detalja, novih inačica)
o Java i C# ne dozvoljavaju višestruko nasljeđivanje, umjesto toga implementiraju se sučelja (interface)
Otvoreno računarstvo - OO programiranje i Java12
Polimorfizamo Višeobličje, dijeljenje imenao Isto ime za različite metodeo Preopterećivanje (overloading)
o statičko razrješavanje konflikta imenao isto ime za različite metode unutar razreda uz različiti
broj parametarao Nadjačavanje (overriding)
o pravi polimorfizamo dinamičko razrješavanje
o metoda unutar podklase s istim imenom i “potpisom” važnija je od metode iz nadređene klase
o ne može se predvidjeti pri prevođenju već tijekom izvođenja
Otvoreno računarstvo - OO programiranje i Java13
Zadatako Napisati program koji računa površine raznih
geometrijskih likovao Zajednička karakteristika svih geometrijskih likova
je da sami "znaju" izračunati svoju površinuo Likovi sadrže podatke koji ih opisuju i karakteristični
su za svaki lik posebno.
Otvoreno računarstvo - OO programiranje i Java14
Zadatako Program treba iz datoteke pročitati oznaku tipa lika
i stvoriti objekt odgovarajućeg razreda (klase) te mu prenijeti parametre lika zapisane u liniji iza oznake tipa lika.
o Nakon što se svi podaci iz datoteke pročitaju i stvore objekti odgovarajućeg razreda, redom se ispisuju opisi likova (tip i parametri), njihove površine te zbroj površina koji zauzimaju svi stvoreni likovi.
Otvoreno računarstvo - OO programiranje i Java15
Zadatak - ulazUlazna datoteka:K20P10 40C40E50 30T30 40 50J20K20C10P5 8K5
O b j e k t P o d a c i u d a t o t e c i P r i m j e r p r a v o k u t n i k s t r a n i c e a i b 1 0 2 0 k v a d r a t s t r a n i c a a 1 0 t r o k u t s t r a n i c e a , b , c 1 0 2 0 3 0 j e d n a k o s t r a n i č a n t r o k u t s t r a n i c a a 1 0 e l i p s a r a d i j u s i r 1 i r 2 1 0 2 0 k r u g r a d i j u s r 1 0
O b j e k t O z n a k a v r s t e p r a v o k u t n i k P k v a d r a t K t r o k u t T j e d n a k o s t r a n i č a n t r o k u t J e l i p s a E k r u g C
Otvoreno računarstvo - OO programiranje i Java16
Prvo ...o Definirajmo osnovni apstraktni razred Liko Nasljeđuju ga objekti koji predstavljaju
geometrijske likove (Elipsa, Pravokutnik, Trokut):
Otvoreno računarstvo - OO programiranje i Java17
Nasljeđivanjeo Posebni slučajevi (kvadrat je posebni slučaj
pravokutnika, jednakostraničan trokut trokuta, krug elipse):
Otvoreno računarstvo - OO programiranje i Java18
Enkapsulacijao Svaki lik mora znati izračunati vlastitu površinuo Svaka površina se računa drugačijeo -> računanje površine je zajedničko ponašanje ->
mora biti opisano osnovnim razredom -> metodom Lik.izracunajPovrsinu()
G e o m e t r i j s k i l i k F o r m u l a P r a v o k u t n i k a * b K v a d r a t a * a T r o k u t s q r t [ s ( s - a ) ( s - b ) ( s - c ) ] , s = ( a + b + c ) / 2
( H e r o n o v a f o r m u l a ) J e d n a k o s t r a n i č a n t r o k u t
a * a * s q r t ( 3 ) / 4
E l i p s a r 1 * r 2 * p i K r u g r * r * p i
Otvoreno računarstvo - OO programiranje i Java19
Otvoreno računarstvo - OO programiranje i Java20
Opis razredao "redom se ispisuju opisi likova (tip i parametri),"o osim računanja površine, svaki lik mora imati i opiso Java – osnovni razred (java.lang.Object) ima
metodu toString(), koju treba nadjačati:
Otvoreno računarstvo - OO programiranje i Java21
Otvoreno računarstvo - OO programiranje i Java22
Kôd, pokažite kôd ...import java.util.*;import java.io.*;public abstract class Lik{ abstract double izracunajPovrsinu();
...}
import java.util.*;import java.io.*;public abstract class Lik{ abstract double izracunajPovrsinu();
...}
import java.util.*;public class Pravokutnik extends Lik{ double a,b; ... double izracunajPovrsinu() { return a*b; } public String toString() { return "Pravokutnik, a="+a+", b="+b+"\t"); }}
import java.util.*;public class Pravokutnik extends Lik{ double a,b; ... double izracunajPovrsinu() { return a*b; } public String toString() { return "Pravokutnik, a="+a+", b="+b+"\t"); }}
Lik.java
Pravokutnik.java
Otvoreno računarstvo - OO programiranje i Java23
import java.util.*;import java.lang.Math;public class Trokut extends Lik{ double a,b,c; double izracunajPovrsinu(){ double s=(a+b+c)/2; return Math.sqrt(s*(s-a)*(s-b)*(s-c)); } public String toString(){ return "Trokut, a="+a+",b="+b+",c="+c+ "\t"; }}
import java.util.*;import java.lang.Math;public class Trokut extends Lik{ double a,b,c; double izracunajPovrsinu(){ double s=(a+b+c)/2; return Math.sqrt(s*(s-a)*(s-b)*(s-c)); } public String toString(){ return "Trokut, a="+a+",b="+b+",c="+c+ "\t"; }}
import java.lang.Math;import java.util.*;public class Elipsa extends Lik{ double r1,r2; double izracunajPovrsinu(){ return r1*r2*Math.PI; } public String toString(){ return "Elipsa, r1="+r1+", r2="+r2+"\t"; }}
import java.lang.Math;import java.util.*;public class Elipsa extends Lik{ double r1,r2; double izracunajPovrsinu(){ return r1*r2*Math.PI; } public String toString(){ return "Elipsa, r1="+r1+", r2="+r2+"\t"; }}
Trokut.java
Elipsa.java
Otvoreno računarstvo - OO programiranje i Java24
Stvaranje objekatao Konstruktor:
o posebna metoda za stvaranje objektao istog naziva kao i klasao nema povratnog tipa
o Svaki Javin razred implicitno nasljeđuje razred java.lang.Object
o java.lang.Object definira konstruktor bez parametarao svaki Javin razred ima podrazumijevani konstruktor, bez
parametarao nije ga potrebno navoditi
Otvoreno računarstvo - OO programiranje i Java25
Konstruktoro Svaki Javin razred može definirati dodatne
konstruktore, s različitim potpisom:public class Pravokutnik extends Lik{ double a,b; public Pravokutnik() {
//podrazumijevani konstruktor (samo za primjer)a=1; b=2;
} public Pravokutnik(String redak) {
Vector args=new Vector(); args=parsiraj(redak,2);
this.a=((Double)(args.get(0))).doubleValue(); this.b=((Double)(args.get(1))).doubleValue();
}...
}
Otvoreno računarstvo - OO programiranje i Java26
Konstruktoro Poziv konstruktora:
Pravokutnik pk1=new Pravokutnik();Pravokutnik pk2=new Pravokutnik("3 4");
o Operator new:o alocira memorijski prostor za novi objekto poziva konstruktoro vraća referencu na novostvoreni objekt
Otvoreno računarstvo - OO programiranje i Java27
Zadatak, dodatnoo Konstruktor svakog razreda mora omogućiti unos
parametara objekta preko varijable tipa java.lang.String
o Unose se podaci učitani iz datoteke – duljine stranica odvojene razmakom o npr. konstruktor razreda Trokut prima niz od tri broja
odvojena prazninama, stranice a, b, c: 10 20 30
Otvoreno računarstvo - OO programiranje i Java28
Zadatak, dodatnoo Glavna metoda programa treba otvoriti datoteku
čije je ime zadano kao parametar komandne linije, stvoriti vektor (koristiti razred java.util.Vector) koji će sadržavati sve likove i popuniti ga objektima koji reprezentiraju geometrijske likove.
o Za svaki lik pročitati redak sa zapisom vrste lika i redak s parametrima, stvoriti odgovarajući objekt i prenijeti mu varijablu tipa java.lang.String s parametrima lika.
Otvoreno računarstvo - OO programiranje i Java29
Zadatak, dodatnoo Kad su svi podaci uneseni, ispisuje se opis i površina
svakog pojedinog lika te ukupna površina svih likova u datoteci. Ove zadatke obaviti slijednom obradom svih objekata pohranjenih u vektoru objekata
Otvoreno računarstvo - OO programiranje i Java30
/Primjeri/Likovi
Otvoreno računarstvo - OO programiranje i Java31
Metoda maino Definirat ćemo novi razred, koji će sadržavati samo
metodu main:public class Citac { public static void main(String [] args)
{...
}}
o Metoda main:o poziva se prilikom pokretanja programao prima argumente iz komandne linije preko polja
objekata tipa String (args u gornjem primjeru)
Otvoreno računarstvo - OO programiranje i Java32
Još kôdao Učitavamo podatke i instanciramo objekte:
public class Citac {public static void main(String [] args) {
... String tmp=null, linija=null;Vector<Lik> kontejner= new Vector<Lik>();while(true){
tmp = breader.readLine();linija = breader.readLine();
switch(tmp.charAt(0)){case 'P':
kontejner.add(new Pravokutnik(linija)); break; case 'K': kontejner.add(new Kvadrat(linija)); break; case 'T':
//itd ... // -> nastavak
NE programirati ovako!!!
[error handling izostavljen zbog manjka prostora!]
poziv konstruktora
Otvoreno računarstvo - OO programiranje i Java33
o Ispisujemo površine i ukupnu površinu:
int ukupna=0for(int i = 0; i < kontejner.size(); i++){
povrsina=kontejner.get(i).izracunajPovrsinu();ukupna+=povrsina;System.out.print(kontejner.get(i));System.out.println(", povrsina=[" + povrsina + "]cm^2" );
}System.out.println("Ukupna povrsina = [" +ukupna + "]cm^2");
}}
Otvoreno računarstvo - OO programiranje i Java34
Pokretanjeo Svaki razred u posebnoj datoteci, istog imena kao i
ime razreda (s nastavkom .java).o Prevoditelj se pokreće naredbom:
'javac <datoteke s izvornim kodom>'o nakon čega nastaju .class datoteke koje sadrže
prevedeni Java program. o Program se pokreće naredbom
'java <razred s metodom main()> <parametri>'
Otvoreno računarstvo - OO programiranje i Java35
I sve ovo zbog:
Otvoreno računarstvo - OO programiranje i Java
Pitanja?
top related