370 likes | 484 Views
Begreber og Redskaber 5. BRP. Plan for idag. Overblik over klasser,objekter,nedarvning Repetition fra Dat A/Indledende programmering Centrale begreber om nedarvning Et par ord om objekt-orientering Håndkøring af programmer. Hvorfor objekter og klasser.
E N D
Plan for idag • Overblik over klasser,objekter,nedarvning • Repetition fra Dat A/Indledende programmering • Centrale begreber om nedarvning • Et par ord om objekt-orientering • Håndkøring af programmer
Hvorfor objekter og klasser • En samling data og operationer på det • Opbygning af sine egne datatyper • Modellering af virkelige objekter • Hierarkisk opbygning af program • Det kan forstås på mange niveauer
Eksempel class A{ int i,j; } .. A a; //a kan have hægte til obj a = new A(); // a peger på obj. a.i = 1; //dot-notation
Oprettelse af objekter • Hvis felter skal initialiseres under oprettelse kan det ske i en konstruktør class A{ int i,j; A(){ i = 0; j = 1; } }
Oprettelse • Argumenter til oprettelsen class A{ int i,j A(int x, int y){ i=x; j = y;} } .... A a = new A(2,3);
Hægter til objekter • Variable med klasse som type er hægter til objekter – initielt null class A{ ... } A a = new A(); A b = a; a A obj. b
Metoder i klasser • Klasser kan indeholde metoder - dvs underprogrammer class A{ int i,j; void udskriv(){ System.out.println(i+”,”+j);} } A a = new A(); a.udskriv();
Funktioner • Metoder kan have returværdi class A{ int i,j; int iogj(){return i+j; } } A a = new A(); System.out.println(a.iogj());}
public/private • Synlighed: Felter og metoder kan være private for en klasser – usynlige udenfor class A{ private int i,j; public int getI(){return i;} public void setI(int x){i=x;} } // a.i=3 ej ok , a.setI(3) ok
Accessor/mutator • God stil: Felter gøres private • Værdier hentes med accessormetoder • Felter ændres med mutatormetoder accessor: public int getI(){return i;} mutator public void setI(int x){i=x;}
Static/dynamic • Static felter og metoder hører til klassen – ikke til objekter • Et ”static” felt per klasse • Et ”dynamic” felt per objekt • static metoder må ikke bruge dynamiske felter • static metoder kan kaldes før objekter er oprettet
Eksempel public static void main(String args[]){} • Er kendt uden for klassen (public) • Kan kaldes uden at der er objekter (static) • Skal ikke returnere en værdi (void)
Eksempel: statiske felter class A{ static private int nr=0; A(){nr++;} static int getNr(){return nr;} } System.out.println(A.getNr()); A a = new A(); System.out.println(a.getNr());
Metoder og parametre class A{ int i=0; ... } void p1(int i){i=3;} void p2(A a){a.i=3;} int j=2; p1(j); // j==2 A b=new A(); p2(b); // b.i==3
Virkefelt • Java er blokstruktureret (som Pascal, C...) • Navne kan genbruges i forskellige blokke class A{ int i; void p(){ int i; ...} } Klassen har felt i, metoden lokal variabel i
this refererer til objektet class A{ private int i; void setI(int i){this.i=i;} int getI(){int i=this.i; return i;} void addToI(int j){i=i+j;} }
Overlæsning • Man kan have flere metoder med samme navn – bare argumenttyper er forskellige p(String s){...} p(int i){ ... } p(A a){ ...} p(”hej”); p(3); p(new A());
toStringmetoder Lad alle klasser have en metode: public String toString(){ ...} som returnerer tekstuel version af objektet Bruges en klasse som tekststreng kaldes denne metode: System.out.println(”a = ”+a);
Eksempel: dato class Date{ //felter private int day,month,year; //konstruktør Date(int day, int month, int year){ setDay(day); setMonth(month); setYear(year);} Date(int day, int month){ setDay(day); setMonth(month); setYear(..);} //mutator void setDay(int day){this.day=day;} void setMonth(int month){this.month=month;} void setYear(int year){this.year=year;}
//accessor int getDay(){return day;} int getMonth(){return month;} int getYear(){return year;} //toString public String toString(){ return day + ”/”+month+”-”+year;} //operationer Date imorgen(Date d){ .. } Date imorgen(){ .. } //testing public static void main(){ Date d = new Date(32,13,1999); Date d1= new Date(21,9,1999); Date d2= d1.imorgen(); }
Datamodellering • Hvad er en dato? Dag, måned, år plus operationer som imorgen, igår, mm • Skal der være mutator metoder? • Kan en dato ændres? • Check i konstruktør?
Nedarvning class A{ int i; } class B extends A { int j;} //B er subtype af A A a = new A(); a.i = 1; B b = new B(); b.i = 1; b.j = 2; A aa = new B(); aa.i = 1; //ej aa.j // ej B bb = new A();
Subtyper A a = new A(); a.i = 1; B b = new B(); b.i = 1; b.j = 2; A aa = new B(); aa.i = 1; //ej aa.j b = (B) aa; // casting - typecheck b = (B) a; // køretidsfejl if(aa instanceof B) b = (B) aa; //typecheck
Subtyper A a; B b = new B(); a = b; // ingen casting b = (B) a // casting nødvendig A er supertype for B, B subtype af A Værdier af subtype må bruges som supertype
Overskrivning class A{ void hej(){System.out.println(”AA”);} } class B extends A{ void hej(){System.out.println(”BB”);} } A a = new A(); a.hej(); // AA B b = new B(); b.hej(); // BB A c = new B(); c.hej(); // BB I B: void hej1(){super.hej();} b.hej1(); // AA ((B) c).hej1(); // AA
Håndkøring Application.main args = null i=1 j=3 public class Application{ public static void main(String args[]){ int i,j; i=1; j=3; • while(j>0){ i=i*2; j=j-1; } } }
Håndkøring Application.main args = null i=1 2 j=3 2 public class Application{ public static void main(String args[]){ int i,j; i=1; j=3; while(j>0){ i=i*2; j=j-1; • } } }
Håndkøring Application.main args = null i=1 2 4 j=3 2 1 public class Application{ public static void main(String args[]){ int i,j; i=1; j=3; while(j>0){ i=i*2; j=j-1; • } } }
Håndkøring Application.main args = null i=1 2 4 8 j=3 2 1 0 public class Application{ public static void main(String args[]){ int i,j; i=1; j=3; while(j>0){ i=i*2; j=j-1; • } } }
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; • a=new A(); b=new A(); a.x=1; b.x=2; t=a; a=b; b=t ;}}
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; a=new A(); • b=new A(); a.x=1; b.x=2; t=a; a=b; b=t ;}} A X=0
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; a=new A(); b=new A(); • a.x=1; b.x=2; t=a; a=b; b=t ;}} A X=0 A X=0
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; a=new A(); b=new A(); a.x=1; b.x=2; • t=a; a=b; b=t ;}} A X=0 1 A X=0 2
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; a=new A(); b=new A(); a.x=1; b.x=2; t=a; • a=b; b=t ;}} A X=0 1 A X=0 2
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; a=new A(); b=new A(); a.x=1; b.x=2; t=a; a=b; • b=t; }} A X=0 1 A X=0 2
Håndkøring Application.main args = null a= b= t= class A{int x;} public class Application { public static void main(String args[]) {A a,b,t; a=new A(); b=new A(); a.x=1; b.x=2; t=a; a=b; b=t; • }} A X=0 1 A X=0 2