Javas klassbibliotek. Kap 7: Sid 2



Relevanta dokument
Applets med komponenter

Lite logik. Kap 6: Sid 2

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen OOP

Kort om klasser och objekt En introduktion till GUI-programmering i Java

2D1339 Programkonstruktion för F1, ht 2004

Övningar Dag 2 En första klass

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

2D1342 Programkonstruktion för F1, ht 2006

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Objektorienterad programmering i Java

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Att använda Java SE JDK 6

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektorienterad programmering D2

OOP Objekt-orienterad programmering

Lab5 för prgmedcl04 Grafik

JAVA Mer om klasser och objektorientering

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

OOP Objekt-orienterad programmering

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

DD1342 Programkonstruktion för F1, ht 2007

2D1339 Programkonstruktion för F1, ht 2003

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Frames, menyer och GUI-program

Introduktion till arv

Chapter 3: Using Classes and Objects

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

OOP Objekt-orienterad programmering

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Grundläggande programmering med C# 7,5 högskolepoäng

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

SMD 134 Objektorienterad programmering

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Typkonvertering. Java versus C

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 11

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Grafiska komponenter.

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Tentamen. Grundläggande programmering i Java A 5p, DTAA

Objekt och klasser - Introduktion

System.out.println("Jaså du har "+ antaldollar + " stycken.");

Programmeringsteknik med C och Matlab

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Laboration 10 - NetBeans

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

Föreläsning 3-4 Innehåll

Iteration while-satsen

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Rita Egna Bilder, Timer

TENTAMEN OOP

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning 3. Iteration while-satsen

Laboration 1 - Grunderna för OOP i Java

5 Grundläggande in- och utmatning

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Objektorienterad programmering

Java, klasser, objekt (Skansholm: Kapitel 2)

Föreläsning 15 (16) Historik (java.awt) Historik (javax.swing) Introduktion till Swing

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

FactoryCast HMI. Premium & Quantum PLC. Applets

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

DAT043 - Föreläsning 7

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tentamen i Objektorienterad programmering

Exempel på användning av arv: Geometriska figurer

Transkript:

7 Mest om metoder Javas klassbibliotek Allmänt om metoder Metoderna i klassen Math Trigonometriska övningar Experiment med slumptal Förvandla sträng till decimaltal Antal decimaler i utskrift Metoder i en applet Metoder som returnerar värde Egna klassmetoder

Kap 7: Sid 2 Javas klassbibliotek Arv När du skapar en klass, MinApplet, ärver du från en redan befintlig klass Applet. Den befintliga klassen Applet ärver i sin tur från en annan befintlig klass som heter Panel. Denna ärver i sin tur från en klass som heter Container, som ärver från en klass vid namn Component, vilken (slutligen) ärver från ur-klassen Object. Så här alltså: Object Component Container Panel Applet java.lang java.awt java.applet MinApplet Alla klasser ärver från klassen Object. För exempelvis klasserna Button, Label och TextField ser hierarkin ut så här: Object Component Button Label TextComponent TextField Java7_MestOmMetoder.doc Ove Lundgren 2

Kap 7: Sid 3 Klassbiblioteket, Java API (= Java Application Programming Interface) De "färdiga" java-klasserna följer med JDK och är lagrade i "paket" (packages): Klassen Applet ovan finns i paketet java.applet När man skriver klassens namn tar man ofta med paketets namn också, t ex java.applet.applet Klassen Object ovan finns i paketet java.lang så klassens "fullständiga" namn är java.lang.object Övriga klasser ovan finns i paketet java.awt (awt = Abstract Window Toolkit) Exempelvis skrivs alltså klassen Button med "paket-tillhörighet" så här: java.awt.button Alla klasser måste importeras - utom de klasser som tillhör paketet java.lang Utöver klasserna i JDK finns "färdiga klasser" från andra leverantörer. Övning: Dokumentation Alla JDK:s klasser med tillhörande fält och metoder finns beskrivna i html-dokument som levereras med JDK. I mappen...\jdk...\docs\api\ finns filen packages.html Öppna den i en webläsare! (Se till att du öppnar rätt fil. Det finns många med liknande namn.) En lista över alla paket visas Klicka på package java.applet Innehållet i paketet java.applet visas. Vi känner igen klassen Applet (Vi har också använt interfacet Audioclip ) Klicka Applet En hierarki med alla superklasserna till klassen Applet visas, med klassernas namn och "paket"-tillhörighet. Rulla ned sidan till Method index Vi känner igen ett antal metoder som vi använt, bland andra init()och showstatus() Klicka på showstatus En beskrivning av metoden visas Återvänd till början av Class java.applet.applet-sidan (Övningen fortsätter på nästa sida ) Java7_MestOmMetoder.doc Ove Lundgren 3

Kap 7: Sid 4 En applet har, som bekant, metoden paint() Varför hittar vi inte den? Jo den är ärvd från en av superklasserna. På föregående sidan återvände du till java.applet.applet Klicka nu på superklasserna, det vill säga java.awt.panel, java.awt.container osv och ta reda på vilken klass som, "från början", äger metoden paint() Vi hittar paint() i klassen Container Klicka på paint() och läs om den metoden. Återvänd sedan till sidan Java API Packages: Klicka All Packages högst upp till vänster Klicka nu package java.awt Rulla ner till Class index Du känner igen många klasser: Button, Color, Font, Image, Label, TextField med flera Klicka på några kända klasser. Leta upp metoder som vi använt (Under Method index) Ibland hittar man inte en metod. Då får man leta i superklasserna I klasserna Color och Font känner du igen en del av innehållet i Field index Studera också "Constructor index" för några klasser, t ex TextField och Color. När ett nytt objekt skapas (med new, du vet ) så anropas ju konstruktorn som skapar objektet. Man kan ofta välja mellan olika konstruktorer. Det som står efter new kan se lite olika ut beroende på vilken konstruktor vi väljer när vi skapar objektet. Constructor index är en sammanställning över möjliga konstruktorer. Exempel: När vi skapade textfält använde vi t ex konstruktorn TextField(int) - så här: TextField inruta; inruta = new TextField(10); (Detta ger ett textfält som rymmer 10 tecken.) Men ett textfält kan också skapas t ex med konstruktorn TextField(String) - så här: TextField inruta; inruta = new TextField("Kalle"); (Då skapas fältet med texten "Kalle" inlagd och i detta fall 5 tecken brett ) Återvänd till sidan Java API Packages Undersök paketet java.lang. Har vi använt någon klass i det paketet? (Du bör hitta String, Integer, Object) Högst upp på alla sidor i API-dokumentationen finns länken Class Hierarchy Klicka denna. Studera hur sidan Class Hierarchy är uppbyggd. Leta t ex upp klassen Applet och följ dess superklasser ända upp till klassen Object Högst upp på alla sidor i API-dokumentationen finns länken Index Klicka denna. Sidan Index of all Fields and Methods visas (Det kan ta lite tid att ladda in denna sida ) Här finns alla fält och metoder i bokstavsordning I fortsättningen: Ta som vana att gå in i API-dokumentationen när du stöter på en ny klass eller metod och "forska": I vilket paket finns klassen? Vilka klasser är dess superklasser? Vilken klass tillhör metoden? Java7_MestOmMetoder.doc Ove Lundgren 4

Kap 7: Sid 5 Allmänt om metoder Vi repeterar olika typer av metoder, vad som menas med överlagring och överskuggning och vad en klassmetod är. Begreppen har behandlats i tidigare kapitel. Metoder av typen void, utan parametrar Metoden utför något - men den är void, den lämnar inte något värde. Metoden är definierad utan parametrar. Den kräver alltså inga argument vid anropet. Exempel: Metoden rulla() definieras i en klass så här: public void rulla() // beskrivning vad som ska göras... Ett objekt (t ex bollen) som skapas utifrån klassen äger förstås metoden. Metoden anropas med bollen.rulla(); Exempel: Metoden show() är definierad i klassen Frame public void show() // definierad av java-konstruktörerna hos Sun Om vi har ett Frame-objekt med referensen f så visas objektet med anropet f.show(); Exempel: Metoden init() definieras i en klass (en applet) så här: public void init() inruta = new TextField(10); roed = new Color(255,0,0); // etc... Metoden anropas automatiskt av webbläsaren när appleten startar (Om vi tänker oss att webbläsaren kallar appletobjektet för x så utförs alltså satsen x.init(); automatiskt vid start ) Java7_MestOmMetoder.doc Ove Lundgren 5

Kap 7: Sid 6 Metoder av typen void, med parametrar Metoden utför något - men den är void, den lämnar inte något värde Metoden är definierad med parametrar. Den kräver alltså ett eller fler argument vid anropet Exempel: Metoden rulla() definieras i en klass så här: public void rulla (int n) // beskrivning vad som ska göras... Ett objekt (t ex olle) som skapas utifrån klassen äger metoden. Metoden anropas med argument, t ex: bollen.rulla(12); parameter argument Exempel: Metoden paint() definieras i en klass (en applet) så här: public void paint(graphics g) g.drawstring("hej",50,100); // etc... Metoden paint(grafobj); anropas automatiskt då applet skapas. grafobj är det Graphics-objekt som är knutet till appleten Exempel: Metoden drawoval() definieras i klassen Graphics public void drawoval( int x, int y, int b, int h ) // definierad av java-konstruktörerna hos Sun Om g är ett Graphics-objekt kan metoden anropas med t ex: g.drawoval(50,100,150,150); 4argument 4 parametrar Exempel: Metoden setbackground() definieras i klassen Component (och ärvs sedan av klassen Applet) public void setbackground(color c ) // definierad av java-konstruktörerna hos Sun Metoden kan anropas med: this.setbackground(farg) där farg är ett Color-objekt När ett objekt anropar en egen metod sätter man this framför punkten. ( Ordet this kan utelämnas - det är då underförstått att det är en egen metod som anropas. ) Java7_MestOmMetoder.doc Ove Lundgren 6

Kap 7: Sid 7 Icke-void-metoder En icke-void-metod kan vara definierad med eller utan parametrar. En icke-void-metod returnerar alltid ett värde. Icke-void-metoder kallas ofta funktioner. Exempel: Metoden (funktionen) volym() definieras i en klass t ex så här: public double volym(int n) // i detta fall returneras ett flyttal // beskrivning vad som ska göras... return v; Ett objekt (t ex bollen) som skapas utifrån klassen äger metoden. Metoden anropas t ex så här: vol = bollen.volym(12); eller System.out.println( bollen.volym(12)); Exempel: Metoden (funktionen) gettext() definieras i klassen TextComponent (och ärvs av TextField) public String gettext() // definierad av java-konstruktörerna hos Sun return s; // Sträng s är innehållet i det aktuella TextField-objektet Om vi har skapat ett TextField-objekt inruta, och namn är ett String-objekt, så kan metoden anropas: namn = inruta.gettext(); Överskuggning av metoder När vi skriver en applet så ärver vi från klassen Applet. Detta innebär att ett antal metoder redan finns, som paint(), init() med flera Vad händer då om vi definierar en metod paint() i vår applet, så här: public void paint(graphics g) g.drawoval(12,20,30,40); // och så vidare Jo den ursprungliga paint()-metoden ersätts av den nya... Detta kallas överskuggning (override, omdefiniera...) Överlagring av metoder Metoder med samma namn men med olika antal och/eller typ av parametrar kallas överlagrade metoder. Java7_MestOmMetoder.doc Ove Lundgren 7

Kap 7: Sid 8 Klassmetoder Normalt anropar vi en metod via ett objekt, exempelvis inruta.gettext(); Här har vi ett TextField-objekt, inruta, och vi använder metoden gettext() som är definierad i den klassen (eller, som i detta fall, i någon av dess superklasser) En klassmetod (ibland kallad statisk metod) är en metod som kan användas direkt, utan att man först har skapat ett objekt. Vi har redan använt några sådana metoder: Integer.parseInt(... ) Prompt.heltal(... ) Vi behöver inte skapa ett Integer-objekt eller Prompt-objekt för att använda metoderna... Man skriver helt enkelt klassens namn följt av metodnamnet (med en punkt emellan) Man kan säga att en klassmetod tillhör klassen som helhet inte de enskilda objekten. Integer är en klass som innehåller en rad metoder för hantering av heltal Prompt är en klass med metoder för inmatning av tal i konsolprogram (Tillhör detta läromedel, ej JDK) En metod blir en klassmetod om den deklareras med nyckelordet static Vi har definierat en statisk metod, main, vid flera tillfällen - när vi skrivit javaprogram: class KonsolProg public static void main( String args[] )... Metoden KonsolProg.main( ) anropas (av tolken java.exe ) vilket innebär att konsolprogrammet startar. Java7_MestOmMetoder.doc Ove Lundgren 8

Kap 7: Sid 9 Metoderna i klassen Math Det finns en javaklass som heter Math. Den tillhör java.lang-paketet (Fullständiga klassnamnet är alltså: java.lang.math) (Klassen behöver således inte importeras.) Denna klass innehåller en rad metoder (funktioner) för matematik. Alla metoder är klassmetoder (vi behöver inte skapa Math-objekt först...) Klassen har också två statiska fält (konstanter) för de intressanta talen π och e I sammanställningen nedan är x och y flyttal / decimaltal (double), medan i och j är heltal (int) Du bör kunna använda Math.PI nedan samt de fyra därpå följande metoderna. Lär dig de övriga om du känner till motsvarande begrepp i matematiken. Metod / Fält Returnerar Returtyp Exempel Math.PI talet π (3.14159...) double y = Math.PI*x*x; y är arean hos en cirkel med radien x Math.sqrt(x) Kvadratroten ur talet x double y = Math.sqrt(25.0); y får värdet 5.0 Math.pow(x,y) x upphöjt till y, x y double y = Math.pow(2.0, 3.0); y får värdet 2 3 = 8.0 Math.random() ett slumptal mellan 0 och 1 (egentligen 0 slump < 1) double j = (int)(math.random()*6 ) + 1; j blir här ett av talen 1, 2, 3, 4, 5 eller 6 (En "tärning" alltså! Se avsnitten om slumptal!) Math.exp(x) e upphöjt till x, e x double y = Math.exp(2.0); y får värdet e 2 ( 7,389...) Math.E talet e (2,718...) double y = Math.E; y får värdet e (2,718 ) Math.log(x) naturlig logaritm för x, ln x double y = Math.log(5.0); y = ln 5 (1,609...) Math.sin(v) sinusvärdet, sin v double y = Math.sin(2.0): y = sin 2 (0,909...) OBS! argumentet i radianer! Math.cos(v) cosinusvärdet cos v double Math.tan(v) tangens tan v double Math.atan(x) arctangens arctan v (omvändning till tangens) double y = Math.arctan(1.0) y = arctan 1 (y blir π / 4 rad = 0,785 rad, dvs 45 o ) Vinkeln π / 4 har ju tangensvärdet 1 Math.abs(x) absolutbeloppet x double y=math.abs(-1.75); y får värdet 1,75 Math.abs(i) absolutbeloppet i int i = Math.abs(7); i får värdet 7 Bra att minnas i sammanhanget: Avhuggning till heltal får vi genom att göra en cast: i = (int)x; Gör om en sträng till heltal: t = Integer.parseInt(s) ; Gör om tal till sträng: s = t + ; Java7_MestOmMetoder.doc Ove Lundgren 9

Kap 7: Sid 10 Övning: Testa Math // Se till att Prompt.class finns i samma mapp class Mattetest public static void main( String args[] ) double r, x, y, z, rot,area ; int tarning, i, j; System.out.println("Testar pi:"); r = Prompt.decimaltal("Skriv radien "); area= Math.PI*r*r; System.out.println("Arean är " + area); System.out.println(); System.out.println("Testar roten ur:"); x = Prompt.decimaltal("Mata in ett tal "); rot= Math.sqrt(x); System.out.println("Kvadratroten är " + rot); System.out.println(); System.out.println("Testar upphöjt till:"); x = Prompt.decimaltal("Vilken bas? "); y = Prompt.decimaltal("Vilken exponent?"); z = Math.pow(x,y); System.out.println(x +" upphöjt till " + y + " är " + z); System.out.println(); System.out.println("Testar avhuggning till heltal:"); x = Prompt.decimaltal("Skriv ett tal med decimaler "); i = (int)x ; // här görs en cast System.out.println("Närmast mindre heltal är " + i); System.out.println(); System.out.println("Testar talet e:"); System.out.println("Talet e " + Math.E); x = Prompt.decimaltal("Till vilken exponent ska e upphöjas? "); System.out.println("e upphöjt till "+ x + " är " + Math.exp(x) ); System.out.println(); System.out.println("Testar naturliga logaritmen:"); x = Prompt.decimaltal("Skriv ett tal "); System.out.println("Naturl. log. för " + x + " är " + Math.log(x)); System.out.println(); System.out.println("Testar trigonometri:"); x = Prompt.decimaltal("Skriv en vinkel i radianer "); System.out.println("Sinusvärdet är " + Math.sin(x)); System.out.println("Cosinusvärdet är " + Math.cos(x)); System.out.println("Tangensvärdet är " + Math.tan(x)); System.out.println(); System.out.println("Testar absolutbelopp:"); x = Prompt.decimaltal("Skriv ett tal (gärna negativt) "); System.out.println("Talets absolutbelopp är " + Math.abs(x)); i = Prompt.heltal("Skriv ett heltal (gärna negativt)"); System.out.println("Talets absolutbelopp är " + Math.abs(i)); Kopiera (eller skriv av) ovanstående kod. (Ett enkelt konsolprogram för att testa ) Spara som Mattetest.java i mappen X\java\Javagrunder Kompilera och kör. Testkör några gånger. Kom ihåg att använda punkt (och inte komma) som decimaltecken när du skriver in decimaltal. Java7_MestOmMetoder.doc Ove Lundgren 10

Kap 7: Sid 11 Övning: Math i API Leta upp klassen Math i API-dokumentationen Läs om ovan nämnda metoder och fält Övning: Rot-tabell Gör en applet som visar kvadratroten ur talen 1 10. Spara som RotTabell i mappen X\java\RotTabell Försök själv. Kika nedan om du kör fast. import java.applet.*; import java.awt.*; public class RotTabell extends Applet double y; public void paint(graphics g) g.drawstring("x", 50, 50); g.drawstring( "Roten ur x", 100,50); g.drawline(50,55,200,55); for(int x = 1 ; x <= 10; x++) g.drawstring(x + "", 50, 50 + 20 * x ); y = (double) x; g.drawstring(math.sqrt( y ) + "", 100, 50 + 20 * x ); En kommentar till satsen g.drawstring(x + "", 50, 50 + 20 * x ); Första x-värdet (x=1) kommer att skrivas i position (50, 70) (eftersom 50 + 20 * 1 =70) Nästa x-värde (x=2) kommer att skrivas i position (50, 90) (eftersom 50 +20 *2 =90) och så vidare Java7_MestOmMetoder.doc Ove Lundgren 11

Kap 7: Sid 12 Trigonometriska övningar Övning: Klassen Klocka I nedanstående applet, VisaKlocka, instansieras ett objekt av klassen Klocka Klockan instansieras med mittpunkten (150,150) och diametern 100 pixels. Metoden settid(0) sätter tiden till 0 (noll) sekunder. Metoden visa(g) ritar klockan i appleten. import java.awt.*; import java.applet.applet; public class VisaKlocka extends Applet Klocka k; public void init() k = new Klocka(100, 150,150 ); k.settid(0); public void paint(graphics g) k.visa(g); Klockan har alltså bara en visare (visar sekunder) (som en kronometer) Skriv klassen Klocka. Instansvariabler: diam, x, y, sek Konstruktorn ger värden på x och y (klockans mittpunkt) samt diam (dess diameer) Med metoden settid(int s) sätts det antal sekunder som klockan ska visa. Med metoden visa(graphics g) ska klockan ritas. Se figur: Om klockans medelpunkt är (x,y) och visarens längd är r så får (i matematiken) punkten P koordinaterna: px = x + r * cos v py = y + r * sin v Vinkeln v beror på antalet sekunder. En sekund motsvarar ju 360 o /60 eller 2π/60 Försök skriva klassen Klocka på egen hand (Du får nog trixa lite för att få klockan att gå rätt ) På nästa sida finns ett lösningsförslag (x,y) r v P Java7_MestOmMetoder.doc Ove Lundgren 12

Kap 7: Sid 13 import java.awt.*; public class Klocka private int diam, x, y, sek; public Klocka(int d, int a, int b) diam = d; x = a; y = b; public void settid(int s) sek = s; public void visa(graphics g) g.drawoval(x-diam/2,y-diam/2,diam,diam); // klockans periferi g.filloval(x-2,y-2,4,4); // mittpunkten double v = - sek*2*math.pi/60 + Math.PI/2; // se nedan int r = diam/2-3; // visarens längd int px =x + (int)(r*math.cos(v)); // x-koordinat för punkten P int py =y - (int)(r*math.sin(v)); // se nedan g.drawline(x,y,px,py); Satsen double v = - sek*2*math.pi/60 + Math.PI/2; Minustecken här, annars går klockan baklänges! En vridning medurs ger ju en negativ vinkel i matematiken Vi lägger till Math.PI/2, det vill säga 90 o, så att klockan pekar på norr vid tiden noll sekunder Satsen int py = y - (int)(r*math.sin(v)); beräknar y-koordinaten för punkten P Minustecken här eftersom y-koordinater växer nedåt i datagrafiksammanhang Spara filerna VisaKlocka.java och Klocka.java i mappen X\java\Klocka Kompliera. Skriv en html-fil och provkör! Övning: Klockan tickar Lägg till en knapp. Varje gång du trycker på knappen ska klockan ticka fram fem sekunder. Java7_MestOmMetoder.doc Ove Lundgren 13

Kap 7: Sid 14 Övning: En Stjärn-klass Studera denna applet: import java.awt.*; import java.applet.*; public class VisaStar extends Applet Star s1, s2; public void init() s1 = new Star(50, 12); // Diameter 50, 12 uddar s2 = new Star(100, 24); // Diameter 100, 24 uddar s1.setpos(50,50); // Stjärnans placering s2.setpos(150,150); // Stjärnans placering public void paint(graphics g) s1.visa(g); // Stjärna visas s2.visa(g); // Stjärna visas Appleten instansierar och visar två objekt av klassen Star, så här: Den lilla stjärnan har diametern 50 pixel och visar 12 uddar Den stora stjärnan har diametern 100 pixel och visar 24 uddar Skriv klassen Star.java r P Använd en loop. Låt vinkeln v öka för varje varv. Rita linje från medelpunkten till punkten P varje varv. P.s koordinater är ( r * cos v, r*sin v ) där r är halva diametern v Java7_MestOmMetoder.doc Ove Lundgren 14

Kap 7: Sid 15 Lösningsförslag: import java.awt.*; public class Star private int diam, x, y, antal; public Star(int d, int a) diam = d; antal= a; public void setpos(int x, int y) this.x = x; this.y = y; public void visa(graphics g) for(double v = 0.0; v < 2*Math.PI; v = v + 2 * Math.PI/antal) int a = (int)(diam/2*math.cos(v)); int b = (int)(diam/2*math.sin(v)); g.drawline(x,y, x+a,y-b ); Skriv in, spara och kompilera klasserna Visastar och Star. Spara i mappen X\java\Star Exekvera! Testa olika storlekar och antal uddar på stjärnorna Java7_MestOmMetoder.doc Ove Lundgren 15

Kap 7: Sid 16 Experiment med slumptal Övning: Konsolprogram som visar slumptal Skriv in denna kod. Spara som SlumpTest.java i mappen X\java\Slump Kompilera och kör. class SlumpTest public static void main( String args[] ) double slump ; int i; for(i=1;i<=12;i++) slump= Math.random(); System.out.println("Slumptal nummer " + i + ": " + slump); Funktionen Math.random() slumpar ett flyttal. Variabeln slump tilldelas detta flyttal. 0 slump < 1 Satserna ingår i en for-loop. Det hela upprepas 12 gånger. Övning: Tipsrad Ändra koden för klassen SlumpTest. Kalla klassen class Tipsrad. Spara som Tipsrad.java Skriv om koden inne i loopen så att om slump < 0,4 så skrivs strängen "1 " annars om slump < 0,8 så skrivs " X " annars skrivs " 2" Gör så att loopen körs 13 gånger. Spara igen. Kompilera. Kör. Resultatet blir en tipsrad. Experimentera: Ändra t ex så att sannolikheten för bortavinst (2:a) ökar Övning: Applet med tipsrad Bygg en applet som har en knapp. När du trycker på knappen ska en ny tipsrad visas. Java7_MestOmMetoder.doc Ove Lundgren 16

Kap 7: Sid 17 Slumpa heltal Betrakta satserna nedan: ( slump är double, t är int ) slump = Math.random(); slump = 6 * Math.random(); ger ett tal i intervallet 0.0 till 0,999999999999 ger ett tal i intervallet 0.0 till 5,99999999 t = (int)(6 * Math.random()); ger ett heltal i intervallet fr o m 0 t o m 5 t = (int)(6 * Math.random()) + 1; ger ett heltal i intervallet fr o m 1 t o m 6 Den sista satsen ger alltså ett heltal som är 1, 2, 3, 4, 5 eller 6. En tärning med andra ord!! Allmänt gäller formeln t = (int)(n * Math.random() ) + a; n = antalet tänkbara slumptal a = det minsta tänkbara slumpade talet Exempel: Slumpa ett tal i intervallet fr o m 0 t o m 255 (det vill säga 256 stycken tänkbara tal). Formel: t = (int)(256 * Math.random() ) ; Övning: Konsolprogram som slumpar heltal Ändra koden för klassen SlumpTest. Kalla klassen class SlumpaHeltal. Spara som SlumpaHeltal.java Deklarera heltalsvariablen t Skriv om koden inne i loopen så att tolv tal i intervallet 0 255 visas Spara igen. Kompilera. Kör. Övning: Slumpa färg Skriv en applet, Slumpfarg, som har en knapp med tillhörande händelsehantering. I actionperformed-metoden slumpas tre heltal i intervallet 0-255 Sen skapas ett Color-objekt med de tre heltalen som RGB-komponenter Så sätts den nya färgen till bakgrundsfärg. När man trycker på knappen så byter alltså appleten färg! Spara som Slumpfarg.java i mappen X\java\Slupfarg Övning: Konsolprogram som visar tärning Ändra koden för klassen SlumpTest. Kalla klassen class KonsolTarning. Spara som KonsolTarning.java Deklarera heltalsvariablen t Skriv om koden inne i loopen så att tolv "tärningskast" (tal i intervallet 1-6 ) visas. Spara igen. Kompilera. Kör. Java7_MestOmMetoder.doc Ove Lundgren 17

Kap 7: Sid 18 Övning: Applet som visar en tärning En applet, KastaTarning, har en knapp. När man trycker på knappen visas en tärning, t ex: Appleten instanierar ett objekt av typen Tarning med referensen t Tarningsobjektets metod kasta() slumpar och returnerar ett tal i intervallet 1 6 Metoden visa(graphics) visar tärningen med rätt antal prickar Studera appleten och skriva av (eller kopiera) och spara koden. import java.applet.*; import java.awt.*; import java.awt.event.*; public class KastaTarning extends Applet implements ActionListener Tarning t; Button butt; int k; public void init() t = new Tarning(40,40); // tärning i position 40,40 k = t.kasta(); butt = new Button("Kasta!"); butt.addactionlistener(this); add(butt); public void paint(graphics g) t.visa(g); g.drawstring( Tärningen visar: + k, 40, 110 ); public void actionperformed(actionevent e) k = t.kasta(); repaint(); Skriv nu klassen Tarning Försök lösa uppgiften på engen hand (På nästa sida finns ett lösningsförslag..) Spara KastaTarning.java och Tarning.java i mappen X\java\Tarning Java7_MestOmMetoder.doc Ove Lundgren 18

Kap 7: Sid 19 import java.awt.*; public class Tarning private Color farg = Color.blue; private Color prickfarg = Color.yellow; private int a, b; private int p = 5; // prickstorlek private int t; // antal prickar public Tarning(int a1, int b1) a = a1; b = b1; public int kasta() t = (int)(6 * Math.random()) + 1; return t; public void visa(graphics g) g.setcolor(farg); g.fillrect(a,b,45,45); g.setcolor(prickfarg); switch (t) case 1: g.filloval(a+20,b+20,p,p); break; case 2: g.filloval(a+10,b+10,p,p); g.filloval(a+30,b+30,p,p); break; case 3: g.filloval(a+10,b+10,p,p); g.filloval(a+30,b+30,p,p); break; case 4: g.filloval(a+10,b+10,p,p); g.filloval(a+10,b+30,p,p); break; case 5: g.filloval(a+10,b+10,p,p); g.filloval(a+20,b+20,p,p); g.filloval(a+30,b+30,p,p); break; case 6: g.filloval(a+10,b+10,p,p); g.filloval(a+30,b+10,p,p); g.filloval(a+20,b+30,p,p); break; g.filloval(a+20,b+20,p,p); g.filloval(a+30,b+10,p,p); g.filloval(a+30,b+30,p,p); g.filloval(a+30,b+10,p,p); g.filloval(a+10,b+30,p,p); g.filloval(a+20,b+10,p,p); g.filloval(a+10,b+30,p,p); g.filloval(a+30,b+30,p,p); Java7_MestOmMetoder.doc Ove Lundgren 19

Kap 7: Sid 20 Förvandla sträng till decimaltal I ett tidigare kapitel byggde vi applets där man kunde skriva in tal i textfält (TextFields) I ett textfält är ju allt strängar, så vi fick lov att omvandla en inmatad sträng (t ex "123") till ett heltal (123) Vi använde då metoden Integer.parseInt( ) I en övning gällde det att mata i en cirkels radie i textfältet inruta för att sedan överföra värdet till heltalsvariabeln radie. Satsen kunde se ut så här: radie = Integer.parseInt( inruta.gettext() ); ( java.lang.integer är en klass som innehåller en rad metoder för hantering av heltal ) Vi vill nu kunna mata in en sträng, t ex "123.55" i textfältet inruta och få strängen omvandlad till ett decimaltal (ett flyttal) (123.55) som sedan tilldelas double-variabeln r I Java2 finns en metod för detta. Vi kan vi skriva så här: r = Double.parseDouble( inruta.gettext() ); I Java 1.1 får vi sätta samman fler metoder för samma sak. Vi kan vi skriva så här: r = Double.valueOf(inruta.getText().trim().replace(',','.')).doubleValue(); (Här har vi dessutom utnyttjat metoden replace som byter ut ett tecken mot ett annat: Om man råkar skriva ett kommatecken som decimalttecken så byts det ut mot en punkt. Java kräver ju punkt som decimaltecken) För dig som vill fördjupa dig i satsen följer här en "dissektion". Vi börjar inifrån : inruta är ett TextField-objekt TextField-objekt har en metod (en funktion) gettext() som "fångar" det som står i textfältet och returnerar det som en sträng, ett String-objekt. Så inruta.gettext() är ett String-objekt. String-objekt har en metod (en funktion) trim() som "hugger av" eventuella blanktecken i början och slutet av strängen och returnerar en "trimmad" sträng. Så inruta.gettext().trim() är ett String-objekt. String-objekt har en metod (en funktion) replace(t1,t2) som byter ut eventuella förekomster av tecknet t1 i strängen mot tecknet t2 och returnerar denna nya variant av strängen. Så inruta.gettext().trim().replace(',','.') är ett String-objekt där alla eventuella komma-tecken bytts ut mot punkter. Det finns en klass som heter Double. (Det är inte den primitiva variabeltypen double utan en klass Double) I klassen finns en rad metoder för flyttalshantering. (I klassen Integer finns motsvarande för heltal) Klassen Double har en metod (en funktion) valueof(string) Den funktionen tar ett String-objekt som argument och returnerar ett objekt tillhörigt klassen Double. Så Double.valueOf(inruta.getText().trim().replace(',','.')) är ett Double-objekt. Double-objekt har en metod (en funktion) doublevalue(). Denna returnerar värdet hos Double-objektet och detta är äntligen - vårt eftersökta flyttal av den primitiva datatypen double (puh!) Talet tilldelas variabeln r och kan användas i beräkningar Övning: Cirkel - igen Ta fram filen Cirkel.java Deklarera radie som double i stället för int Använd någon av ovan beskrivan metoder för att ta hand om den radie som matas in i textfältet (Byt alltså ut parseint-metoden) Du använde förut talet pi = 3.14159 Byt ut mot Math.PI Java7_MestOmMetoder.doc Ove Lundgren 20

Kap 7: Sid 21 Antal decimaler i utskrift Talformat Vi har hittills fått lov att stå ut med att flyttalen i våra program visat onödigt många decimaler. Det är på tiden att vi själva kan bestämma antal decimaler som ska visas. Dags att införa talformat! Gör så här: Importera: import java.text.decimalformat; // ett nytt paket! Deklarera objekt: DecimalFormat d2, d3, m3; Skapa objekt: d2 = new DecimalFormat("0.00"); // ger 2 decimaler d3 = new DecimalFormat("0.000"); // ger 3 decimaler m3 = new DecimalFormat("0.###"); // ger max 3 decimaler // Ev. nollor på slutet // visas ej... Objekt av klassen DecimalFormat har en metod (en funktion), format(tal) Argumentet (tal) är av typ double Funktionsvärdet blir en sträng som innehåller talet med önskat antal decimaler. Exempel: g.drawstring("arean är " + d2.format(area), 10,90 ); g.drawstring("omkretsen är " + d3.format(omkrets), 10,90 ); System.out.println("Slumptal nr " + i + ": " + m3.format(slump)); Övning: RotTabell - igen Ändra koden i RotTabell.java så att talen visas avrundade till två decimaler: import java.text.*; import java.applet.*; import java.awt.*; public class RotTabell extends Applet double y; DecimalFormat d2; public void init() d2 = new DecimalFormat("0.00"); // ger 2 decimaler public void paint(graphics g) g.drawstring("x", 50, 50); g.drawstring( "Roten ur x", 100,50); g.drawline(50,55,200,55); for(int x = 1 ; x <= 10; x++) g.drawstring(x + "", 50, 50 + 20 * x ); y = (double) x; g.drawstring(d2.format( Math.sqrt( y )) + "", 100, 50 + 20 * x ); Java7_MestOmMetoder.doc Ove Lundgren 21

Kap 7: Sid 22 Metoder i en applet Metoder som körs automatiskt När vi skriver en applet (t ex MinApplet) så ärvs ett antal metoder från klassen Applet. Flera av dessa metoder körs automatiskt vid olika tillfällen under en applets "liv". I kapitel 4 beskrev vi dessa metoder ungefär så här: init() start() Körs med automatik när en applet laddas. Här lägger man kod för initialvärden av olika slag. Körs automatiskt då en applet visas Här skrivs kod som får appleten att göra något. Appletens init-metod körs första gången appleten visas. Appletens start-metod körs första gången samt varje gång du återvänder till sidan med appleten. paint(graphics g) stop() destroy() Metoden exekveras automatiskt varje gång en applet visas. Metoden har en parameter, en referens till ett Graphics-objekt. Då metoden anropas blir argumentet referensen till appletens egna grafikobjekt Körs automatiskt då man lämnar webb-sidan med appleten Exekveras automatiskt när man slutar sitt surfpass. I respektive metod skriver man kod för sådant som man vill ska utföras vid respektive tidpunkt. Hittills har du mest omdefinierat init() och paint()-metoderna. Snart kommer exempel där även övriga metoder överskuggas paint()-metoden anropas med automatk då appleten visas. Ibland behöver man anropa paint() på nytt för att rita om appletytan. Du har redan sett att man då använder en metod som heter repaint(). Nästa avsnitt handlar just om metoderna paint() och repaint() samt om ytterligare en metod som är inblandad, nämligen update() Java7_MestOmMetoder.doc Ove Lundgren 22

Kap 7: Sid 23 Metoderna paint(), repaint() och update() Metoden paint(graphics g) är definierad med en parameter som är referens till ett Graphics-objekt. När paint() anropas blir automatiskt argumentet referensen till appletens eget grafiska objekt. (Repetera gärna vad som står om klassen Graphics i kapitel 4) Antag att vi skulle behöva anropa paint(), t ex i actionperformed()-metoden. (Vi kanske vill att appleten ska ritas om - exempelvis efter en knapptryckning. ) Om vi vill skriva kod, en sats som innebär anrop av paint(), vad ska vi då skriva för argument? this.paint(????); Vi känner ju inte namnet på referensen till det appletens grafiska objekt. Det är en intern referens. Appletobjekt har ytterligare en metod, repaint(), som blir vår räddning. Den anropas utan argument: this.repaint(); Metoden utför just vad vi vill: Appleten ritas om! Låt oss se närmare på vad som händer vid ett repaint()-anrop: Vi måste då först bekanta oss med en metod som heter update() Detta är ytterligare en metod som ärvs från klassen Applet. Den har ett Graphics-objekt som parameter, och så här är den definierad (i princip): public void update(graphics g) // Bakgrunden ritas om varvid allt som // eventuellt tidigare uppritats raderas... // paint() anropas: paint(g); update() gör alltså följande: Raderar vad som eventuellt redan ritats på appleten - och anropar sedan paint() När metoden repaint() anropas så anropar denna i sin tur metoden update() Det vill säga, allt som eventuellt är ritat på appleten raderas först, och sedan ritas appleten om. repaint() update() ev. gammalt raderas paint() Java7_MestOmMetoder.doc Ove Lundgren 23

Kap 7: Sid 24 Övning: Överskugga update() Ta fram filen FlyttaJumbo.java och påminn dig om hur den fungerade: I action()-metoden finns satsen this.repaint(); Kör appleten. När du trycker på knapparna så försvinner en tidigare ritad Jumbo och en ny Jumbo ritas varje gång! Antag nu att vi vill göra så att en tidigare ritad Jumbo ligger kvar på appleten när en ny Jumbo ritas. Hur ska vi gå till väga? Naturligtvis genom att göra en egen definition av update()! Vi överskuggar update() så att den inte gör något annat än anropar paint() I filen FlyttaJumbo.java gör följande tillägg: public void update(graphics g) paint(g); Spara - kompilera - provkör Java7_MestOmMetoder.doc Ove Lundgren 24

Kap 7: Sid 25 Metoder som returnerar värde Vi ska experimentera lite med egendefinierade icke-void-metoder (funktioner) Övning: Kvadrattabell Detta är en applet som skriver ut en kvadrattabell ( x 2 )på talen 1 10 (Påminner mycket om appleten som skrev ut kvadratrötter ) import java.applet.*; import java.awt.*; public class KvadratTabell extends Applet public void paint(graphics g) g.drawstring("x", 50, 50); g.drawstring( "Kvadraten på x", 100,50); g.drawline(50,55,200,55); for(int x = 1 ; x <= 10; x++) g.drawstring(x + "", 50, 50 + 20 * x ); g.drawstring( x * x + "", 100, 50 + 20 * x ); Skriv in och testa! Spara KvadratTabell.java i mappen X\java\KvadratTabell I klassen Math finns en funktion som beräknar kvadratroten ur ett tal (Math.sqrt) Det finns däremot ingen funktion som beräknar kvadraten på ett tal. Låt oss skriva en egen sådan metod och utnyttja den i appleten ovan! Ändra ovanstående kod till: import java.applet.*; import java.awt.*; public class KvadratTabell extends Applet private int kvadrat(int i) return i * i ; Här deklareras funktionen public void paint(graphics g) g.drawstring("x", 50, 50); g.drawstring( "Kvadraten på x", 100,50); g.drawline(50,55,200,55); for(int x = 1 ; x <= 10; x++) g.drawstring(x + "", 50, 50 + 20 * x ); g.drawstring( this.kvadrat(x) + "", 100, 50 + 20 * x ); Här sker anropet Här har vi deklarerat en egen private funktion i appleten med namnet kvadrat. Metoden tar ett heltal som parameter och lämnar ett heltalsvärde. Metoden anropas med heltalsargumentet x Java7_MestOmMetoder.doc Ove Lundgren 25

Kap 7: Sid 26 Det är vanligt att man på detta sätt skriver egna metoder/funktioner. Antag t ex att samma beräkning ska utföras många gånger i ett program. Då är det bekvämt att lägga beräkningarna i en funktion som sedan anropas varje gång beräkningen behöver utföras. Övning: En värdetabell Här är en variant. Deklarera funktionen f(x) = 0,5x 2 + x 2 Deklarera alltså funktionen double f(double x) som returnerar ovanstående funktionsvärde. Gör en värdetabell som visar funktionsvärden i intevallet 2 x 2 i steg om 0,25 Använd en while-loop. Försök att skriva appleten på egen hand. Kika nedan om du får problem. import java.applet.*; import java.awt.*; public class VardeTabell extends Applet double x, xstart, xslut, steg; int rad; double f(double a) return 0.5 * a * a + a - 2 ; public void init() xstart = -2.0; xslut = 2.0; steg = 0.25; rad = 70; // för radmatning i appeten public void paint(graphics g) g.drawstring("x", 50, 50); g.drawstring( "f(x)", 100,50); g.drawline(50,55,200,55); x = xstart; while(x < xslut + steg/2) g.drawstring(x + "", 50, rad ); g.drawstring( this.f(x) + "", 100, rad ); rad = rad + 20; x = x + steg; // stega fram sist i while-loopen Spara VardeTabell.java i mappen X\java\VardeTabell Visa i en applet som är 400 x 400 pixels Java7_MestOmMetoder.doc Ove Lundgren 26

Kap 7: Sid 27 Övning: En funktionskurva Ovanstående program kan du använda som utgångspunkt i ett program som ritar en funktionskurva. Vi behöver då översätta x- och f(x)-värden till punkter på skärmen. Vi inför heltalsvariablerna ox och oy som är koordinater för den punkt på appletytan där origo ska ligga. Vidare införs heltalsvariabeln skala som anger hur många pixels det ska vara mellan två heltal på x- respektive y-axeln. Dessutom behöver vi heltalsvariabler som används när vi ska rita kurvan. Vi kallar dem a1 och b1 (a1,b1) (ox,oy) skala En punkt (x, f(x)) på kurvan motsvaras av punkten (a1, b1) på appletytan. Om exempelvis x = 2 så får vi a1 så här: a1 = ox + 2 * skala Allmänt: a1 = ox + x * skala Eftersom a1 är ett heltal och det ingår ett flyttal (x) i vänsterledet måste vi dessutom göra en cast. Javasatsen blir: a1 = ox + (int)(x*skala); På motsvarande sätt får vi y-koordinaten: b1 = oy (int)( f(x) * skala); Minusteckent kommer sig av att y (tvärtemot i matematiken) växer nedåt i datagrafiska sammanhang. När vi ritar kurvan använder vi drawline()-metoden, så kurvan kommer att byggas upp av korta sträckor. Vi inför därför även heltalskoordinaterna a2 och b2 så att vi kan hålla reda på två punkter åt gången. Skriv appleten Kurva. Du får hjälp med det programavsnitt som ritar kurvan: x = xstart; a1 = ox + (int)(x*skala); // Den första punktens x-koordinat på appleten b1 = oy - (int)(f(x)*skala); // Den första punktens y-koordinat på appleten x = x + steg; // Nästa x-värde ger ny punkt while(x < xslut + steg/2) a2 = ox + (int)(x*skala); // Nya punktens x-koordinat på appleten b2 = oy - (int)(f(x)*skala); // Nya punktens y-koordinat på appleten g.drawline(a1,b1,a2,b2); // Ritar sträckan från gammal till ny punkt a1=a2; b1=b2; // Den nya punkten blir ny gammal punkt x = x + steg; // Stega fram till nästa x-värde sist i while-loopen Spara Kurva.java i mappen X\java\Kurva Gör så att koordinataxlar (och kanske skalstreck) visas! Byt till någon annan funktion. Testa trigonometriska och exponentiella funktioner. Om kurvan blir kantig får man ge variabeln steg ett mindre värde. Genom att ändra variabeln skala får man olika storlek på kurvan. Alternativa värden på xstart och xslut visar kurvan i andra intervall. Java7_MestOmMetoder.doc Ove Lundgren 27

Kap 7: Sid 28 Egna klassmetoder En klassmetod (ibland kallad statisk metod) kan användas utan att man först behöver skapa ett objekt. (Motsvarande för klassvariabler) Övning: Klassmetoder I kapitel 2 (avsnittet Klassmetoder och klassvariabler ) fanns en övning där du skulle skriva in följande kod public class Matte public static int sqr(int x) return x*x; public static final double pi = 3.14159; Här deklarerade vi den statiska metoden sqr(int x) som (också) beräknade kvadraten på ett heltal. Dessutom deklarerade vi klassvariabeln pi. Denna var dessutom final vilket betydde att den inte kunde ändras (dvs pi är en konstant) Testa metoden sqr() i din applet Kvadrattabell: Kopiera filen Matte.class till mappen där du har appleten KvadratTabell (Om du inte har filen: Skriv in koden ovan, spara och kompilera ) I appleten KvadratTabell: Ersätt metoden this.kvadrat(x) med Matte.sqr(x). Spara kompilera provkör. Klassen Matte fungerar på samma sätt som JDK-klassen Math Andra klasser kan givetvis använda metoden i Matte dock under en förutsättning att de ligger sparade i samma mapp! Om du vill komma åt Matte från andra klasser måste den vara sparad i en mapp som ingår i classpath-listan Java7_MestOmMetoder.doc Ove Lundgren 28

Kap 7: Sid 29 Övning: Metod som omvandlar sträng blir flyttal Om du använder Java 1.1: Skriv en metod, toflyttal(string s), som tar en sträng som argument och som returnerar motsvarande flyttal. Metoden ska vara publik och statisk och ligga i klassen Matte. Exempel: Vid anropet ska d få värdet 17.67 double d = Matte.toFlyttal( 17.67 ) Utnyttja Double.valueOf(s.trim().replace(',','.')).doubleValue(); Testa din metod i appleten Cirkel: radie = Matte.toFlyttal( inruta.gettext() ); Övning: Max3 Klassen Math har en funktion, max, som returnerar det största av de två tal som anges som argument. Skriv en metod, max3, som returnerar det största av de tre heltal som anges som argument. Metoden ska vara publik och statisk ligga i klassen Matte. Exempel: Vid anropet ska t får värdet 18 int t = Matte.max3(12,5,18); Skriv ett (enkelt konsol-) program, MaxTest.java, för att testa din metod. Spara programmet i X\java\javagrunder Hjälp: Algoritm för att ta fram det största talet av tre: om a > b annars om a>c annars om b > c annars max = a max = c max = b max = c Java7_MestOmMetoder.doc Ove Lundgren 29

Kap 7: Sid 30 Paket Om du vill att din klass ska tillhöra en package (ett paket), gör du så här: package mittpaket; // klassen Matte tillhör paketet mittpaket public class Matte public static int sqr(int i) // metoddefinition enligt ovan public static double toflyttal(string s) // metoddefinition enligt ovan public static int max3(int a, int b, int c) // metoddefinition enligt ovan Filen sparas med namnet Matte.java och kompileras till Matte.class Filen Matte.class ska ligga i en mapp med namnet mittpaket. Den mappen ska i sin tur ligga i JDKs lib-mapp eller i en mapp till vilken du satt CLASSPATH När du sen ska använda någon av metoderna måste klassen först importeras. Om t ex en applet använder någon av metoderna måste appletens kod inledas med: eller import mittpaket.matte; import mittpaket.*; Den senare varianten innebär att samtliga paketanslutna klasser i mappen mittpaket importeras (Du kanske har anslutit fler klasser än Matte till paketet ) Java7_MestOmMetoder.doc Ove Lundgren 30