# Instuderingsfrågor klasser och arv
### Begreppsfrågor
Vad är en klass i Java?
Hur skapar du en instans av en klass i Java?
Vad är en konstruktor och hur skiljer den sig från en vanlig metod i en klass?
Förklara begreppet arv (inheritance) i Java.
Hur skapar du en klass som ärver från en annan klass i Java?
Förklara vad det innebär att "overrida" en metod och ge ett exempel på hur det görs.
Vad är polymorfism och hur används det i Java?
Vad är en åtkomstmodifierare och vad används de till?
Vad innebär det att en variabel i en klass är private?
### Analysera kod
Vad kommer koden skriva ut?
```java
public class MyClass {
int x;
public void printX() {
System.out.println(x);
}
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.x = 5;
obj.printX();
}
}
```
Vad kommer koden skriva ut?
```java
public class Person {
String name;
public Person() {
this.name = "John Doe";
}
public void displayName() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.displayName();
}
}
```
Vad kommer koden skriva ut?
```java
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Animal dog = new Dog();
animal.sound();
dog.sound();
}
}
```
Vad kommer koden skriva ut?
```java
public class Box {
double width, height, depth;
public Box(double width, double height, double depth) {
this.width = width;
this.height = height;
this.depth = depth;
}
public double calculateVolume() {
return this.width * this.height * this.depth;
}
public static void main(String[] args) {
Box myBox = new Box(2.0, 3.0, 4.0);
System.out.println("Volume: " + myBox.calculateVolume());
}
}
```
### Felsökning
Vad är felet i koden nedan?
```java
public class SimpleClass {
int number;
public static void main(String[] args) {
SimpleClass obj = new SimpleClass();
System.out.println(obj.number); // Vad är felet här?
}
}
```
Vad är felet i koden nedan?
```java
public class SimpleClass {
String text;
public SimpleClass(String input) {
text = input;
}
public static void main(String[] args) {
SimpleClass obj = new SimpleClass(); // Vad är felet här?
System.out.println(obj.text);
}
}
```
Vad är felet i koden nedan?
```java
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void makeSound(String sound) {
System.out.println(sound);
}
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.makeSound(); // Vad är felet här?
}
}
```
### Skriva kod
Nedan är en klass `Snack` som har en metod `eat`. Skriv en subklass till `Snack` som heter `Popcorn` och som har en som *overridar* `eat`-metoden.
```java
class Snack{
void eat(){
System.out.println("The snack was eaten. Yum!");
}
}
```
Nedan är en klass `Instrument` och några subklasser till den. Skriv några rader kod som skapar en lista av `Instrument` och med en for-loop anropar metoden `play` på varje instrument.
```java
class Instrument{
void play(){
System.out.println("Playing")
}
}
class Guitar extends Instrument{
@Override
void play(){
System.out.println("Playing guitar")
}
}
class Piano extends Instrument{
@Override
void play(){
System.out.println("Playing piano")
}
}
class Trumpet extends Instrument{
@Override
void play(){
System.out.println("Playing trumpet")
}
}
```
### Klassdiagram
Tänk dig ett system för ett bibliotek som ska hålla koll på böcker och låntagare. I systemet ska man kunna markera böcker som lånade av en låntagare samt få ut listor av vilka böcker som är utlånade av en given låntagare.
Gör ett klassdiagram över systemet. Bestäm först vilka klasser du behöver, vilka attribut och metoder de har och sedan vilka relationer de har till varandra.