# 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

...
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nissan-goldberg.gitbook.io/java101/lesson-8-oop/intro-to-classes-and-objects.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
