> For the complete documentation index, see [llms.txt](https://nissan-goldberg.gitbook.io/java101/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nissan-goldberg.gitbook.io/java101/lesson-8-oop/intro-to-classes-and-objects.md).

# Intro to Classes and Objects

## Lesson 8 - OOP

There are four main **OOP** (object oriented programming) concepts in Java.

* **Encapsulation** (setters and getters, we will discuss this today)
* **Abstraction**&#x20;
* **Inheritance**&#x20;
* **Polymorphism**

#### Today OOP topics

* non static methods
* `this`
* constructors and copy constructors
* objects are passed to functions as references
* `toString`

#### OOP -  Encapsulation

הסתרת מידע

* `public` and `private`
* getters and setters

## What are Classes and objects?

![Objects and Classes in Java](https://www.guru99.com/images/java/052016_0704_ObjectsandC5.jpg)

![What is Class and Object in Java OOPS? Learn with Example](https://www.guru99.com/images/java/052016_0704_ObjectsandC6.jpg)

* **Class** - Dogs
* **Data members** or **objects**- size, age, color, breed, etc.
* **Methods**- `sleep()`, `toString()`

### Attempt 1 🐶

```java
// Class Declaration
public class Dog {
    // Instance Variables
    String breed;
    String name;
    String size;
    int age;
    String color;


    // non static method
    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    //static method
    public static void whoIsSleeping(Dog dog){
        System.out.println(dog.name + " is sleeping");
    }

    public String toString() {
        return ("Name : "+name+ "\nBreed is: "+breed+"\nSize is: "+size+"\nAge is: "+age+"\nColor is: "+color+ "\n");
    }


    public static void main(String[] args) {
        Dog maltese = new Dog();
        maltese.breed="Maltese";
        maltese.size="Small";
        maltese.age=2;
        maltese.color="white";

        maltese.sleep();

        System.out.println();
        System.out.println(maltese);

        maltese.name="fluffy";
        Dog.whoIsSleeping(maltese);
    }
}
```

```
null is sleeping

Breed is: Maltese
Size is: Small
Age is: 2
Color is: white

fluffy is sleeping
```

* we have a `static` method (doesnt belong to class), `whoIsSleeping()`&#x20;
* we have a `non static` method (belongs to class), `sleep()`&#x20;

We got `null is slepping` , we forgot to initialize the name we should use a constructor

### Attempt 2 - Adding constructors

here we will add 2 constructors

* a copy constructor
* a constructor that receives arguments

{% tabs %}
{% tab title="Main.java" %}

```java
public class Main {
    public static void main(String[] args) {
        Dog fluffy = new Dog("Fluffy","Maltese",
                "Small",2,"white");

        fluffy.sleep();

        System.out.println();
        System.out.println(fluffy);

        Dog snowball = new Dog(fluffy); //call copy constructor

        System.out.println();
        snowball.name = "Snowball";
        System.out.println(snowball.name);
    }
}
```

{% endtab %}

{% tab title="Dog.java" %}

```java
// Class Declaration
public class Dog {
    // Instance Variables
    String name;
    String breed;
    String size;
    int age;
    String color;

    //constructor - ADDED THIS
    Dog(String my_name, String breed, String size, int age, String my_color) {
        this.breed=breed;
        name=my_name;
        this.age = age;
        this.size=size;
        color= my_color;
    }

    //copy constructor -  ADDED THIS
    Dog(Dog other) {
        breed = other.breed;
        name = other.name;
        age = other.age;
        size = other.size;
        color = other.color;
    }

    // non static method
    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    //static method
    public static void whoIsSleeping(Dog dog){
        System.out.println(dog.name + " is sleeping");
    }

    public String toString() {
        return ("Name : "+name+ "\nBreed is: "+breed+"\nSize is: "+size+
                "\nAge is: "+age+"\nColor is: "+color+ "\n");
    }
}
```

{% endtab %}

{% tab title="OneFile.java" %}

```java
// Class Declaration
public class Dog {
    // Instance Variables
    String name;
    String breed;
    String size;
    int age;
    String color;

    //constructor - ADDED THIS
    Dog(String my_name, String breed, String size, int age, String my_color) {
        this.breed=breed;
        name=my_name;
        this.age = age;
        this.size=size;
        color= my_color;
    }

    //copy constructor -  ADDED THIS
    Dog(Dog other) {
        breed = other.breed;
        name = other.name;
        age = other.age;
        size = other.size;
        color = other.color;
    }

     // non static method
    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    //static method
    public static void whoIsSleeping(Dog dog){
        System.out.println(dog.name + " is sleeping");
    }

   public String toString() {
        return ("Name : "+name+ "\nBreed is: "+breed+"\nSize is: "+size+"\nAge is: "+age+"\nColor is: "+color+ "\n");
    }


    public static void main(String[] args) {
        Dog fluffy = new Dog("Fluffy","Maltese",
                "Small",2,"white");

        fluffy.sleep();

        System.out.println();
        System.out.println(fluffy);

        Dog snowball = new Dog(fluffy); //call copy constructor

        System.out.println();
        snowball.name = "Snowball";
        System.out.println(snowball.name);
    }
}
```

{% endtab %}
{% endtabs %}

```
Fluffy is sleeping

Breed is: Maltese
Size is: Small
Age is: 2
Color is: white

Snowball
```

### Attempt 3 - Adding encapsulation

we should not be able to directly change and get properties of the object for example here

```java
public static void main(String[] args) {
        Dog fluffy = new Dog( "Fluffy", "Maltese", "Small", 2, "white");
        fluffy.name = "Snowball";
    }
```

* but rather use **setters** and **getters**
* the fields should also be **private** (can't be accessed outside the class)&#x20;

so now we have

{% tabs %}
{% tab title="Main.java" %}

```java
public class Main {
    public static void main(String[] args) {
        Dog fluffy = new Dog("Fluffy","Maltese","Small",2,"white");

        Dog snowball = new Dog(fluffy); //call copy constructor

        System.out.println();
        snowball.setName("Snowball");
        System.out.println(snowball.getName());
    }
}
```

{% endtab %}

{% tab title="Dog.java" %}

```java
// Class Declaration
public class Dog {
    // Instance Variables
    private String name;
    private String breed;
    private String size;
    private int age;
    private String color;

    //constructor
    Dog(String my_name, String breed, String size, int age, String my_color) {
        this.breed=breed;
        name=my_name;
        this.age = age;
        this.size=size;
        color= my_color;
    }

    //copy constructor
    Dog(Dog other) {
        breed = other.breed;
        name = other.name;
        age = other.age;
        size = other.size;
        color = other.color;
    }

    // non static method
    public void sleep() {
        System.out.println(name + " is sleeping");
    }

    //static method
    public static void whoIsSleeping(Dog dog){
        System.out.println(dog.name + " is sleeping");
    }

    //getters and setters
    // === ADDED THIS ===
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBreed() {
        return breed;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }


    public String toString() {
        return ("Name : "+name+ "\nBreed is: "+breed+"\nSize is: "+size+"\nAge is: "+age+"\nColor is: "+color+ "\n");
    }
}
```

{% endtab %}
{% endtabs %}

```
Snowball
```

## An array of Dogs 🐶🐩🐕

```java
public class Main {
    public static void main(String[] args) {
        String[] names = {"fluffy", "snowball", "shugi", "cookie"};
        Dog[] dogs = new Dog[4];

        for (int i = 0; i < dogs.length; i++)
            dogs[i] = new Dog(names[i],"Maltese","Small",2,"white");

        for (int i = 0; i < dogs.length; i++)
            System.out.println(dogs[i]);

    }
}
```

```
Name : fluffy
Breed is: Maltese
Size is: Small
Age is: 2
Color is: white

Name : snowball
Breed is: Maltese
Size is: Small
Age is: 2
Color is: white

...
```
