### 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.