7- Nesne Yönelimli Programlama (OOP)

### Java Sınıflar ve Nesneler


Java'da sınıflar (class) ve nesneler (object) nesne yönelimli programlamanın (OOP) temel yapı taşlarıdır. Sınıflar, nesnelerin özelliklerini ve davranışlarını tanımlayan şablonlardır. Nesneler ise bu şablonlardan üretilmiş somut örneklerdir.


#### Sınıflar


Bir sınıf, veri üyeleri (değişkenler) ve metodlar içerir. Örneğin, bir `Car` sınıfı aşağıdaki gibi tanımlanabilir:


```java

public class Car {

    // Veri üyeleri (özellikler)

    String model;

    int year;


    // Yapıcı metod (constructor)

    public Car(String model, int year) {

        this.model = model;

        this.year = year;

    }


    // Metod (davranış)

    public void displayInfo() {

        System.out.println("Model: " + model);

        System.out.println("Year: " + year);

    }

}

```


#### Nesneler


Sınıftan nesne oluşturmak için `new` anahtar kelimesi kullanılır.


```java

public class Main {

    public static void main(String[] args) {

        // Nesne oluşturma

        Car myCar = new Car("Toyota", 2020);


        // Nesne metodunu çağırma

        myCar.displayInfo();

    }

}

```


### Kalıtım (Inheritance) ve Çok Biçimlilik (Polymorphism)


#### Kalıtım (Inheritance)


Kalıtım, bir sınıfın başka bir sınıftan özellik ve metodlar miras almasını sağlar. Kalıtım, kodun yeniden kullanılabilirliğini artırır.


```java

// Üst sınıf (base class)

class Animal {

    public void eat() {

        System.out.println("This animal eats food.");

    }

}


// Alt sınıf (derived class)

class Dog extends Animal {

    public void bark() {

        System.out.println("The dog barks.");

    }

}


public class Main {

    public static void main(String[] args) {

        Dog myDog = new Dog();

        myDog.eat(); // Üst sınıftan miras alınan metod

        myDog.bark(); // Alt sınıfa özgü metod

    }

}

```


#### Çok Biçimlilik (Polymorphism)


Çok biçimlilik, bir nesnenin birçok form alabilme yeteneğidir. Java'da bu, aynı metodun farklı sınıflarda farklı biçimlerde çalışması anlamına gelir.


```java

class Animal {

    public void makeSound() {

        System.out.println("Animal sound");

    }

}


class Dog extends Animal {

    @Override

    public void makeSound() {

        System.out.println("Bark");

    }

}


class Cat extends Animal {

    @Override

    public void makeSound() {

        System.out.println("Meow");

    }

}


public class Main {

    public static void main(String[] args) {

        Animal myDog = new Dog();

        Animal myCat = new Cat();


        myDog.makeSound(); // "Bark"

        myCat.makeSound(); // "Meow"

    }

}

```


### Kapsülleme (Encapsulation) ve Arayüzler (Interfaces)


#### Kapsülleme (Encapsulation)


Kapsülleme, veri üyelerini (değişkenler) özel (private) yaparak ve bu verilere erişimi ve değiştirmeyi sınırlayan getter ve setter metodları kullanarak veriyi koruma yöntemidir.


```java

public class Person {

    private String name;

    private int age;


    // Getter metod

    public String getName() {

        return name;

    }


    // Setter metod

    public void setName(String name) {

        this.name = name;

    }


    // Getter metod

    public int getAge() {

        return age;

    }


    // Setter metod

    public void setAge(int age) {

        if (age > 0) {

            this.age = age;

        }

    }

}

```


#### Arayüzler (Interfaces)


Arayüzler, sınıfların uygulaması gereken metodları tanımlar. Bir sınıf birden fazla arayüzü uygulayabilir.


```java

interface Animal {

    void makeSound();

}


class Dog implements Animal {

    @Override

    public void makeSound() {

        System.out.println("Bark");

    }

}


class Cat implements Animal {

    @Override

    public void makeSound() {

        System.out.println("Meow");

    }

}


public class Main {

    public static void main(String[] args) {

        Animal myDog = new Dog();

        Animal myCat = new Cat();


        myDog.makeSound(); // "Bark"

        myCat.makeSound(); // "Meow"

    }

}

```


### Soyut Sınıflar (Abstract Classes) ve Arayüzler (Interfaces)


#### Soyut Sınıflar (Abstract Classes)


Soyut sınıflar, başka sınıfların türetilmesi için kullanılan, ancak kendileri örneklenemeyen sınıflardır. Soyut sınıflar soyut metodlar içerebilir.


```java

abstract class Animal {

    public abstract void makeSound(); // Soyut metod


    public void eat() {

        System.out.println("This animal eats food.");

    }

}


class Dog extends Animal {

    @Override

    public void makeSound() {

        System.out.println("Bark");

    }

}


public class Main {

    public static void main(String[] args) {

        Dog myDog = new Dog();

        myDog.makeSound(); // "Bark"

        myDog.eat(); // "This animal eats food."

    }

}

```


#### Arayüzler (Interfaces)


Arayüzler, sınıfların uygulaması gereken metodları tanımlar. Arayüzler çoklu kalıtımı destekler ve sınıfların belirli bir davranışı uygulamasını zorunlu kılar.


```java

interface Animal {

    void makeSound();

    void eat();

}


class Dog implements Animal {

    @Override

    public void makeSound() {

        System.out.println("Bark");

    }


    @Override

    public void eat() {

        System.out.println("Dog eats food.");

    }

}


public class Main {

    public static void main(String[] args) {

        Dog myDog = new Dog();

        myDog.makeSound(); // "Bark"

        myDog.eat(); // "Dog eats food."

    }

}

```


### Özet


Bu ders notları, Java'da sınıflar ve nesneler, kalıtım ve çok biçimlilik, kapsülleme ve arayüzler, soyut sınıflar ve arayüzler konularını kapsamaktadır. Bu kavramlar, nesne yönelimli programlamanın temel prensiplerini oluşturur ve Java programlarının daha esnek, yeniden kullanılabilir ve sürdürülebilir olmasını sağlar.