Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 5 Innehåll Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface Föreläsning 5 Katarina Blom 1 2 public class A{ Subklasser public class B extends A{ B är en subklass till A. A är superklass till B. I subklasser kan man: Lägga till metoder. Omdefiniera metoder. Lägga till tillståndsvariabler. 3 Exempel I klassen Ball finns bla metoderna: public void step() public void setstepsizes(int dx, int dy) En utökad boll: public class CleverBall extends Ball{ public CleverBall(Box b, int x, int y){ super(b,x,y); public void mksquare(int d){ setstepsizes(d,0); step(); sleep(); setstepsizes(0,-d); step(); sleep(); setstepsizes(-d,0); step(); sleep(); setstepsizes(0,d); step(); private void sleep(){ try{thread.sleep(100);catch(exception e){ 4
Kommentarer till exemplet EnCleverBall kan allt som enball kan och kan dessutom röra sig i en fyrkant. CleverBall ärver alla tillståndsvariabler och metoder som finns i Ball. Klassen Ball finns kvar oförändrad och kan fortfarande användas. Klassen Box är subklass till JFrame public class Box extends JFrame{ Vilka metoder från JFrame används i klassen, vilken metod omdefineras?. 5 6 Allmänt: Konstruktorer Om man i en klass inte definierar någon konstruktor får man automatiskt en utan parametrar som inte gör någonting. Om man definierar minst en konstruktor får man inte någon parameterfri variant automatiskt. Subklasser: Konstruktorer Om man i konstruktorn för en subklass inte anropar superklassens konstruktor läggs ett anrop av superklassens parameterlösa konstruktor till. Om man inte deklarerar någon konstruktor i subklassen får man automatiskt en parameterlös konstruktor (som anropar superklassens parameterlösa konstruktor). Om man i subklassens konstruktor anropar superklassens konstruktor läggs inga anrop till. 7 8
Klasshiearkier Man kan definiera subklasser till subklasser... En klass kan ha flera subklasser. En klass kan bara ha en (direkt) superklass. JTextComponent JTextArea JComponent JLabel JTextField Klassen Object är superklass till alla klasser Object är superklass till standardklasserna och till de klasser man definierar själv Vilka metoder finns i Object? Box låda = new Box(); Ball b1 = new Ball(låda,0,0); Ball b2 = new Ball(låda,0,0); System.out.println(b1); System.out.println(b1.equals(b2)); Vad blir utskriften? Exempel från javax.swing 9 10 Klassen PointD (i Lab1) omdefinierar tostring() från Object: public class PointD{ private double x,y; public PointD(){ this(0.0,0.0); public PointD(double x, double y){ this.x = x; this.y = y; Subtyping Om S är subklass till T så är S också subtyp till T. Om e har typ S (som är subtyp till T) så är tilldelningen T x = e; tillåten. (Man kan också skicka e som ett argument till en metod vars parameter deklarerats att ha typ T. public double getx(){ return x; public double gety(){ return y; public String tostring(){ return "("+x+","+y+")"; 11 12
Subtyping exempel public static void mkred(ball b){ b.setcolor(java.awt.color.red); Kan man göra anropet mkred(s) om s refererar till en CleverBall? Polymorfism Typen avgör vilka operationer som kan utföras. Objektets klass avgör vilken kod som körs. Object pkt = new PointD(1,2); String str = pkt.tostring(); public static void step2(cleverball cb){ cb.step(); cb.step(); Vilken tostring()-metod exekveras? Detta kallas dynamisk bindning (eller sen bindning); Kod väljs då programmet körs. Kan man göra anropet step2(t) om t refererar till en Ball? 13 14 Att rita utan applets; Klasserna JFrame och JPanel För att rita i ett fönster i en applikation används (en subklass) till javax.swing.jpanel som placeras i en javax.swing.jframe En variant av lab1 import javax.swing.*; import java.awt.*; public class PilPanel extends JPanel{ private int radie = 100; private int antalpilar = 1000; public PilPanel(){ setpreferredsize(new Dimension(2*radie,2*radie)); public void paintcomponent(graphics g){ super.paintcomponent(g); setbackground(color.white); g.drawoval(0,0,2*radie,2*radie); CircleInSquare c = new CircleInSquare((double)radie); g.setcolor(color.red); for(int i=0;i<antalpilar;i++){ PointD p = c.newpoint(); double x = p.getx()+radie; double y = p.gety()+radie; g.fillrect((int)(x+.5),(int)(y+.5),1,1); 15 16
Huvudklassen import javax.swing.*; public class Main{ public static void main(string[] arg){ JFrame f = new JFrame(); PilPanel piltavla = new PilPanel(); f.add(piltavla); f.setdefaultcloseoperation(jframe.exit_on_close); f.pack(); f.setvisible(true); Interface En samling metodsignaturer. Någon klass med dessa metoder behöver ännu inte ha implementerats. Det kan finnas många oliak sätt att implementera detta. Ett interface utgör en typ. 17 18 Exempel Ett interface för bollar: import java.awt.color; interface BallSkelett{ public void setradius(int r); public void setcolor(color col); public void step(); public void setstepsizes(int dx, int dy); Interface är typer Man kan deklarera variabler av typ BallSkelett Man kan inte skapa objekt från ett interface. (Det finns ju ingen kod). Inga tillståndsvariabler. Ingen kod. 19 20
Att implementera ett interface import java.awt.color; public class GolfBoll implements BallSkelett{ private int diameter = 42; private double vikt = 45.93; private Color färg; public void setradius(int r){ diameter = 2*r; public void setcolor(color col){ färg = col; Alla metoder måste implementeras. Klassen kan innehålla fler metoder än vad som preciseras i interfacet. Java använder sig av interface Klasserna java.util.arraylist java.util.linkedlist java.util.vector implementerar interfacet List Vilka metoder finns i interfacet List? Vilka metoder finns implementerade i klasserna? (Vilka metoder ärvs in till klasserna) Implementerar klasserna fler interface? 21 22 Varför interface? istället för multipelt arv precisera via gränssnitt. Dela upp kodningsarbeet. Inkapsling Typen avgör vilka operationer som får utföras, objektets klass avgör vilken kod som körs List listan = new ArrayList(); List denlänkade = new LinkedList(); 23