Ladda ner presentationen
1
Föreläsning Klass Cirkel, Punkt Klassen Object Arv, överskuggning
Polymorfism Exempel på arv
2
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
Ryggradsdjur Abstrakt klass Däggdjur Abstrakt klass Människa Katt
Min katt Abbadon är ett objekt av klassen Katt Ryggradsdjur Abstrakt klass Däggdjur Abstrakt klass Människa Katt Abstrakta klasser måste specialiseras innan ett verkligt objekt kan skapas.
4
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
Cirkel med mittpunkt har 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
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
Objekt som parameter Cirkel Cirkel TestaCirkelMedPunkt
// 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
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
Metoden equals och == Körresultat
// 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.
10
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 Cirkel radie = 1 mittpunkt = (0,0) radie = 1 mittpunkt = (1,1) Cirkel radie = 2 mittpunkt = (0,0) Cirkel cirkel radie = 1 mittpunkt = (0,0) LetaCirkel
11
Arv Student ärver av Person (extends) Person String namn
+getNamn:String +setNamn(String) +toString:String Student String skola +getSkola:String +setSamn(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
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
Å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
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
Klassen Student Vad händer när en konstruktor körs?
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); // 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.
16
Exempel: Konstruktor körs
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”); Konstruktorn Student(”Malmö högskola”) anropas. Instansvariablen skola=null Konstrukton Person() anropas Instansvariablen namn=null Konstruktorn Person(”Namn okänt”) anropas Instansvariablen namn=”Namn okänt” Instansvariablen skola=”Malmö högskola”
17
Klasshierarki Person Student Anstalld Programstudent namn skola
inskrivningsÅr arbetsgivare lön
18
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
TestaArv1 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
TestaArv 2 TestaArv2 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<personLista.length;i++){ System.out.println(personLista[i]); } 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 TestaArv2
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.