TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?

Relevanta dokument
TDDD78 Viktiga begrepp, del 2

TDDD78 Objektorientering: Lagring och livstid

Objektorientering: Lagring och livstid

Objektorientering: Lagring, räckvidd och livstid

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

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

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

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

TDDD78 Viktiga begrepp i programmering / objektorientering

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

DAT043 - Föreläsning 7

TDDD78 Introduktion till OOP i Java

Föreläsning 13 Innehåll

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

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDDD78 Introduktion till OOP i Java

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Classes och Interfaces, Objects och References, Initialization

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

TENTAMEN OOP

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

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

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

TDDD78 Introduktion till OOP i Java

Exempel på användning av arv: Geometriska figurer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningsförslag övning 2.

Ärvning av implementation. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

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

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 7/ Exempel: Implementation av Schackpjäser.

Sammanfattning och repetition utgående från typiska tentamensuppgifter

TDDD78 Objektorientering i Java, del 3

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

Objektorienterad programmering i Java

Föreläsning 3-4 Innehåll

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

TENTAMEN OOP

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Föreläsning REPETITION & EXTENTA

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Tentamen OOP

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 2, vecka 8: Repetition

Lösningsförslag till tentamen

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TDDD78 Objektorientering i Java, del 2

TENTAMEN OOP

Del A (obligatorisk för alla)

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Modeller, Objekt och Klasser

Repetition av OOP- och Javabegrepp

Programmering för språkteknologer II, HT2014. Rum

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

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Laboration 1: Figurer i hierarki

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Repetition av OOP- och Javabegrepp

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Del A (obligatorisk för alla)

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

Lösningsförslag tentamen FYTA11 Java

Objektorienterad Programmering (TDDC77)

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Enkla variabler kontra referensvariabel

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

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

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

TDA550 - Objektorienterad programvaruutveckling, fk

Transkript:

TDDD78 Objektorientering i Java, del 4 Hur vet man om två objekt är lika? Hur undviker man objekt och när? jonas.kvarnstrom@liu.se 2016

Identitet och likhet Är identitet och likhet samma sak? Oj, vi har samma kläder på oss idag! Nej, men likadana! Besserwisser 3 Två rutor som: Är exakt likadana Men inte samma de har varsin identitet

Identitet i Java (vad är "samma" objekt?)

Identitet "Samma objekt" betyder "samma adress" Ser jag två saker i minnet, så är de inte samma sak: Då vore de ju en sak Olika adress = olika identitet! Även om innehållet (tillståndet) är lika Datorns minne Object (data) header: x 12.7 y 4.512 r 0.0002 5 Object (data) header: x 12.7 y 4.512 r 0.0002

Identitet och == 6 == jämför värdet på två variabler Värdet av en objektvariabel är en pekare (adress) Minne name: Nod 1 10000 == jämför pekare == testar om två variabler pekar på samma objekt! nod2!= nod3 nod2.boss == nod3.boss name: Nod 2 boss: 10000 name: Nod 3 boss: 10000 Python: is / is not 49152 53284

Likhet i Java

Likhet = identiskt tillstånd? Vad betyder likhet? 1) Två objekt med identiskt tillstånd bör vara "lika" Exempel: Två strängobjekt på olika plats i minnet innehåller samma tecken s1!= s2, men vi tycker objekten är "lika" s1 s2 Minne 8 Header: (data) chars "Hello" Header: (data) chars "Hello" Exempel: Två cirkelobjekt med samma position och radie c1!= c2, men vi tycker objekten är "lika" c1 c2 Header: (data) x 12.7 y 4.512 r 0.0002 Header: (data) x 12.7 y 4.512 r 0.0002

Likhet: Även vid olika tillstånd! Scenario: Vi vill hitta fel i cirkelklassen Lägger till tidsstämpel för när varje objekt skapades Objekt med olika tidsstämpel kan anses "lika"! Scenario: Vi håller reda på datum och tider Fält för datum, klockslag och tidszon Vi vill (kanske) att 12:00 GMT är "samma tid" som 13:00 WET (Western European Time) 9 Datorns minne Object (data) header: x 12.7 y 4.512 r 0.0002 created 4711.31 Object (data) header: x 12.7 y 4.512 r 0.0002 created 4715.77 "Likhet" är inte samma sak som "alla fält har samma värde"

Likhet: Inte fördefinierad Vi måste definiera likhet vad menar vi egentligen? Ska finnas för alla klasser Klassen Object definierar metoden equals(), ärvs till alla andra klasser Object 10 Thread Component String AbstractCollection Kan behöva vara olika för olika klasser Använd overriding för att definiera om equals() Används av många klasser och metoder List.contains(element) tittar om listan har ett element som är lika / equal List.indexOf(element) ger positionen för ett element som är lika / equal

Likhet: Metodsignatur 11 Måste kunna jämföra objekt utan att veta typen i förväg! Lösning: equals() tar Object som parameter Accepterar vilken typ av objekt som helst Object.java public class Object { public boolean equals(object other) { MyList.java public class MyList { public boolean contains(object other) { for (int i = 0; i < size(); i++) { Object atthispos = get(i); if (atthispos.equals(other)) return true; return false; equals() finns i alla objekt även atthispos equals() accepterar alla objekt även other

Likhet: Standardbeteende Måste ha en första implementation i Object Men Object har inga fält Enda alternativen: Två Object anses alltid lika (per default) Två Object anses alltid olika (per default) 12 Vill inte riskera att returnera sant om objekten borde ses som olika: Object.java public class Object { public boolean equals(object other) { return this == other;

Likhet: Standardbeteende I andra klasser: Overriding Åtminstone om man behöver jämföra objekt av denna typ! 13 Circle.java public class Circle { // Cirklar jämför man så här! public boolean equals(object other) { Parametern måste vara av typ Object, inte Circle: Vi måste kunna jämföra en cirkel med vad som helst!

Likhet: Några krav 14 Några krav på likhet (en ekvivalensrelation): Måste vara reflexiv: x.equals(x) Måste vara symmetrisk: Måste vara transitiv: Får inte returnera sant för null: x.equals(y) y.equals(x) x equals(y) och y.equals(z) x.equals(z) x.equals(null) == false Ger ramar att hålla oss till

Implementera equals(): Circle En equals() för Circle: 15 public class Circle { protected double x, y, r; public boolean equals(final Object o) { if (this == o) return true; // Alltid lika med sig själv if (o == null) return false; // Aldrig lika med null if (getclass()!= o.getclass()) return false; // Måste vara samma klass final Circle that = (Circle) o; OK, det var en cirkel: Se till att få rätt pekartyp if (this.x!= that.x) return false; if (this.y!= that.y) return false; if (this.r!= that.r) return false; Testar våra egna krav: Samma x, y och radie return true; Allt OK: Är lika

Implementera equals(): Objektfält När vissa fält är objektpekare: Hur jämför vi? public class ColorCircle { protected double x, y, r; protected Color color; public boolean equals(final Object o) { if (this == o) return true; if (o == null getclass()!= o.getclass()) return false; 16 final ColorCircle that = (ColorCircle) o; if (this.x!= that.x) return false; if (this.y!= that.y) return false; if (this.r!= that.r) return false; if (this.color!= that.color) return false; return true; Circle gc1 = new ColorCircle(10, 11, 12, new Color(0,0,0)); Circle gc2 = new ColorCircle(10, 11, 12, new Color(0,0,0)); gc1.equals(gc2) är falskt!!= testar om that.color pekar på samma färgobjekt

Implementera equals(): Objektfält Använd equals() för objektfält! public class ColorCircle { protected double x, y, r; protected Color color; public boolean equals(final Object o) { if (this == o) return true; if (o == null getclass()!= o.getclass()) return false; final ColorCircle that = (ColorCircle) o; if (this.x!= that.x) return false; if (this.y!= that.y) return false; if (this.r!= that.r) return false; if (!this.color.equals(that.color)) return false; 17 return true; equals() testar om det är samma färgnyans

Implementera equals(): Objektfält, null När vissa fält kan vara null: 18 public class ColorCircle { protected double x, y, r; protected Color color; // Kan vara null @Override public boolean equals(final Object o) { if (this == o) return true; if (o == null getclass()!= o.getclass()) return false; final ColorCircle that = (ColorCircle) o; if (this.x!= that.x) return false; Har vi en färg? Kolla if (this.y!= that.y) return false; att den är lika med if (this.r!= that.r) return false; det andra objektets. if (this.color!= null &&!this.color.equals(that.color)) return false; if (this.color == null && that.color!= null) return false; return true; Saknar vi färg? Kolla att den andra också saknar det.

Implementera equals(): Ärvning 19 När vi behöver låta superklassen testa sin likhet: public class Circle { protected double x, y, r; public boolean equals(object other) { if (this == o) return true; // Alltid lika med sig själv if (o == null) return false; // Aldrig lika med null if (getclass()!= o.getclass()) return false; // Måste vara samma klass testa x, y, r public class GraphicCircle extends Circle { protected Color outline, fill; public boolean equals(final Object o) { if (!super.equals(o)) return false; final GraphicCircle that = (GraphicCircle) o; if (!outline.equals(that.outline)) return false; if (!fill.equals(that.fill)) return false; return true; Superklassen testar: null, klass, superklassens fält Vi testar: Våra nya fält

Tre sorters variabel (1): Lokal Deklareras i en metod Lokal variabel Varje anrop får sin egen "kopia": Två anrop till foo() egna variabler, med samma namn 'x' Kort livstid: Anropet avslutas variabeln försvinner 21 public class MyGame { public void paint() { int x = calcx(); int y = calcy(); drawplayerat(x, y); Tillfälliga värden, hör till metodanropet När vi är klara, släng bort variablerna

Tre sorters variabel (2): Fält Deklareras i en klass Fält / medlemsvariabel Varje instans/objekt får sin "kopia": Två olika objekt egna fält, med samma namn 'x' Två anrop till metoder i samma objekt samma variabel x! Längre livstid: Objektet slängs bort variabeln försvinner 22 public class MyProg { private int x, y; public void paint() { drawplayerat(x, y); public void setx(int x) { this.x = x; Värdena hör till objektet, och måste finnas kvar längre Används från metoder, kanske flera Kan (eventuellt) ändras av andra metoder

Varning för fält (1) Varning: Använd inte fält när lokala variabler räcker! Exempel: Här finns listan kvar ända till nästa anrop, trots att ingen annan behöver den minnesläcka? 23 public class FieldCollision { private List list; public List getallmembers() { list = new ArrayList<>(); // Lägg till objekt i list // Lägg till objekt i list // Lägg till objekt i list return list;

Varning för fält (2) Varning: Använd inte fält när lokala variabler räcker! Exempel: Med multitrådade program kan man få flera samtidiga anrop 24 public class FieldCollision { private List list; public List getallmembers() { list = new ArrayList<>(); // Lägg till objekt i list // Lägg till objekt i list // Lägg till objekt i list return list; Halvvägs genom getallmembers() anropar någon annan samma metod Fältet list byts ut, även för det första anropet! Ena anropet ger 2 element, andra 4

Varning för fält (3) 25 public List getallmembers() { list = new ArrayList<>(); // Lägg till objekt i list // Lägg till objekt i list // Lägg till objekt i list return list; public List getallmembers() { list = new ArrayList<>(); // Lägg till objekt i list // Lägg till objekt i list // Lägg till objekt i list return list; private List list;

Tre sorters variabel (3): Statisk Statiskt fält Deklareras i en klass, static Varje programkörning har sin egen "kopia", allokeras statiskt (inte dynamiskt per objekt / anrop) Ett enda värde lagras, i klassen Ligger inte i ett objekt; behöver inte ens något objekt för att komma åt värdet 26 public class Circle { public static int circlescreated = 0; public double x, y, r; public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; Circle.circlesCreated++; Håll reda på antal cirklar som skapades Värdena hör till klassen, och måste finnas kvar efter objekten försvinner

Statiska fält 1: Lagring Illustration: Statiska fält lagras i klassen Circle c1 = new Circle(1, 2, 3); Circle c2 = new Circle(10,11,12); System.out.println(Circle.circlesCreated); Åtkomst via klassen, inte ett objekt 27 c1 c2 Header: (data) x 1 y 2 r 3 Header: (data) x 10 y 11 r 12 Class Circle Static field circlescreated getcircum code getarea code setradius code

Statiska fält 2: Som namngivna konstanter Konstanter bör (nästan) alltid namnges för läsbarhet 28 public class CardGame { public void shuffle() { for (int i = 0; i < 52; i++) { //... Namngivna konstanter: static i klassen final ändras inte namn stora bokstäver (WITH_UNDERSCORE) Lagras en gång slösar inte minne public class CardGame2 { private static final int DECK_SIZE = 52; public void shuffle() { for (int i = 0; i < DECK_SIZE; i++) { //... Vanlig anledning till komplettering!

Statiska fält 3: "Globala" variabler Kan också användas till "globala" variabler, åtkomliga överallt 29 Varning! Globala variabler ger ofta problem! Använd dem bara i undantagsfall!

Exempel: Poänglista i Tetris (1) Tetris: Alla som spelar parallellt ska ha samma highscore-lista Detta faktum ska aldrig ändras: Vi kommer aldrig att vilja dela upp spelare i grupper med olika listor Globalt tillstånd kan möjligen vara OK 30

Exempel: Poänglista i Tetris (2) Alternativ 1: Lagra all information direkt som statiska variabler 31 public class HighscoreList { public static List<Score> scores; public static void addscore(score newscore) { scores.add(newscore); scores.sort( ); public static Score gethighestscore() { return scores.get(0); Användning: HighscoreList.addScore(theScore); Det finns inget objekt av HighscoreList-typ kan inte skicka som parameter, kan inte override:a metoder, kan inte implementera gränssnitt,

Exempel: Poänglista i Tetris (3) Alternativ 2, Singleton: Låt listan vara ett objekt Men se till att bara en instans skapas, och ge enkel tillgång till den public class HighscoreList { // Privat konstruktor, så bara klassen själv kan skapa instanser. private HighscoreList() { 32 // Skapa bara objekt av denna typ EN gång, när klassen laddas. private static final HighscoreList INSTANCE = new HighscoreList(); // Låt andra komma åt det unika objektet! public static HighscoreList getinstance() { return INSTANCE; public List<Score> scores; public void addscore(score newscore) { public Score gethighestscore() { Användning: HighscoreList hs = HighscoreList.getInstance(); hs.addscore(thescore); // Vanligt objekt! Problem: Vem som helst kan komma åt listan utan att ha "fått" den Kan bli svårare att förstå programmets struktur Oftast bra att undvika (skicka istället objektet till de som behöver det)

Exempel 2: Spelbräde i Tetris Labb 4, Tetris: Just nu spelas bara ett spel i taget Frestande att låta Board vara en singleton Alla kan direkt komma åt den, behöver inte skickas som metodparameter 33 Senare: Vill kunna spela flera spel parallellt, över nätet Varje spel ska ha sitt eget Board Måste göra om koden Globalt tillstånd gör förändringar svårare! Använd bara globala tillstånd om ni är helt säkra på att man inte har någon anledning att ändra det

Två sorters metoder Instansmetoder Anropas för ett specifikt objekt: mycircle.getradius() 35 Statiska metoder (klassmetoder) Anropas för en klass: Circle.getPI() Kan använda "samma objekt": this Anropa andra metoder Använda fält Det närmaste man kan komma till en "global funktion"

Statiska metoder: Exempel 1 När du startar ett Java-program... Du bestämmer vilken klass som ska "startas" (CircleTest) Java skapar inte ett objekt av den typen Laddar in själva klassen Letar efter en speciell statisk metod: public static void main(string[] args) Om den existerar: Anropar den public class CircleTest { public static void main(string[] args) { 36

Statiska metoder: Exempel 2 37 Att anropa metoder i samma klass: public class CircleTest { public static void main(string[] args) { printusage1(); printusage2(); public void printusage1() { System.out.println("Usage: java MyMain [args]"); public static void printusage2() { System.out.println("Usage: java MyMain [args]"); printusage1 är inte static Samma som this.printusage1() Men this = "objektet som den här metoden, main(), anropades i" Finns inte kompileringsfel! Samma som CircleTest.printUsage2() Fungerar bra!

Statiska metoder: Exempel 3 Men statiska metoder kan så klart anropa icke-statiska! Bara vi anger i vilket objekt 38 public class CircleTest { public static void main(string[] args) { String first = args[0]; System.out.println(first.length()); println() och length() är inte statiska Fungerar bra: Vi försöker inte använda this

Statiska hjälpmetoder En metod som roten ur : Hör inte naturligt till ett specifikt objekt Behöver inte lagra information som finns kvar när den returnerat 39 Kan vara en statisk hjälpmetod Exempel: java.lang.math public class Circle { public final double x, y, r; // center coordinates, radius public boolean contains(double a, double b) { // Is point (a,b) inside this circle? final double dx = x a; final double dy = y b; final double distance = Math.sqrt(dx * dx + dy * dy); if (distance < r) return true; else return false;

Hjälpklasser Bara statiska metoder en hjälpklass (utility class) Används i undantagsfall Flera associerade funktioner som inte hör ihop med ett specifikt objekt Komplex kod eller används av flera klasser (annars kan det placeras i användande klassen!) 40 Att tänka på: Vill inte kunna skapa objekt av denna klass Skapa en privat konstruktor! public final class Math { /** * Don't let anyone instantiate this class. */ private Math() {