Kategoriler
Java

Java Hızlı Başlangıç Rehberi

Daha önce Java geliştirme ortamını nasıl oluşturacağınız ile ilgili basit bir anlatımı buradaki yazımda paylaşmıştım. Şimdi ise Java için bir hızlı başlangıç rehberi olması amacıyla bu yazıyı yazıyorum. Burada paylaşacaklarım farklı bir yazılım diline hakim ancak Java konusunda bilgisi olmayan kişilere yönelik olacağından temel yazılım bilgisi şarttır.

Java syntax’ı (söz dizimi) diğer yazılım dilleri arasından C++’a benzemektedir. Yazılıma yeni başlayan birisi için genellikle başlangıç dili olarak önerilmiyor. Yine de gözünüzü korkutmasın. Python kadar öğrenilmesi basit olmasa da C dilleri kadar karmaşık da değildir.

Yazım ve İsimlendirme Kuralları

Tüm yazılım dillerinde olduğu gibi Java’nın da yazım ve isimlendirme kuralları vardır. Bu kuralların çoğu neredeyse tüm yazılım dillerinde zaten geçerlidir.

  1. Türkçe Karakter Sorunsalı; şimdiye kadar zaten Türkçe karakterlerin kullanılabildiği bir yazılım diline rastlamadım. Tüm yazılım dillerinde olduğu gibi Java, 27 karakterden oluşan Latin (İngiliz) alfabesini kullanır.
  2. Büyük/Küçük Harf Duyarlılığı; Java büyük ve küçük harfe duyarlıdır. Java’da “Lifeacode” ile “lifeacode” farklı şeylerdir.
  3. Java’nın Anahtar Kelimeleri; her yazılım dilinde olduğu gibi Java’nın da kullandığı belli başlı kelimeler vardır. Bir sınıf, metot, değişken ya da sabit adı belirtirken bu anahtar kelimeleri kullanamazsınız. Bu anahtar kelimeleri birazdan paylaşacağım.

Sınıf (Class) İsimlendirmeleri

Java’da sınıf isimleri dosya isimleri ile aynı olmalıdır.

Standartlara uymak ve okunabilirliği arttırmak için sınıf adının ilk harfi büyük yazılmalıdır. Sınıf adı iki kelimeden oluşacaksa; kelimeler bitişik ve her kelimenin ilk harfi büyük karakterle yazılmalıdır. Örneğin; “CamelCase” gibi.

Metot ve Değişken İsimlendirmeleri

Metot isimleri küçük harfle başlamalı ve küçük harflerle devam etmelidir. Birden fazla kelimenin bir araya getirilmesiyle oluşacaksa ilk kelimenin baş harfi küçük, diğer kelimelerin sadece baş harfleri büyük şekilde yazılmalıdır. Örneğin; “camelCase” gibi. Değişkenlerde metotlarla aynı şekilde isimlendirilmelidir.

Sabit İsimlendirmeleri

Sabit isimlerinin tüm karakterleri büyük harflerle yazılmalıdır. Birden fazla kelimeden oluşan isimlendirmeler “_” ile ayrılmalıdır. Örneğin; “CAMEL_CASE” gibi.

Identifier İsimlendirmeleri

Büyük ve küçük (A-Z ve a-z) harflerin yanı sıra “$” veya “_” karakteri ile başlayabilir.

JAVA Keywords (Anahtar Kelimeler)

Java dillerinde özel bir anlamı olan kelimeleri aşağıdaki tabloda görebilirsiniz.

abstractassertbooleanbreakbyte
casecatchcharclassconst
continuedefaultdodoubleelse
enumextendsfinalfinallyfloat
forgotoifimplementsimport
instanceofintinterfacelongnative
newpackageprivateprotectedpublic
returnshortstaticstrictfpsuper
switchsynchronizedthisthrowthrows
transienttryvoidvolatilewhile
Java Keywords

Main Metodu ve Kullanımı

Bir Java yazılımı yürütülmeye başlandığında sınıf içerisindeki main metodu çalıştırılır. Bu yüzden main metodu bulunması zorunludur.

HelloWorld.java dosyası örneği;

public class HelloWorld{
	public static void main(String[] args) {
		System.out.print("Hello World!");
	}
}

Veri Tipleri

Anahtar KelimeAçıklama
byte8bit yani 1 byte uzunluğundadır. 127 ile -128 arasında bir tam sayı.
short16 bit uzunluğundadır. 32767 ile -32768 arasında bir tam sayı.
int32 bit uzunluğundadır. 2147483647 ile -2147483648 arasında bir tam sayı.
long64 bit uzunluğundadır. 9223372036845775807 ile -9223372036845775808 arasında bir tam sayı.
float32bit boyutundadır. 1.4×10-45 ile 3.4×1038 arasında bir ondalık sayı.
double64bit boyutundadır. 4.9×10-324 ile 1.8×10308 arasında bir ondalık sayı.
char16bit boyutundadır. Tek bir karakter. Unicode karakter setini kullandığından tüm Dünya dillerini kapsar.
booleanMantıksal değeri ifade eder. (True ya da False)
StringString tam olarak bir veri tipi değildir. Java tarafından “char” tipinden türetilmiş bir sınıf ile desteklenir. Birden fazla karakterlerin bütününü ifade eder.

Değişken (Variable)

Java’da bir değişken oluşturmak PHP ve Python’dan farklıdır. C dilleri gibi değişkenin türünün (veri tipi) belirtilmelidir. Örneğin;

int x = 13;

Tam sayı türünde x adındaki değişkene 13 değerini atadık. Tanımlama işlemi ile atama işlemi farklı satırlarda yapılabilir. Örneğin;

int x;
x = 13;

Aynı türdeki değişkenleri tek satırda tanımlamakta mümkündür. Örneğin;

int x, y;
x = 12;
y = 15;

Java’da Operatörler

Java’da operatörlerin kullanım şekli diğer yazılım dilleri ile benzer şekildedir.

Atama Operatörleri

OperatörAçıklamaÖrnek
=Solundaki değere sağındaki değeri atar.x=y+z; y ve z toplanarak sonuç x‘e atanır.
+=Solundaki değer sağındaki değer ile toplanarak solundaki değere atanır.x+=y; ile
x=x+y; aynı şeyi ifade eder.
-=Solundaki değerden sağındaki değeri çıkarır ve sonucu solundaki değere atar.x-=y; ile
x=x-y; aynı şeyi ifade eder.
*=Solundaki değerle sağındaki değeri çarpar ve sonucu solundaki değere atar.x*=y; ile
x=x*y; aynı şeyi ifade eder.
/=Solundaki değeri sağındaki değere bölerek sonucu solundaki değere atar.x/=y; ile
x=x/y; aynı şeyi ifade eder.
%=Solundaki değerin sağındaki değere modunu alıp solundaki değere atar.x%=y; ile
x=x%y; aynı şeyi ifade eder.

Aritmatik Operatörler

OperatörAçıklamaÖrnek
+Sağındaki ve solundaki değerler sayısal ise toplar.
Değerlerden birisi string türünde ise ekler. Sağındaki değerin sonrasına bir string ifade olarak ekleme yapar.
4+3; 7 sonucunu verirken;
4+"3"; 43 sonucunu verir.
-Solundaki değerden sağındaki değeri çıkarır.x-y;
*Solundaki ve sağındaki değerleri çarpar.x*y;
/Solundaki değeri solundaki değere böler.x/y;
%Solundaki değerin sağındaki değere göre modunu alır.15%4; 3 verir.
++Değeri 1 arttırır.x++;
--Değeri 1 azaltır.x--;

İlişkisel Operatörler (Koşul Operatörleri)

OperatörAçıklamaÖrnek
==Sağındaki ve solundaki değerlerini birbirlerine eşitlik durumunu sorgular.x==y
!=Sağındaki ve solundaki değerlerin eşit olmama durumunu sorgular.x!=y
>Solundaki değerin sağındaki değerden büyüklük durumu sorgular.x>y
<Solundaki değerin sağındaki değerden küçüklük durumunu sorgular.x<y
>=Solundaki değerin sağındaki değerden büyük veya eşit olma durumunu sorgular.x>=y
<=Solundaki değerin sağındaki değerden küçük veya eşit olma durumunu sorgular.x<=y

Mantıksal Operatörler

OperatörAçıklamaÖrnek
&&VE; her iki tarafındaki durumun doğru yani true olması beklenir.x&&y
||VEYA; her iki tarafındaki durumlardan en az birinin doğru yani true olması beklenir.x||y
!DEĞİL; Önüne geldiği durumun yanlış (false) olması durumunda true yani doğru olur.!(x&&y)

Java’da Input ve Output

Bir yazılım dilinde elbette kullanıcıdan bazı verileri almak ve bu verileri işleyerek belli bir çıktı üreterek bunu kullanıcıya çıktılamak gerekir. Bu işin doğasında olan birşey.

Ekrana bir çıktı üretmek için;

System.out.print("Hello World");

Çıktıdan sonra imlecin alt satırdan devam etmesi için “\n” kullanabilirsiniz ancak bunun daha kolay okunabilir bir yolu println metodunu kullanmaktır.

System.out.println("Hello World");

Kullanıcıdan bir veri almak için Java kütüphanelerinden birine ihtiyacınız var. Kullanıcıdan bir giriş yapmasını istecekseniz java.util.Scanner dahil edilmelidir.

import java.util.Scanner;
public class IfElse {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Lütfen bir tam sayı giriniz.");
		int x = input.nextInt();
		System.out.println("Girdiğiniz sayı : " + x);
	}
}

Yukarıdaki örnekte kullanıcıdan bir tam sayı alıyoruz. Ancak her veri türü için Scanner kütüphanesinden farklı bir metot kullanmanız gerekiyor.

Veri TürüScanner Metodu
bytenextByte
shortnextShort
intnextInt
longnextLong
floatnextFloat
doublenextDouble
booleannextBoolean

String türünde veri almanız gerekiyorsa; kullanabileceğiniz iki metot bulunuyor.

Scanner MetotAçıklama
nextKullanıcının girdiği metinden ilk kelimeyi alır.
nextLineKullanıcının girdiği tüm satırı alır.

Java’da Koşullu İfadeler

(İf/Else & Switch/Case)

public class IfElse {
	public static void main(String[] args) {
		int x = 14;
		if((x%2) == 0) {
			System.out.println(x + " çift sayıdır.");
		}else {
			System.out.println(x + " çift sayı değildir.");
		}
	}
}

Farklı bir yazım şekli olarak aşağıdaki şekilde de bu koşul kontrol edilebilirdi.

public class IfElse {
	public static void main(String[] args) {
		int x = 15;
		String msg = (x%2 == 0) ? "çift sayıdır." : "çift sayı değildir!";
		System.out.println(x + " " + msg);
	}
}

aynı koşulun Switch/Case ile yazımı ise şu şekildedir;

public class SwitchCase{
	public static void main(String[] args) {
		int x = 15;
		switch(x%2) {
			case 0: 
			System.out.println(x + " çift sayıdır.");
			break;
			default: System.out.println(x + " çift sayı değildir.");
		}
	}
}

Java’da Diziler (Array)

int[] a = {3,4,5,6,7};

ya da

int a[] = {3,4,5,6,7};

bununla birlikte şöyle bir kullanımda mümkündür.

int rakamlar[] = new int[10];
rakamlar[0] = 0;
rakamlar[1] = 1;
rakamlar[2] = 2;
rakamlar[3] = 3;
rakamlar[4] = 4;
rakamlar[5] = 5;
rakamlar[6] = 6;
rakamlar[7] = 7;
rakamlar[8] = 8;
rakamlar[9] = 9;

rakamlar adında bir dizi oluşturdum ve tam sayılardan oluşan 10 elemanı olduğunu bildirdim daha sonra indexlerini köşeli parantez içinde belirtiğim her bir elaman için atama işlemini gerçekleştirdim.

length

Bir dizinin kaç elemanı olduğunu bulmak için kullanılır.

public class Diziler {
	public static void main(String[] args) {
		int rakamlar[] = {0,1,2,3,4,5,6,7,8,9};
		System.out.println("Dizide " + rakamlar.length + " eleman var.");
	}
}

Çoklu Diziler

Çoklu diziler ya da başka bir tabirle iç içe dizilerde diyebiliriz. Bir dizinin içerisindeki elemanların da dizi olma durumu.

int[][] dizi = new int[][] {
	{1,3,5,7,9},
	{2,4,6,8,10}
};

çoklu dizilerde de köşeli parantezler içinde indexini yazarak tanımlama yapmak, değere ulaşmak ya da değeri değiştirmek mümkündür.

int[][] dizi = new int[2][5];
dizi[0][0] = 1;
dizi[0][1] = 3;
dizi[0][2] = 5;
dizi[0][3] = 7;
dizi[0][4] = 9;
dizi[1][0] = 2;
dizi[1][1] = 4;
dizi[1][2] = 6;
dizi[1][3] = 8;
dizi[1][4] = 10;

Java’da Döngüler (Loops)

Java’da döngüler C dillerindeki ile birebir aynı şekilde çalışıyor diyebilirim. Anlayabilmeniz için aşağıda her döngü çeşidine basit birer örnek verdim.

While Döngüsü

int x = 5;
while(x >= 1) {
	System.out.println(x);
	x--;
}

Do-While Döngüsü

int x = 5;
do{
	System.out.println(x);
	x--;
}while(x >= 6);

For Döngüsü

for(int i = 1; i <= 5; i++) {
	System.out.println(i);
}

Foreach Döngüsü

For döngüsünün (array) dizilerde kullanılabilen halidir. Daha kolay yazım ve okuma amacı taşır. Aynı işlemi for döngüsü ile de yapabilirsiniz.

public class Diziler {
	public static void main(String[] args) {
		int[] dizi = {1,3,5,7,9};
		for(int value: dizi){
			System.out.println(value);
		}
	}
}

Çoklu dizilerde ise kullanımı şu şekilde oluyor;

public class Diziler {
	public static void main(String[] args) {
		int[][] dizi = new int[][] {
			{1,3,5,7,9},
			{2,4,6,8,10}
		};
		for(int[] row: dizi){
			for(int value: row) {
				System.out.println(value);
			}
		}
	}
}

break

Döngülerin sonlandırılması için break anahtar sözcüğü kullanılır.

import java.util.Scanner;
public class LoopsBreak{
	public static void main(String[] args) {
		Scanner giris = new Scanner(System.in);
		int i;
		System.out.println("Lütfen bir çift sayı giriniz.");
		while(true){
			i = giris.nextInt();
			if((i%2) == 0) {
				System.out.println("Tebrikler, " + i + " bir çift sayıdır.");
				break;
			}else {
				System.out.println(i + " bir tek sayıdır.");
			}
			System.out.println("Lütfen bir çift sayı giriniz.");
		}
	}
}

Yukarıdaki örnekte kullanıcı çift sayı girene kadar devam eden bir döngü, kullanıcı her hangi bir çift sayı girmesi ile break; komutuyla döngüyü sonlandırıp bitirecektir.

continue

continue anahtar sözcüğü döngü içerisinde kendisinden sonra gelen kodları yok sayarak döngünün sonraki turundan devam etmesini sağlar.

public class LoopsContinue{
	public static void main(String[] args) {
		int i = 10;
		while(i >= 1) {
			i--;
			if(i <= 5 && i >= 3) {
				continue;
			}
			System.out.println(i);
		}
	}
}

Java’da Metotlar

Java çoğu programlama dilinin aksine tamamen nesne yönelimlidir. PHP, Python ve C dillerinin aksine Java da fonksiyonlar metotlar olarak yazılır. Yazım şekli syntax’ı C dillerine benzer.

Aldığı iki parametreyi toplayıp sonucu ekrana basan basit bir metot örneği;

public class Metot{
	public static void main(String[] args) {
		int a = 5, b = 4;
		topla(a, b);
	}
	static void topla(int x, int y) {
		System.out.println(x + y);
	}
}

Metot bir veri döndürmediği “return” etmediği için metodu tanımlarken void sözcüğünü kullanıyoruz. Toplama işlemini ekrana basmak yerine döndüren bir metotta ise döndürdüğü verinin türü belirtilmelidir.

public class IfElse{
	public static void main(String[] args) {
		int a = 5, b = 4;
		System.out.println(topla(a, b));
	}
	static int topla(int x, int y) {
		int toplam = x + y;
		return toplam;
	}
}

Overloading

Java’da metotların farklı kullanımlar için ayrı ayrı özel olarak tanımlanması gerekiyor. Buna aşırı yüklenme yani overloading deniyor.

public class Overloading {
	public static void main(String[] args) {
		System.out.println(topla(3, 5));
		System.out.println(topla(3, 5, 8));
		System.out.println(topla(3, 5, 6.5));
	}
	
	static int topla(int x, int y) {
		return x + y;
	}
	
	static int topla(int x, int y, int z) {
		return x + y + z;
	}
	
	static double topla(int x, int y, double z) {
		return x + y + z;
	}
}

Java’da Sınıf (Class)

SinifAdi.java

public class SinifAdi {
	public int a;
	int d; //protected
	protected int b;
	private int c;
	
	public int topla(int x) {
		return x + a;
	}
}

Proje.java

public class Proje {
	public static void main(String[] args) {
		SinifAdi sinif1 = new SinifAdi();
		sinif1.a=5;
		System.out.println(sinif1.topla(10));
	}
}

Constructor (Yapıcı) Metot

Sınıflar başlatılır başlatılmaz çalıştırılacak olan metottur. Sınıf adı ile aynı isimde olmak zorundadır.

Kullanici.java

public class Kullanici {
	public String name;
	public String surname;
	
	Kullanici(String name, String sname){
		this.name = name;
		surname = sname;
	}
	
	public String adiniSoyle() {
		return name + " " + surname;
	}
}

Proje.java

public class Proje {
	public static void main(String[] args) {
		Kullanici user = new Kullanici("Muhammet", "Şafak");
		System.out.println(user.adiniSoyle());
	}
}

Yapıcı metotlarda overloading işlemi sıradan metotlarla aynı şekilde yapılmaktadır.

Static

Statik olarak tanımlanan özellikler (property) ve metotlar nesnelerden bağımsız olarak çalışır. Nesneye değil, sınıfın kendisine ait olan tanımlamaları yapmakta kullanılır.

Kullanici.java

public class Kullanici {
	public String name;
	public String surname;
	private static int count = 0;
	
	Kullanici(String name, String sname){
		this.name = name;
		surname = sname;
		Kullanici.count++;
	}
	
	public String adiniSoyle() {
		return name + " " + surname;
	}
	
	public int kacKullaniciVar() {
		return Kullanici.count;
	}
}

Proje.java

public class Proje {
	public static void main(String[] args) {
		Kullanici user1 = new Kullanici("Muhammet", "Şafak");
		Kullanici user2 = new Kullanici("Ömer", "Şafak");
		
		System.out.println(user1.kacKullaniciVar());
	}
}

Fark edebileceğiniz gibi Kullanıcı sınıfı altında statik olarak belirlenmiş count özelliğine this.count yerine Kullanici.count şeklinde erişim sağladım.

Final (Sabit)

Java’da final sözcüğü bir sabit tanımlamak için kullanılır.

final double PI = 3.14;

Sınıf içerisinde static bir sabit olarak tanımlamak dışarıdan da bu değere erişmeye imkan verir.

Matematik.java

public class Matematik {
	final static double PI = 3.14;
}

Proje.java

public class Proje {
	System.out.println(Matematik.PI);
}

Encapsulation (Sarmallama ya da Kapsülleme)

Temel olarak sınıfa ait özelliklere doğrudan erişimi engellemek bunun yerine gerekli kontrollerin yapıldığı metotlar aracılığı ile özelliklere erişimi sağlama işine verilen isimdir.

Book.java

public class Book {
	private String name, author;
	private int numberOfPage;
	
	Book(String name, String author, int numberOfPage){
		this.name = name;
		this.author = author;
		setPageSize(numberOfPage);
	}
	
	public String getName() {
		return this.name;
	}
	
	public String getAuthor() {
		return this.author;
	}
	
	public int getPageSize() {
		return this.numberOfPage;
	}
	
	public void setPageSize(int pageSize) {
		if(pageSize < 1) {
			this.numberOfPage = 1;
		}else {
			this.numberOfPage = pageSize;
		}
	}
}

Yukarıdaki örnekte görebileceğiniz gibi özelliklere dışarıdan erişime izin verilmiyor. Sayfa sayısı güncellenmek istendiğinde gerekli kontrolleri sağlayıp yapacak bir metoda sahip.

Dependency (Bağımlılık) “uses a”

Bir sınıf içerisinde başka bir sınıfa ait bir özellik (property) yada metot kullanılmasıyla gerçekleşen durumdur.

A.java

public class A{
	public void run(B b){
		System.out.println(b.ozellik);
	}
}

B.java

public class B{
	public int ozellik = 5;
}

Proje.java

public class Proje{
	public static void main(String[] args){
		A a = new A();
		B b = new B();
		a.run(b);
	}
}

A sınıfının run metodunda görebileceğiniz gibi metot olarak B türünde bir parametre alması gerekiyor. Bu A sınıfının B sınıfına bağımlı olduğunu gösterir. Yani B sınıfı olmadan A sınıfı çalışamayacaktır.

Composition (Birleştirme) “has a”

Birleştirme bir sınıf içerisinde farklı bir sınıfın türünde özellik tanımlama işlemi ile oluşan duruma verilen isimdir. Yine aynı örnek üzerinden anlatacak olursam.

A.java

public class A{
	public B degisken;
}

B.java

public class B{
	public int ozellik = 5;
}

Proje.java

public class Proje{
	public static void main(String[] args){
		A a = new A();
		B b = new B();
		a.degisken = b;
	}
}

Görebileceğiniz gibi A sınıfı içerisindeki degisken isimli özellik B sınıf türünde değer almalıdır.

Inheritance (Kalıtım) “is a”

Ortak özellikleri ve ortak metotları kullanması gereken sınıfların bu sınıfları bünyelerine katması olarak tanımlayabiliriz. Temelde her sınıf için aynı özellik ve metotları yazmaktan kurtulursunuz ayrıca bir sorun çıktığında tek bir yere müdahale etmeniz gerektiğinden geliştirme işini oldukça kolaylaştıran yapıdır.

extends tanımı hangi sınıfın miras alınacağını bildirir.

Human.java

public class Human {
	public String name;
	public int age;

	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return this.age;
	}
}

Teacher.java

public class Teacher extends Human{
	public String branch;
	Teacher(String name, int age, String branch){
		setName(name);
		setAge(age);
		this.branch = branch;
	}
	public void teacherInfo() {
		System.out.println(getName() + " bir " + branch + " öğretmenidir.");
	}
}

Student.java

public class Student extends Human {
	public int number;
	public String classroom;
	Student(String name, int age, int number, String classroom){
		setName(name);
		setAge(age);
		this.number = number;
		this.classroom = classroom;
	}
	public void studentInfo() {
		System.out.println(number + " " + getName() + " " + classroom + " sınıfından bir öğrencidir.");
	}
}

Main.java

public class Main {
	public static void main(String[] args) {
		Student ogrenci = new Student("Ali Kuşlukçu", 17, 257, "11D");
		Teacher ogretmen = new Teacher("Selim Güngören", 29, "Edebiyat");
		
		ogrenci.studentInfo();
		System.out.println(ogrenci.getAge() + " yaşındadır.");
		ogretmen.teacherInfo();
		System.out.println(ogretmen.getAge() + " yaşındadır.");
	}
}

super

Miras aldığınız (extends ettiğiniz) bir sınıf yapıcı bir metoda sahip olabilir. super anahtar kelimesi miras alınan sınıfın yapıcı metodunu çalıştırmak için kullanılır.

A.java

public class A{
	public int x;
	A(int x){
		this.x = x;
	}
}

B.java

public class B extends A{
	public int y;
	B(int y, int x){
		this.y = y;
		super(x)
	}
}

Metot Overriding (Metot Ezme)

Bir sınıf içerisinde miras aldığı sınıf ile aynı isimde bir metot varsa; miras aldığı sınıfta ki metodu ezer. Yani o isimle metot çağrıldığında miras alınan sınıfın değil, çalıştırılan sınıfın metodu çalışır.

Polymorphism (Çok Biçimlilik)

Bir sınıf başlatılacağı zaman; referans olarak kendisinin extends ettiği sınıf referans olarak gösterilebilir.

Human.java

public class Human {
	public String name;
	public int age;

	Human(String name, int age){
		this.name = name;
		this.age = age;
	}
	public void info() {
		System.out.println(this.name + " " + this.age + " yaşındadır.");
	}
	public String getName() {
		return this.name;
	}
}

Student.java

public class Student extends Human {
	public int number;
	public String classroom;
	Student(String name, int age, int number, String classroom){
		super(name, age);
		this.number = number;
		this.classroom = classroom;
	}
	public void info() {
		System.out.println(number + " " + getName() + " " + classroom + " sınıfından bir öğrencidir.");
	}
}

Main.java

public class Main {
	public static void main(String[] args) {
		Human ogrenci = new Student("Ali Kuşlukçu", 17, 257, "11D");
		ogrenci.info();
	}
}

Görebileceğiniz Main.java dosyasında ogrenci değişkenine Referans olarak Human sınıfını göstermiş olsam da Student isimli sınıfı başlattım. Bunu yapabilmek için Student sınıfının Human sınıfını miras almış olması gereklidir.

Abstraction (Soyutlama)

Nesne yönelimli programlama yaparken bazı durumlarda bir nesne oluşturmayacağınız sınıflar yazmanız gerekebilir.

Örneğin yukarıdaki diyagramdaki yapıyı kurmak istersek; Akademisyen sınıfı kullanılarak programın hiçbir yerinde bir nesne oluşturulmayacaktır. Çünkü Asistan ya da Ogretmen sınıfları dışında herhangi bir asistan nesnesi olamaz.

Bir nesne oluşturulmayacağı halde bir sınıf oluşturup soyutlamak aslında kendisini miras alan sınıfların bulundurması gereken özellik ve metotları tanımlar.

Bir sınıfı ve metodu soyutlamak için abstract ifadesi kullanılır.

Akademisyen.java

public abstract class Akademisyen {
	
	String bolum, gorev, dersler;
	
	public abstract void derseGir();
	
}

Akademisyen metodunu miras alan sınıflar da derseGir() metodu tanımlandığı şekilde olmak zorunda. Verdiğim örnekte soyutlanmış derseGir() metodu bir şey döndürmeyecek ve parametre almıyor diye tanımladığıma dikkat edin. Bu sınıfı miras alan sınıf da derseGir() metodunu soyutlanmış metot ile aynı şekilde çalıştırmak zorundadır. Bu metot bir şey döndürecek ya da parametreler alacaksa bu soyutlanmış metotta belirtilmelidir.

Interface (Arayüz)

Arayüzler tıpkı abstract sınıflara benzer şekilde belli bir kalıp belirtilmesinde kullanılır.

  • Arayüzler interface ifadesi ile tanımlanır.
  • Arayüz içerisinde bir özellik (property) tanımlanamaz ancak final ifadesi kullanılarak değişmez özellik tanımlanabilir.
  • Arayüzler miras alınmaz, uygulanır. Bir sınıfa bir arayüzü uygulamak için implements ifadesi kullanılır.

Calisan.java

public interface Calisan {
	final String okul = "ITU";
	
	public void giris();
	public void cikis();
	public boolean yemek(int saat);
}

Akademisyen.java

public abstract class Akademisyen implements Calisan {
	
	String bolum, gorev, dersler;
	
	public abstract void derseGir();
	
	public void giris() {}
	public void cikis() {}
	public boolean yemek(int saat) {
		if(saat <= 13 && saat >= 12) {
			System.out.println("Yemek yeniyor.");
			return true;
		}else {
			System.out.println("Mutfak ve kafeterya kapandı.");
			return false;
		}
	}
	
}

Bu içerik buraya kadardı. Ancak Java bu kadarla kısıtlı değil, bu yüzden temel konuların dışındaki konuları Java Dersleri sayfasından takip edebilirsiniz.

Yazar Muhammet ŞAFAK

1992 İstanbul doğumluyum. 2008 yılından beri profesyonel olarak PHP geliştiriyorum. Her ne kadar ağırlıklı olarak PHP üzerinde çalışsam da C, C++, Python, Java programlama dillerini de kullanıyorum.

Bir Cevap Yazın