Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Excerpt

Oppgaven Dette eksemplet handler om en Circle-klasse, som har en radius og kan regne ut omkrets og areal.

...

Tilstand og metoder

For å beregne omkretsen og arealet til en sirkel må objektet ihvertfall vite om radiusen. Hvis objektet også skal kunne vises som grafikk, vil en også trenge posisjon, men dette utelater vi her.

Tilstanden i Circle-objekter er som blir dasom følger:

  • radius - et desimaltall som angir radiusen til sirkelen. Denne være satt når en sirkel opprettes - en sirkel kan ikke eksistere uten å ha en radius vel!

Circle-klassen har to metoder, getCircumference() og getArea(), med følgende oppførsel:

  • double getCircumference() - beregner omkretsen til sirkelen, basert på radius og returnerer denne
  • double getArea() - beregner arealet til sirkelen basert på radius og returnerer denne

Skriv Java-kode for Circle-klassen med oppførsel som er beskrevet over.

Begge disse metodene gjør en beregning basert på innholdet i objektet, men endrer ikke objektet.

I tillegg er det greit å lage Lag en passende toString()-metode og et hovedprogram, slik at du en kan sjekke at oppførselen stemmer med oppgavespesifikasjonen spesifikasjonen, altså beskrivelsen over.

JExercise-testkode for denne oppgaven finner du her: stateandbehavior/CircleTest.java.

 

Eksempelløsning for Circle-klassen

Klassen lagrer radiusen i et attributt (kalt felt i Java) av typen double. Dette feltet initialiseres av konstruktøren, som tar inn et double-argumentet og setter radius-feltet til denne verdien. Her brukes this.radius for å referere til attributtet (og "hoppe over" argumentet) og kun radius for å referere til argumentet.

Metodene getCircumference() og getArea() bruker radius-attributtet i de vanlige formlene for omkrets og areal. Her er bruken av this i this.radius strengt tatt ikke nødvendig, siden radius alene også vil blir tolket som en referanse til attributtet, da det ikke er argumenter eller lokale variable "i veien".

toString()-metoden lager en String med ved å skjøte sammen mange deler med +. En alternativ variant med bruk av String.format er også vist. Den tar inn en String med formatteringsdirektiver som forteller hvor de påfølgende argumentene skal spleises inn i teksten. %.2f brukes som direktiv siden verdiene er desimaltall (f for floating point-verdier) og vi bare vil at tallene skal vises med to desimaler.

...

Code Block
package stateandbehavior;

public class Circle {

	public double radius; // radiusen lagres i et dette attributtet

	// konstruktøren brukes til å initialisere objektet
	public Circle(double radius) {
		// radius-attributtet settes til argumentet
		this.radius = radius;
	}
	
	public double getCircumference() {
		return 2 * this.radius * Math.PI;
	}
	public double getArea() {
		return this.radius * this.radius * Math.PI;
	}
	// Method for rounding two decimal precision
	public double convertToTwoDecimalPlaces(double input) {
		return Math.round(input * 100) / 100.0;
	}
	public String toString() {
		// First, round to two decimal precision
		double circumference = convertToTwoDecimalPlaces(this.getCircumference()); 
		double area = convertToTwoDecimalPlaces(this.getArea());
		// Then create string
		return "[En sirkel med radius " + this.radius + ", har omkrets " + circumference + " og areal " + area + "]";
		// alternativ: formattert String
		// return String.format("[En sirkel med radius %.2f, har omkrets %.2f og areal %.2f]", this.radius, circumference, area);
 	}
}

For å prøve ut koden lager vi en hovedprogramklasse kalt CircleProgram. Det vanlige er å ha en init()- og en run()-metode, men vi utelater init() her, siden programmet er så lite og enkelt. Det er tross alt vi som velger hva de heter, basert på hva som er ryddig og bekvemt.

I run()-metoden opprettes to Circle-objekter med new. Disse er illustrert i figuren til høyre (id'ene #1 og #2 er kun med for å illustrere at dette er forskjellige objekter). Disse objektene skrives så ut med System.out.println-metoden. Dette vil implisitt kalle toString()-metoden, siden System.out.println bruker denne internt, for å gjøre om argumentet til en String, før det skrives ut.

Merk at main-metoden må være deklarert akkurat slik for å bli kalt av Java, når klassen som helhet skal utføres. Den lager en instans av programmet og kaller run()-metoden som gjør "jobben".

Code Block
package stateandbehavior;

// 

...

hovedprogramklasse 

...

for testing 

...

av Circle

public class CircleProgram {

	public void run() {
		Circle circle1 = new Circle(5);
		System.out.println(circle1);
		Circle circle2 = new Circle(10);
		System.out.println(circle2);
	}

 	public static void main(String[] args) {
		CircleProgram program = new CircleProgram();
		program.run(); 
	}
 }
PlantUML Macro
object "#1: Circle" as circle1 {
	radius = 5.0
}

object "#2: Circle" as circle2 {
	radius = 10.0
}

 

 

Include Page
Bunntekst for JExercise-oppgaver
Bunntekst for JExercise-oppgaver

...