Presentation laddar. Vänta.

Presentation laddar. Vänta.

DA7351 Programmering 1 Föreläsning Klass Cirkel, Punkt Klassen Object Arv, överskuggning Polymorfism Exempel på arv.

Liknande presentationer


En presentation över ämnet: "DA7351 Programmering 1 Föreläsning Klass Cirkel, Punkt Klassen Object Arv, överskuggning Polymorfism Exempel på arv."— Presentationens avskrift:

1 DA7351 Programmering 1 Föreläsning Klass Cirkel, Punkt Klassen Object Arv, överskuggning Polymorfism Exempel på arv

2 DA7351 Programmering 1 Exempel på arv En människa är ett däggdjur. En människa har alla egenskaper som ett däggdjur har (ärver dessa egenskaper). En människa är en specialisering av ett däggdjur. Ett däggdjur är en generellare klassificering än människa

3 DA7351 Programmering 1 Min katt Abbadon är ett objekt av klassen Katt Ryggradsdjur Däggdjur MänniskaKatt Abstrakt klass Abstrakta klasser måste specialiseras innan ett verkligt objekt kan skapas.

4 DA7351 Programmering 1 Klassen Object Alla klasser i java ärver av klassen Objekt som har ett antal metoder, bl.a. (se dokumentationen över Javas API) public boolean equals(Object obj) Indicates whether some other object is "equal to" this. public Object getClass() Returns the runtime class of an object. public String toString() Returns a string representation of the object..

5 DA7351 Programmering 1 Cirkel med mittpunkt En Cirkel som har ett objekt Punkt Cirkel - radie : int - mittPunkt : Punkt + getRadie() : double + setRadie(double) + getMittPunkt() : Punkt + setMittPunkt(double,double ) + area() : double + jämförArea() : double + compareTo(Object) : int + equals(Object) : boolean + toString() : String Punkt - xKord : double - yKord : double + getX() : double + getY() : double + equals(Object) : boolean + toString() : String har Cirkel Punkt

6 DA7351 Programmering 1 Metoden equals i Punkt public boolean equals(Object o){ Punkt annanPunkt= (Punkt) o; if ((xKord==annanPunkt.getX()) && (yKord==annanPunkt.getY()) ) { return true; } else { return false; } } Metoden jämför två objekt av typen Punkt. Metoden returnerar true, dvs. två punkter är samma, om de har samma x-koordinat: (xKord==annanPunkt.getX()) och: && samma y-koordinat: (yKord==annanPunkt.getY()) Metoden kan skrivas kortare: public boolean equals(Object o){ Punkt annanPunkt= (Punkt) o; return ( (xKord==annanPunkt.getX()) && (yKord==annanPunkt.getY()) ); }

7 DA7351 Programmering 1 Objekt som parameter // ur TestaCirkelMedPunkt - main double areaSkillnad; Cirkel cirkel1=new Cirkel(1,0,0); Cirkel cirkel2=new Cirkel(3,1,2); areaSkillnad=cirkel1.jämförArea(cirkel2); // ur klassen Cirkel public double jämförArea(Cirkel annanCirkel){ return this.area()-annanCirkel.area(); } this-referensen refererar till aktuellt objekt, dvs det objekt som används vid anropet av metoden. I det här fallet är cirkel1 det aktuella objektet. annanCirkel refererar till argumentet vid anropet till jämförArea. I det här fallet är cirkel2 argument. Cirkel radie = 1 mittpunkt = (0,0) Cirkel radie = 3 mittpunkt = (1,2) TestaCirkelMedPunkt

8 DA7351 Programmering 1 Metoden compareTo i Cirkel // ur klassen Cirkel public int compareTo(Object o){ Cirkel annanCirkel= (Cirkel) o; // explicit typkonvertering till Cirkel-referens double radieSkillnad = radie - annanCirkel.getRadie(); // skillnad i radie if (radieSkillnad>0) return 1; // aktuella objektet störst radie else if (radieSkillnad<0) return -1; // argumentet störst radie else return 0; // lika radie } // ur klassen TestaCirkelMedMittpunkt : if (cirkel1.compareTo(cirkel2)>0) { System.out.println("Cirkel 1 har "+Output.format(areaSkillnad,0,2)+…); } else if (cirkel1.compareTo(cirkel2)<0) { System.out.println("Cirkel 2 har "+Output.format(-areaSkillnad,0,2)+…); } else System.out.println("Cirkel 1 har samma area som cirkel 2."); // Körning av main-metodrn ger resultatet Cirkel 2 har a.e. större area än cirkel 1.

9 DA7351 Programmering 1 // cirkel3 ges samma storlek (radie=3) och läge (mittpunkt = (1,2)) som cirkel2 Cirkel cirkel3 = new Cirkel(3,1,2); // vad blir resultatet om Cirkel-objekten jämförs med ”==”? System.out.print("Skriver ut vad \"cirkel2==cirkel3\" ger för svar: "); System.out.println(cirkel2==cirkel3); // vad blir resultatet om Cirkel-objekten jämförs med ”Cirkel.equals”? System.out.print("Skriver ut vad \"cirkel2.equals(cirkel3)\" ger för svar: "); System.out.println(cirkel2.equals(cirkel3)); Körresultat Skriver ut vad "cirkel2==cirkel3" ger för svar: false Skriver ut vad "cirkel2.equals(cirkel3)" ger för svar: true Kommentar == kontrollerar om två variabler refererar till samma objekt. Det gör inte cirkel2 och cirkel3. equals-metoden i Cirkel-klassen kontrollerar om två variabler refererar till Cirkel-objekt med samma storlek och läge equals-metoden i Object-klassen utför samma test som ==. Detta kan du kontrollera genom att bortkommentera equals-metoden i Cirkel-klassen, kompilera Cirkel-klassen och sedan köra programmet. Metoden equals och ==

10 DA7351 Programmering 1 Leta efter objekt i ett fält med hjälp av equals // LetaCirkel - main Cirkel[] cirklar=new Cirkel[3]; Cirkel cirkel=new Cirkel(1,0,0); initieraCirklar(); : // LetaCirkel - leta if( cirklar[i].equals(cirkel) ) cirklar Cirkel radie = 1 mittpunkt = (0,0) radie = 2 mittpunkt = (0,0) Cirkel radie = 1 mittpunkt = (1,1) Cirkel radie = 1 mittpunkt = (0,0) cirkel LetaCirkel

11 DA7351 Programmering 1 Arv Student ärver av Person (extends) Person -String namn +getNamn:String +setNamn(String) +toString:String Student -String namn -String skola +getSkola:String +setSamn(String) +toString:String Student ärver alla instansvariablerna från Person. Student ärver alla instansmetoderna från Person Student skapar ny instansvariabel och nya metoder. Student överskuggar metoden toString Person Student

12 DA7351 Programmering 1 Arv En student är en person. Person pers1 = new Student("Anna Olsson", "Malmö högskola"); Person pers2 = new Person("Ylva Falk"); Student pers3 = new Student(”ingvar Ek”, ”Malmö högskola”); En referens till Student-objekt kan även lagras i en personlista. Person[] personLista = new Person[2]; personLista[0] = new Student("Anna Olsson","Malmö högskola"); personLista[1] = new Person("Ylva Falk");

13 DA7351 Programmering 1 Åtkomst Person pers1= new Student("Anna Olsson","Malmö högskola"); String personensNamn=pers1.getNamn(); // fungerar String personensSkola=pers1.getSkola();// fungerar ej ! pers1 är referens till Person-objekt. Det går därför endast att anropa metoder som tillhör Person-klassen. Trots att objektet är ett Student- objekt. Men eftersom pers1 egentligen referererar till ett Student-objekt går det att typkonvertera till referens till Student: Student stud1=(Student) pers1;// typ konvertering String personensSkola=stud1.getSkola(); // fungerar

14 DA7351 Programmering 1 Polymorfism och dynamisk bindning Polymorfism betyder mångformighet. Person pers1 = new Student("Anna Olsson","Malmö högskola"); Person pers2 = new Person("Ylva Falk"); pers1.toString(); ger strängen ”class: f16.Student Namn: Anna Olsson Skola: Malmö högskola” pers2.toString(); ger strängen ”class: f16.Person Namn: Ylva Falk” När programmet körs undersöks det om klassen har en metod toString, har den det så körs den metoden annars undersöks superklassen, har den toString metoden så körs den. I exempeln ovan har objektet som pers1 refererar till en toString- metod. Det är denna som används. Dynamisk bindning, programmet vet inte förrän det körs vilken metod som ska anropas. (vilken av alla toString metoderna). Programmet vet inte vilken typ av Person person1 är, förrän körningen då ett objekt har skapats.

15 DA7351 Programmering 1 public class Student extends Person{ private String skola; public Student() { this("okänd skola"); } public Student(String skola){ this.skola=skola; } public Student(String namn,String skola){ super(namn); this.skola=skola; } // andra metoder } Vad händer när en konstruktor körs? Instansvariablerna nollställs (här skola = null) Anrop till egen konstruktor this(..) eller till superklass konstruktor super(..). Om anrop till super/this saknas då anropas super(). Det innebär att en konstruktor i superklassen alltid anropas. Initiering görs av instansvariabler. Koden i konstruktorn exekveras. Klassen Student

16 DA7351 Programmering 1 public class Person { private String namn; public Person() { this("Namn okänt"); } public Person(String namn) { this.namn=namn; } : } public class Student extends Person{ private String skola; public Student(String skola){ this.skola=skola; } : } Student stud1=new Student(”Malmö högskola”); 1.Konstruktorn Student(”Malmö högskola”) anropas. 2.Instansvariablen skola=null 3.Konstrukton Person() anropas 4.Instansvariablen namn=null 5.Konstruktorn Person(”Namn okänt”) anropas 6.Instansvariablen namn=”Namn okänt” 7.Instansvariablen skola=”Malmö högskola” Exempel: Konstruktor körs

17 DA7351 Programmering 1 Klasshierarki Person StudentAnstalld Programstudent namn skola namn skola program inskrivningsÅr namn arbetsgivare lön

18 DA7351 Programmering 1 Klassen ProgramStudent public class ProgramStudent extends Student { private String program; private int antagningsÅr; public ProgramStudent() { program="okänt program"; antagningsÅr=0; } public ProgramStudent(String namn, String skola, String program, int antagningÅr) { super(namn,skola); this.program=program; this.antagningsÅr=antagningsÅr; } //andra metoder }

19 DA7351 Programmering 1 TestaArv1 public static void main(String[] args) { Person p1 = new Person("Anna Olsson"); Person p2 = new Person(); Anstalld a1 = new Anstalld("Olof Andersson","Eriksson",40000); Anstalld a2 = new Anstalld(); a2.setNamn("Ola Person"); ProgramStudent ps1 = new ProgramStudent("Lisa Eriksson", "MAH", "Programvaruteknik", 2004); Student s1=new Student(); System.out.println(p1); System.out.println(p2); System.out.println(a1); System.out.println(a2); System.out.println(ps1); System.out.println(s1); } Körresultat class f16.Person: Namn: Anna Olsson class f16.Person: Namn: okänt namn class f16.Anstalld: Namn: Olof Andersson class f16.Anstalld: Namn: Ola Person class f16.ProgramStudent: Namn: Lisa Eriksson Skola: MAH class f16.Student: Namn: okänt namn Skola: okänd skola TestaArv1

20 DA7351 Programmering 1 TestaArv 2 public static void main(String[] args) { Person[] personLista = new Person[6]; personLista[0] = new Person("Anna Olsson"); personLista[1] = new Person(); personLista[2] = new Anstalld("Olof Andersson","Eriksson",40000); personLista[3] = new Anstalld(); personLista[3].setNamn("Ola Person"); personLista[4] = new ProgramStudent("Lisa Eriksson", "MAH", "Programvaruteknik", 2004); personLista[5] = new Student(); for (int i=0;i


Ladda ner ppt "DA7351 Programmering 1 Föreläsning Klass Cirkel, Punkt Klassen Object Arv, överskuggning Polymorfism Exempel på arv."

Liknande presentationer


Google-annonser