Arv, abstrakta klasser och gränssnitt Java doc
Viktiga OO-begrepp Klass Objekt Överskugga Överlagra Ärva Polymorfism Dynamisk bindning Abstrakta klasser Gränssnitt
Klass diagram Person namn Student Anstalld namn skola namn arbetsgivare lön ProgramStudent namn skola program inskrivningsÅr
Rektangel En rektangel: Rektangel double bredd -double längd +getLängd:double +setLängd(double) +getBredd:double +setBredd(double) +area():double +jämförArea:double +comperTo(Object):int +equals(Object):boolean +toString:String
Cirkel med mittpunkt En Cirkel som har ett objekt Punkt har Cirkel -double radie -Punkt mittPunkt +getRadie:double +setRadie(double) +getMittPunkt:Punkt +setMittPunkt(double ,double ) +area():double +jämförArea:double +comperTo(Cirkel):int +equal(Cirkel):boolean +toString:String Punkt double xKord -double yKord +getX:double +getY:double +equal(Punkt):boolean har
equals Det finns en metod i klassen Object som kan överskuggas precis som toString: public boolean equals(Object o){ if (o instanceof Cirkel) { Cirkel c=(Cirkel) o; if (radie ==c.getRadie()&& mittPunkt.equals(c.getMittPunkt()) return true; } return false;}
Leta efter objekt i ett fält med hjälp av equals Cirkel[] cirklar=new Cirkel[3]; Cirkel nyCirkel=new Cirkel(1,0,0); Cirklar[i].equals(nyCirkel); cirklar Cirkel r=1 p=(0,0) r=2 p=(1,1)
public static void main(String[] args) { TestaCirkelMedPunkt2 m=new TestaCirkelMedPunkt2(); Cirkel[] cirklar; //fältet som håller cirklarna System.out.print("Ange hur många cirklar du vill lägga in i ditt fält: "); int antal=Input.readInt(); // antalet cirklar i fältet cirklar=new Cirkel[antal]; // fältet skapas for (int i=0;i<antal;i++){ cirklar[i]=m.inMatning(); //fältet fylls på med cirklar } m.skrivUt(cirklar); //fältet skrivs ut System.out.println("Ange en cirkel du vill ändra i: "); Cirkel nyCirkel=m.inMatning(); //ny cirkel skapas för att kunna söka i fältet boolean hittad=false; int i=0; do { hittad=nyCirkel.equals(cirklar[i]); i++; } while (hittad==false && (i<cirklar.length)); if (!hittad) //om inte cirklen hittades System.out.println(" Din cirkel finns inte i listan"); else m.ändra(cirklar[i-1]); // ändrar i den cirkeln som är hittad m.skrivUt(cirklar); //skriver ut fältet igen.
Abstrakta klasser Man kan tänka sig att cirklar och rektanglar är geometriska objekt. De har ju visa egenskaper gemensamt. Geometriska objekt kan ha en area. Klassen Geometriska objekt måste dock bli lite mer specialiserad för att kunna skapas som en instans. En abstrakt klass deklareras abstrakt. Den kan inte skapas med new. Abstrakta klasser har abstrakta metoder som subklasserna kan implementera, de är dock deklarerade i den abstrakta klassen. Abstrakta klasser kan ha vanliga metoder och instansvariabler.
GeometrisktObjekt GeometrisktObjekt Cirkel Punkt Rektangel public abstract class GeometrisktObjekt { deklaration protected GeometrisktObjekt() { konstruktor } public abstract double area(); abstrakt metod public double areaSkillnad(GeometrisktObjekt geoObjekt){ return area()-geoObjekt.area(); vanlig metod
TestaGeometrisktObjekt public class TestaGeometrisktObjekt { public static void main(String[] args) { GeometrisktObjekt geo1=new Cirkel(1,1,1); GeometrisktObjekt geo2=new Rektangel(1,1); System.out.println(geo1+" och har arean "+geo1.area()+" a.e."); System.out.println(geo2+" och har arean "+geo2.area()+" a.e"); System.out.println("Area skillnaden är "+geo1.areaSkillnad(geo2)+ " a.e."); }
Utskrift Cirklen har radien 1.0 l.e. och mittPunkten: (1.0, 1.0) och har arean 3.141592653589793 a.e. Rektanglens bredd är 1.0 l.e. och längden är 1.0 och har arean 1.0 a.e Area skillnaden är 2.141592653589793 a.e.
Typ omvandling Implicit typomvandling GeometrisktObjekt geoObjekt1=new Cirkel(1,1,1); Explicit typomvanling Cirkel cirk1= (Cirkel) geoObjekt1; fungerar om man vet att det är rätt typ av objekt Annars får man testa med instansof if ( geoObjekt1 instanceof Cirkel ) { Cirkel cirk1= (Cirkel) geoObjekt1;}
Interfaces-gränssnitt I Java finns inte multipelt arv, d.v.s att en klass kan inte ärva från två klasser. Istället har Java interfaces eller gränssnitt. interfaces har bara abstrakta metoder och kan ha konstanter. Inget objekt kan skapas av ett interface med new. En klass kan implementera ett gränssnitt eller flera, måste då göra egna versioner av metoderna i gränssnittet om inte klassen är abstrakt. Man refererar och arbetar med interfaces på samma sätt som med klasser.
Modifierare Synlighet public + (alla kommer åt) private - (klassen kommer åt) protected # (klassen och subklasserna kommer åt) Andra final (kan inte ändras) static (finns bara en i varje klass)
Interfaces forts. Skapa en fil med samma namn som interfacet och deklarera: public interface Inter { resultattyp m1(parametrar); resultattyp m2(parametrar); static final int k =KONSTANT_VÄRDE; } Ex. public interface HarVolym{ //abstrakt metod som ska implementeras public double volym(); //konstanter public final static double MIN_VOLYM=0;
Interfaces eller abstrakta klasser Interfaces är en svagare är-relation eller Egenskaper som kan finnas hos olika typer av objekt som inte bör ärva varandra Ett interface kan bara ha konstant data medan abstrakta klasser kan har instansvariabler Ett interface har bara abstrakta metoder som inte är implementerade. En abstrakt klass kan ha konkreta metoder. Eftersom alla metoderna i ett interface är abstrakta måste man inte ange det explicit.
Comparable package java.lang; public interface Comparable { public int comparTo (Object o); } Ex. public int compareTo(Object o){ Rektangel annanRektangel= (Rektangel) o; double areaSkillnad; areaSkillnad=area()-annanRektangel.area(); if (areaSkillnad>0) return 1; else if (areaSkillnad<0) return -1; else return 0;
Ett exempel GeometrisktObjekt Cirkel Punkt Rektangel Comparable
Java doc Klasser och metoder kommenteras med Javadoc vilket gör att html-filer som beskriver klassen kan genereras. /** * <p>Title: Rektangel</p> * <p>Description: En rektangel. </p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: Malmö högskola</p> * @author Kristina von Hausswolff * @version 1.1 */
Java doc /** * Konstruktor som sätter bredd och längd * @param bredd rektanglens bredd * @param längd rektanglens längd */ // konstruktorn * Retunerar rektanglens längd * @return höjd // metoden getLängd