Labb 0, Java-introduktion
Förberedande uppgifter
Kösystemet Stay a while på queue.csc.kth.se används för hjälp och redovisning. Använd ett eget Zoomrum för labbpasset. För hjälp och redovisning, lägg in Zoom-länken i rutan Location. Ange vilken labb det är och om ni vill ha hjälp eller redovisning.
Underkatalog för kursen
Detta bör vara självklart för alla: Skapa en egen katalog för kursen där varje labb får en underkatalog (som vid behov själva ges underkataloger). Om du använder en utvecklingsmiljö så kan det gå automatiskt.
Mål
Målet med denna labb är att lära sig grunderna i Java. Labben tar upp grundläggande syntax, enkla variabler och array-strukturer, kontrollstrukturer, klassdefinitioner med flera konstruktorer samt arv.
Del 1
Rekommenderad läsning: Variables Links to an external site., Introduction to classes Links to an external site. och Defining Classes in Java Links to an external site..
Den första upgiften är att skriva en klassdefinition för klassen Person. Objekt från klassen Person ska kunna lagra information om personer, och det ska vara möjligt att hämta denna information från objekt ur klassen.
Klassen ska ha följande fält |
|
name |
lagrar namnet på personen |
age |
lagrar åldern (i hela år) på personen |
Klassen ska ha följande metoder |
|
Person(String nameIn, int ageIn) |
konstruktor som skapar ett nytt objekt av klassen Person |
toString() |
returnerar en String som innehåller data om personens namn och ålder, t.ex: "namn: Putte, ålder: 25 år" |
getName() |
returnerar namnet |
getAge() |
returnerar åldern |
Uppgift 1.1: Skriv klassdefinition för klassen Person.
Fråga 1.2: Vilka typer bör variablerna vara?
Fråga 1.3: Vilka typer bör metoderna returnera?
Fråga 1.4: Vilka fält/metoder bör vara private, och vilka bör vara public?
Del 2. Objekt och körbara program
Rekommenderad läsning: Hello World Links to an external site. och Objects Links to an external site..
Nästa uppgift blir att skriva ett körbart program som skapar objekt av klassen Person, och anropar dess metoder.
Uppgift 2.1: Skriv ett program med en main-metod som skapar ett objekt av typen Person.
Uppgift 2.2: Låt programmet skriva ut ålder och namn på Person-objektet ovan. Använd dels de båda get-metoderna, och dels toString()-metoden.
Fråga 2.3: Måste man anropa toString() explicit? Vad händer om man skriver så här:
Person britt = new Person("Britt", 27);
System.out.println(britt);
Varför blir det så?
Del 3. Arrayer, loopar och this
Den grundläggande och effektiva array-strukturen som konstrueras med hakparanterser ( [ ] ) ska användas i labben, inte någon annan typ av lista som behöver importeras från bibliotekspaketet java.util. java.util får inte användas i labben.
Rekommenderad läsning: Arrays Links to an external site., The for statement Links to an external site. och eventuellt Beyond basic arithmetic Links to an external site..
Nästa uppgift blir att skriva ett körbart program som skapar en array av objekt av klassen Person, och anropar dess metoder. För att underlätta skapandet av flera objekt utökar vi klassen Person med en parameterlös konstruktor som genererar en slumpmässig person. Konstruktorn har alltså inga indata men ger ändå värden till name och age.
Låt konstruktorn skapa en slumpmässig ålder och ett slumpmässigt namn. För att skapa slumptal kan man använda Math.random() Links to an external site.. Denna metod returnerar en double mellan 0 och 1 (inklusive 0 men inte 1). Använd Math.random() Links to an external site.för att skapa ett slumpmässigt heltal mellan 15 och 100 och låt det bli personens ålder. Det är inte viktigt om 100 inkluderas eller ej.
För att skapa slumpmässiga namn ska klassen Person ha en array av fördefinierade namn och låta slumpen välja ett av dem. Tänk på att indexet som väljer ett element ur en array måste vara en int, och får ha värden från 0 till n-1, där n är antalet element i arrayen. Arrayen ska ha minst 10 namn men antalet (t.ex. 10) får inte vara "hårdkodat", dvs ska inte skrivas i klartext. Om man lägger till ett namn till arrayen ska klassen inte behöva ändras för övrigt. Klassen måste dock kompileras om efter ett namntillägg. Man ska inte kunna lägga till namn under körning.
När en klass har flera konstruktorer är det vanligt att man låter en konstruktor anropa en annan. Metoden this() anropar konstruktorer i samma klass. Vilken konstruktor som anropas (om det finns flera) bestäms av parametrarna. Anrop av this() måste stå allra först i den nya konstruktorn. De aktuella parametrarna till this() får inte innehålla anrop av instansmetoder ur klassen man håller på att skriva. Anrop av klassmetoder går bra. Ni får välja själva om this() ska ska användas för den slumpande konstruktorn.
Uppgift 3.1: Lägg till en ytterligare konstruktor till klassen Person, som inte tar några argument, och som skapar en slumpmässig person enligt texten ovan.
Som nästa steg ska vi låta programmet skapa en array av slumpade Person-objekt. När ni har skapat en hel array, ska programmet skriva ut alla personer i listan, en på varje rad. Använd toString()-metoden explicit eller implicit. Skapa en ny fil för denna uppgift, så att ni har kvar det ursprungliga programmet att visa upp när ni redovisar.
Uppgift 3.2: Låt programmet skapa en array med minst 15 st slumpmässiga personer, och skriv ut dessas namn och ålder. Längden av denna array (t.ex. 15) får vara hårdkodat.
Fråga 3.3: Arrayen som innehåller namn (som konstruktorn slumpmässigt hämtar ifrån) i klassen Person bör vara deklarerad static. Programmet fungerar likadant även om man utelämnar static. Varför är det ändå bättre att arrayen är static?
Del 4. Arv
Rekommenderad läsning: Introduction to classes Links to an external site., Inheritance Links to an external site. och The if statement Links to an external site..
Nästa uppgift blir att definiera den nya klassen Student som ärver från klassen Person. Klassen Student har, förutom de egenskaper som Person har, dessutom en årskurstillhörighet, t.ex CINEK2018, om man går programmet Industriell Ekonomi och startade 2018.
Uppgift 4.1: Skapa klassen Student som ärver från klassen Person.
Uppgift 4.2: Ge klassen Student fältet year, som innehåller året som personen började på KTH. Ge Student en konstruktor som utöver de tidigare parametrarna (namn och ålder) även tar startåret..
Uppgift 4.3: Ge klassen Student ytterligare en konstruktor som är parameterlös och som ger slumpmässiga värden till name och age (som för Person) men också slumpar ett värde till year. Koden i konstruktorn för Person ska inte upprepas. Anropa superklassens konstruktor!
I den parameterlösa konstruktorn, se till att year aldrig är senare än 2020 samt att ingen person är yngre än 15 år vid starten på KTH. Årtalet 2020 får vara hårdkodat. Tips: Läs av personens ålder och använd det värdet för att räkna ut vilket år personen var 15 år. Slumpa ett årtal mellan detta år och 2020 och låt det bli KTH-startåret.
Uppgift 4.4: Utöka toString() så att även årskursen skrivs ut, t.ex "Namn: Putte, ålder: 25, började på CINEK 2013". Lägg desutom till metoden getYear() som returnerar årtalet.
Programnamnet, t.ex. CINEK, behöver inte vara instansvariabel eller parameter. Skriv bara dit (hårdkoda) ert favoritprogram (eller skriv "KTH").
Uppgift 4.5: Låt programmet skapa en array med minst 15 st slumpmässiga Studenter, och skriv ut dessas namn, ålder och årskurs.
Uppgift 4.6: Låt programmet skapa en enda array med minst 5 st slumpmässiga objekt av klassen Student och minst 5 st slumpmässiga objekt av klassen Person. Därefter, i en enda for-loop över arrayen, skriv ut objektens namn, ålder och, för Student-objekten, program och startår.
Loop-krav
Programmen som skapar och skriver ut många objekt av Person och Student ska använda båda typerna av for-loopar, den "vanliga" och foreach-loopen.
- Vanlig for-loop: for (initiering; villkor; uppdatering) ... t.ex. for (int i=0; i<N; i++) ...
- Foreach-loop: for (Element e : theList) ... t.ex. for (Person p : myGroup) ...
Redovisning
- Klasserna Person och Student samt programmen som skrivits vid punkterna 3.2 och 4.6 ska finnas tillgängliga och visas.
- Förutom att kunna svara på alla möjliga frågor kring programmen så ska ni ska kunna svara på frågorna som ställs i texten ovan, fråga 3.3 är särskilt intressant och viktig.