Nyckelord: Objekt, Instans, Klass, Objektorienterad programmering, Inkapsling
I den här artikeln ska vi lära oss vad ett objekt är i Java. Inom objektorienterad programmering så använder vi objekt och klasser för att bygga upp våra program.
Vad är ett objekt i Java?
Objekt har egna instansvärden men kan dela referenser och bero på andra objekt. Inkapsling döljer interna detaljer och styr hur tillstånd får ändras; den garanterar inte oberoende.
Inkapsling betyder att samla tillstånd och beteende och styra åtkomsten till interna detaljer, exempelvis med privata fält och publika metoder. Det gör inte objekt automatiskt oberoende: de kan dela referenser och påverka gemensamma objekt.
Kort sammanfattat så är ett objekt i Java:
- En instans av en klass och håller de attribut som är angivna vid instansieringen.
- Kan utföra de metoder som är angivna i motsvarande klass.
- Objekt har egna instansvärden men kan dela referenser och bero på andra objekt. Inkapsling döljer interna detaljer och styr hur tillstånd får ändras; den garanterar inte oberoende.
Hur fungerar objekt i Java?
Man kan beskriva det som att ett objekt i Java har tre egenskaper:
- Tillstånd: representerar den data/värde som ett objekt har.
- Beteende: representerar funktionaliteten hos ett objekt.
- Identitet: två referenser kan peka på samma objekt. Operatorn
==jämför om referenserna avser samma objekt.equalskan i stället vara definierad för att jämföra innehåll.
När vi arbetar med objekt så är det uteslutande de två första egenskaperna vi fokuserar på, det tillstånd som ett objekt har och dess beteende.
Till exempel, om vårt objekt är en bil så är:
- Tillstånd. Färg, årsmodell, märke, med mera.
- Beteende: köra framåt, tuta, svänga, med mera.
Beteenden för ett objekt specificeras i de metoder som klassens innehåller.
Ett objekt i Java kan vara i princip precis vad som helst, eftersom det är du själv som avgör hur objektet definieras när du skapar klassen. Man brukar säga att ett objekt är en instans av en klass.
Instansvariabler
Som vi nämnde tidigare så brukar man säga att ett objekt är en instans av en klass. De attributen som ska definieras när man skapar ett objekt kallas därför naturligt för instansvariabler. Objekt från samma klass har samma deklarerade instansfält, men varje objekt kan ha egna fältvärden.
Hur skapar man ett objekt i Java?
Vi använder nyckelordet new tillsammans med klassens konstruktor för att skapa ett objekt. En konstruktor liknar en metod och har samma namn som klassen. Vi kommer att titta närmare på vad en konstruktor i Java är på nästa sida, men nu nöjer vi oss med att konstatera att den används för att instansiera ett objekt.
Vidare, praxis är att namnet på objektet börjar med liten bokstav.
Syntax: Skapa ett objekt i Java
Följande syntax används för att instansiera ett objekt med inparametrar
Syntaxmall: byt ut platshållarna mot konkreta namn, typer och värden.
// Syntax för objekt med inparametrar
KlassNamn objektNamn = new KlassNamn(datatyp parameter1, ...);
Innanför parentesen så anger vi de inparametrar som konstruktorn behöver. Detta är alltså de attributen som objektet ska få.
Syntax: Skapa ett objekt i Java utan inparametrar
Om den konstruktor som klassen har inte kräver några inparametrar för att skapa ett objekt lämnar man helt enkelt parentesen tom.
// Syntax för objekt utan inparametrar
KlassNamn objektNamn = new KlassNamn();
Exempel: Objekt i Java
Nu ska vi se två exempel på hur vi kan skapa objekt i Java. Än en gång, vi kommer referera till klassens konstruktor under dessa exempel, men oroa dig inte om det är något du inte känner igen, vi kommer som sagt titta närmare på konstruktorn i nästa artikel.
Exempel 1: Skapa ett objekt från en klass i Java
I föregående artikel beskrev vi klassen hund enligt koden, där vi också har lagt till konstruktorn för klassen.
//Skapar klassen "Dog". Praxis är att klassnamn har stor bokstav
class Dog {
//Definierar tillstånden/attributen för klassen hund
String name;
int age;
String breed;
String color;
//Definiera konstruktorn (mer om det i nästa artikel)
Dog(String name, int age, String breed, String color){
this.name = name;
this.age = age;
this.breed = breed;
this.color = color;
}
//Definierar metoderna (egenskaperna) för klassen hund
void bark(){
System.out.println(name + " skäller");
}
void eat(){
System.out.println(name + " äter");
}
void sleep(){
System.out.println(name + ": zZZzzZzzZ");
}
}
Figur 1: Attribut och egenskaper för exemplet med objektet hund
Vi ska nu i detta exempel skapa två stycken hundar, alltså två stycken objekt från samma klass:
Hund 1
- Namn: Bosse
- Ålder: 3
- Ras: Terrier
- Färg: Brun
Hund 2
- Namn: Båtsman
- Ålder: 5
- Ras: Sankt Bernhard
- Färg: Svart
Vi skapar nu dessa två objekt i main-metoden:
// Main-metoden
public static void main(String args[]){
Dog dog = new Dog("Bosse", 3, "Terrier", "Brun");
Dog dog2 = new Dog("Båtsman", 5, "Sankt Bernhard", "Svart");
}
Vi har nu två stycken objekt av typen Dog. Det ena objektet heter “dog” och det andra objektet heter "dog2", och vi kan exempelvis anropa metoderna i vardera objekt enligt rad 38, 39 och 40 som vi lägger till i main-metoden.
// Main-metoden
public static void main(String args[]){
Dog dog = new Dog("Bosse", 3, "Terrier", "Brun");
Dog dog2 = new Dog("Båtsman", 5, "Sankt Bernhard", "Svart");
// Anropa metoder
dog.eat();
dog2.bark();
dog.sleep();
}
Resultatet vi får blir då:
Bosse äter
Båtsman skäller
Bosse: zZZzzZzzZ
Vilket låter väldigt trevligt för Bosse, att han först får äta mat och sen ta en liten tupplur. Som du ser så skiljer de två hundarna sig åt, men vi kan trots det använda samma klass för att skapa objekten (de har ju alla samma egenskaper). Detta är väldigt användbart när man vill programmera flera objekt av samma sort, till exempel, kanske vill du programmera en hel hundgård av kompisar till Bosse och Båtsman?
Exempel 2: Skapa ett smartphone objekt från en klass
Vi tar ett till exempel bara för att det ska bli extra tydligt. I det här exemplet ska vi skapa två mobiltelefoner och låt oss börja med att titta på vår klass som vi har döpt till SmartPhone som innehåller följande
public class SmartPhone {
// Variabler vi använder i konstruktorn
private String brand;
private String model;
// Klassens konstruktor
SmartPhone(String brand, String model){
this.brand = brand;
this.model = model;
}
public void call(){
System.out.println("Nu ringer: " + brand + " " + model);
}
public void sendText(){
System.out.println( brand + " " + model + " skickar ett SMS");
}
}
Det som är viktigt att notera här är hur många inparametrar klassens konstruktor kräver. Kom ihåg att inparametrar som konstruktorn behöver är de attributen som objektet ska få.
Om vi sedan tar och skapar två telefoner, eller rättare sagt, två objekt:
public class testClass {
public static void main(String args[]) {
// Skapar ett objekt för en iPhone
SmartPhone iPhone = new SmartPhone("iPhone" , "12");
iPhone.call();
iPhone.sendText();
// Skapar ett objekt för en Samsung
SmartPhone samsung = new SmartPhone("Samsung", "Galaxy S20");
samsung.call();
samsung.sendText();
}
}
Det vi har gjort är att skapa ett objekt för en iPhone (rad 5) och en Samsung (rad 12). Vi har skapat objekten genom att först ange namnet på klassen, SmartPhone, följt av det namn som vi vill ge vårt objekt. Sedan så skriver vi new följt av klassens namn igen. Viktigt att notera att innanför parentesen så ger vi två inparametrar och båda är datatyp String.
Hur man vet hur många inparametrar som behövs och av vilken datatyp? Det bestämmer vi i klassens konstruktor.
Om vi tar och exekverar koden ovan så får vi resultatet:
Nu ringer: iPhone 12
iPhone 12 skickar ett SMS
Nu ringer: Samsung Galaxy S20
Samsung Galaxy S20 skickar ett SMS
Sammanfattning: Objekt i Java
Objekt har egna instansvärden men kan dela referenser och bero på andra objekt. Inkapsling döljer interna detaljer och styr hur tillstånd får ändras; den garanterar inte oberoende.
Praxis när man instansierar ett objekt är att namnet på objektet börjar med liten bokstav.
Syntax för att skapa ett objekt
Syntaxmall: byt ut platshållarna mot konkreta namn, typer och värden.
// Syntax för objekt
KlassNamn objektNamn = new KlassNamn(datatyp parameter1, …);
Vanliga frågor och svar: Objekt i Java
Ett objekt är vad som kallas för en instans av en klass och när vi instansierar ett objekt så betyder det helt enkelt att vi skapar ett objekt från en klass.
Syntax för att skapa ett objekt är:
KlassNamn objektNamn = new KlassNamn(datatyp parameter1, …);
Det betyder att vi använder nyckelordet new tillsammans med klassens konstruktor för att skapa ett objekt. En konstruktor liknar en metod och har samma namn som klassen. Innanför parentesen så anger vi de inparametrar som konstruktorn behöver och det är de attributen som objektet ska få. Om den konstruktor som klassen har inte kräver några inparametrar för att skapa ett objekt lämnar man helt enkelt parantesen tom.
Enkelt förklarat så kan man beskriva det som att skillnaden mellan en klass och ett objekt är att en klass är en mall för objekt. Om vi tar ett exempel med en bil så är en klass den mall/ritning som beskriver vad bilen ska bestå av och vad bilen ska kunna utföra. Ett objekt är då en bil som är skapad utifrån den mallen, eller rättare sagt, av den klassen.