Yeni Başlayanlar İçin Java Programlama

  • Konbuyu başlatan Konbuyu başlatan Hüseyin
  • Başlangıç tarihi Başlangıç tarihi

Hüseyin

Üye
Top Poster Of Month
Katılım
21 Ocak 2024
Mesajlar
164
Tepkime puanı
36
Puanları
28
Bu Java Eğitimi yazısında, Java'nın bazı temel kavramlarını öğreneceğiz. Ancak ilerlemeden önce, Java'nın ne olduğunu, Java'nın özelliklerini ve Java'yı sisteminize nasıl yükleyebileceğinizi öğrenmenizi öneririm. Bu, gelecek kavramları hızlı ve kolay bir şekilde kavramanıza yardımcı olacaktır.

Şimdi, Java'nın her bir yönünü aşağıdaki sırayla öğreneceğimiz bu Java Eğitimi yazısına ilerleyelim:

Merhaba Dünya Programı
Java'da üye değişkenler
Veri türleri ve operatörler
Kontrol İfadeleri
Sınıflar ve Nesneler
Bir programın yapısı
Diziler
OOPs kavramı - Kalıtım, Kapsülleme, Polimorfizm, Soyutlama


Hello World Programı

Öncelikle, size bir Java programının nasıl göründüğüne dair basit bir genel bakış sunacağım. Aşağıdaki kodda, bir sınıf oluşturdum - MyFirstJavaProgram ve “Hello World” yazdırdım. Devam edin ve aşağıdaki örneği Eclipse IDE'nizde çalıştırmayı deneyin. Merak etmeyin, Java sınıfını birazdan tartışacağız.

Java:
public class MyFirstJavaProgram {
       public static void main(String[] args)
{
System.out.println("Hello World");
}
}

Şimdi, Java'daki farklı üye değişkenleri anlayalım.

Üye Değişkenler

Bir üye değişken, bir veri değerini saklamak için kullanıldığı için bir sınıfta önemli bir rol oynar. Bir sınıf tanımladığımızda, bir üye değişken bildirebiliriz. Bu değişkenler bir sınıfın üyeleridir.
Üye değişkenler ayrıca üç tipte sınıflandırılır:

Local variable
Instance variable
Class/Static variable


Her birini tek tek ele alalım:

Local variable:

Bunlar bir sınıfın metodu içinde bildirilen değişkenlerdir. Bunu programatik bir örnekle anlayalım:

Java:
public class Car {
      public void display(int m){  // Method
int model=m;        // Created a local variable model
System.out.println("Model of the car is" +model);
}

Yukarıdaki kodda, yerel değişkenim 'm' parametresine sahip bir 'display' metodunun içinde bildirdiğim 'model'dir.

Instance variable:

Bir örnek değişken, bir sınıf içinde ancak bir yöntem, kurucu veya herhangi bir blok dışında bildirilir. Bunu programatik bir örnekle anlayalım.

Java:
public class Car {
      public String color;     // Created an instance variable color

Car(String c)
{
color=c;
}

public void display() {  // Method
System.out.println("color of the car is"+color);
}

public static void main(String args[]){
Car obj=new Car("black");
obj.display();
}
}

Yukarıdaki kodda, 'color', kendisiyle ilişkilendirilmiş bir “black” değerine sahip örnek değişkenimdir.

Class variable:

Sınıf değişkenleri statik değişkenler olarak da adlandırılır. Bu değişkenlerin, bir sınıftaki tüm farklı nesneler tarafından paylaşılan tek bir kopyası vardır. Bunu programatik bir örnekle anlayalım.

Java:
public class Car {
      public static int tyres;   // Created a class variable tyres
public static void main(String args[]){
tyres=4;
System.out.println("Number of tyres are"+tyres);
}
}

Tüm arabaların 4 lastiği olmalı, değil mi? Yukarıdaki kodumda, değeri sınıf boyunca aynı kalan statik bir değişkeni 'tyre' olarak bildirdim.

Veri tipleri

Bir veri türü, bir değişkende depolanan farklı değerleri temsil etmek için kullanılır. Temel olarak 4 farklı açıdan sınıflandırılırlar - Integer, Float, Character ve Boolean. Kendilerine tahsis edilen bellekle ilgili olarak farklı veri türlerini anlamak için aşağıdaki resme başvurabilirsiniz.

java1.png



Yukarıdaki resimde de görebileceğiniz gibi, veri tipleri 4 ana tipten oluşmaktadır.

İlk veri türü, sayısal bir değeri saklayan Integer'dır.
Şimdi, eğer sayısal bir değer ondalık bir kısım içeriyorsa, float olarak adlandırılacaktır.
Daha sonra, bir karakter saklamak isterseniz, üçüncü veri türü olan char kullanılır. char'da, herhangi bir alfabetik karakterin yanı sıra özel bir karakter de saklayabilirsiniz.
Son veri türü, yalnızca 'doğru' veya 'yanlış' değerini depolayan Boolean'dır.


Şimdi ilerleyelim ve Java'da gerçekleştirebileceğiniz çeşitli veri işlemlerine bakalım.
Veri Operatörleri

Aşağıda listelenen başlıca 4 farklı operatör türü vardır:

Aritmetik Operatör: Toplama, çıkarma, çarpma, bölme ve modül gibi aritmetik işlemleri gerçekleştirir.
Tekli Operatör: Tekli operatörler belirli bir değeri artırmak veya azaltmak için kullanılır. Örneğin: ++ artırma, - - azaltma anlamına gelir.
İlişkisel Operatör: İki varlık arasında bir tür ilişki tanımlar. Örneğin: <, >, <=, >=, !=, ==.
Mantıksal Operatör: Mantıksal operatörler genellikle boolean (mantıksal) değerlerle kullanılır.


Şimdi, ilerleyelim ve kontrol deyimleri kavramını anlayalım.

Kontrol İfadeleri

Kontrol deyimleri, programınızın akışını tanımlayan deyimlerdir. Java'da 3 tür kontrol deyimi vardır: Seçim, yineleme ve atlama deyimleri.

java2.png


Bu kontrol deyimlerini tek tek görelim.

Seçim Deyimleri:

Seçim deyimleri, bir ifadenin sonucuna veya bir değişkenin durumuna bağlı olarak çalışma zamanı sırasında programın akışını kontrol etmenizi sağlar. Örneğin: pizza yemek istiyorsunuz ama pizzayı en uygun fiyata nereden alabilirsiniz? Domino's, Pizza Hut veya başka bir outlet gibi çeşitli popüler seçenekler arasından seçim yapabilirsiniz. Yani burada mevcut çeşitli seçenekler arasından bir seçim süreci izliyorsunuz.

Şimdi, bu ifadeler ayrıca aşağıdaki şekilde sınıflandırılabilir:

If-else Statements
Switch Statements


if-else deyimlerini daha iyi anlamak için aşağıdaki akış şemasına bakın:

java3.png


Bu akış şemasında, kod aşağıdaki şekilde yanıt verecektir:

Öncelikle, koşulu kontrol ettiği döngüye girecektir.
Koşul doğruysa, 'if' kısmındaki ifadeler kümesi yürütülecektir.
Koşul yanlışsa, 'else' kısmındaki ifadeler kümesi yürütülecektir.

Burada if-else ifadelerinin nasıl çalıştığına dair bir fikir edinmiş olmalısınız. Şimdi, bu ifadeleri Eclipse IDE'de nasıl kullanabiliriz? Hadi koda bir göz atalım:

Java:
public class Compare {
     int a=10,
int b=5;

if(a>b)
{  // if condition
System.out.println(" A is greater than B");
}
else
{     // else condition
System.out.println(" B is greater");
}
}

Yukarıdaki kodda, 'a' ve 'b' sayılarını karşılaştırdığım bir Compare sınıfı oluşturdum. Her şeyden önce, 'a' değerinin 'b' değerinden büyük olup olmadığını kontrol ettiği 'if' koşuluna girecektir. Eğer koşul doğruysa, “A, B'den büyüktür” yazdıracak, aksi takdirde “B daha büyüktür” komutunu çalıştıracaktır.

Devam edersek, bir Switch case deyimimiz var. Switch deyimi, bir dizi deyimin yürütülmesi için birden fazla yol tanımlar. Çok yönlü bir dallanma deyimi olduğu için büyük bir if-else deyimleri kümesi kullanmaktan daha iyi bir alternatiftir.

Switch deyimlerini daha iyi anlamak için aşağıdaki akış şemasına bakın:

java4.png


Bu Switch case akış şemasında kod aşağıdaki adımlarda yanıt verecektir:

Öncelikle, bir ifadeye sahip olan switch case'e girecektir.
Daha sonra, Case 1 koşuluna gidecek, koşula geçirilen değeri kontrol edecektir. Eğer doğru ise, Statement bloğu çalışacaktır. Bundan sonra, bu switch case'den ayrılacaktır.
Yanlış olması durumunda, bir sonraki duruma geçecektir. Durum 2 koşulu doğruysa, deyimi yürütecek ve bu durumdan kopacaktır, aksi takdirde yine bir sonraki duruma atlayacaktır.
Diyelim ki herhangi bir durum belirtmediniz ya da kullanıcıdan yanlış bir girdi geldi, o zaman varsayılan duruma geçecek ve burada varsayılan deyiminizi yazdıracaktır.

Yine, IDE'de switch ifadeleri için koda bakarsak, işte burada:

Java:
public class SwitchExample {
     int week=7;
String weeknumber;

switch(week){    // switch case
case 1:
weeknumber="Monday";
break;

case2:
weeknumber="tuesday";
break;

case3:
weeknumber="wednesday";
break;

default:        // default case
weeknumber="invalid week";
break;
}
System.out.println(weeknumber);
}
}

Yukarıdaki kodda, haftanın günlerini yazdıran 3 durum içeren bir SwitchExample sınıfı oluşturdum. Ayrıca, kullanıcı bir durum belirtmediğinde çalıştırılan varsayılan bir durum da vardır.

Her iki seçim ifadesini de sonuçlandırdığımızda, iki ifadeyi karşılaştırıyorsak if-else kullandığımızı anladık, ancak diyelim ki belirli bir ifadeye karşı belirli bir değeri kontrol ediyorsanız, Switch ifadesine gidiyoruz.

Daha sonra, başka bir kontrol deyimleri kümesi, yani Yineleme Deyimleri vardır.

Yineleme İfadeleri:

Java'da bu deyimler, küçük kod parçaları arasında yineleme yapmak için kullanıldığından genellikle döngüler olarak adlandırılır. Yineleme deyimleri, döngü gereksinimlerini karşılamak için aşağıdaki döngü türlerini sağlar.

java5.png


Her birini ayrıntılı olarak anlayalım:

While deyimi:

Belirli bir koşul doğruyken bir grup deyimi tekrarlar. Döngü gövdesini çalıştırmadan önce koşulu test eder. Bunu bir akış şeması ile daha iyi anlayalım:

java6.png


Bu akış şemasında, kod aşağıdaki adımlarda yanıt verecektir:

Öncelikle, koşulu kontrol ettiği döngüye girecektir.
Eğer doğruysa, kod kümesini çalıştıracak ve işlemi tekrarlayacaktır.
False ise doğrudan döngüden çıkacaktır.

Şimdi, kodu IDE'de nasıl uygulayabileceğinizi görelim.

Java:
public class WhileExample {
      public static void main(String args[]) {
int a=5;
while(a<10)   //while condition
{
System.out.println("value of a" +a);
a++;
System.out.println("\n");
}
}
}

Yukarıdaki kodda, önce a değerinin 10'dan küçük olup olmadığı koşulu kontrol edilir. Burada, a'nın değeri 5'tir ve bu da koşulu karşılar ve böylece işlevleri gerçekleştirir.

Do-while deyimi:

While deyimi gibidir, ancak döngü gövdesinin sonunda koşulu test eder. Ayrıca, programı en az bir kez çalıştıracaktır. Bunu bir akış şeması ile daha iyi anlayalım:

java7.png


Bu do-while akış şemasında, kod aşağıdaki adımlarda yanıt verecektir:

Öncelikle, 'do' bloğunuzda belirtilen bir dizi ifadeyi çalıştıracaktır.
Bundan sonra, koşulu kontrol ettiği 'while' kısmına gelecektir.
Eğer koşul doğruysa, geri dönecek ve ifadeleri çalıştıracaktır.
Eğer koşul yanlışsa, doğrudan döngüden çıkacaktır.

Şimdi kodu IDE'de nasıl uygulayabileceğinizi görelim.

Java:
public class DoWhileExample {
      public static void main(string args[]){
int count=1;
do {                        // do statement
System.out.println("count is:"+count);
count++;
}
while (count<10)            // while condition
}
}

Yukarıdaki kodda, önce 'do' ifadelerini çalıştıracak ve ardından while kısmına atlayacaktır. Bu programda çıktı şöyle olacaktır: 1 2 3 4 5 6 7 8 9.

For deyimi:

For deyimi, döngü değişkenini yönetebileceğiniz bir dizi deyimi birden çok kez yürütür. Burada temel olarak 3 işleminiz vardır: başlatma, koşul ve yineleme. Bunu bir akış şeması ile daha iyi anlayalım:

java8.png


Bu akış şemasında, kod aşağıdaki adımlarda yanıt verecektir:

Öncelikle, koşulu kontrol ettiği döngüye girecektir.
Ardından, koşul doğruysa, ifadeler yürütülecektir.
Koşul yanlışsa, doğrudan döngüden çıkar.

Kodu IDE'de nasıl uygulayabileceğinizi görelim.

Java:
public class ForExample {
      public static void main(String args[]) {
for(int i=0; i<=10; i++)  // for condition 
{
System.out.println(i);
}
}
}

Yukarıdaki kodda, 1'den 10'a kadar olan sayıları doğrudan yazdıracaktır.

Tartışacağımız son kontrol deyimi türü Jump Deyimi'dir.

Jump deyimi:

Atlama deyimleri, kontrolü programınızın başka bir bölümüne aktarmak için kullanılır. Bunlar ayrıca break ve continue olarak sınıflandırılır.

Şimdi bunları ayrıntılı olarak öğrenelim:

Break deyimi:

Bir break deyimi kullanıldığında, döngü sonlandırılır ve program kontrolü döngüyü takip eden bir sonraki deyime devam eder. Bunu bir akış şeması ile daha iyi anlayalım:

java9.png


Bu akış şemasında, kod aşağıdaki adımlarda yanıt verecektir:

1. Öncelikle koşulu kontrol ettiği döngüye girecektir.

2. Döngü koşulu yanlışsa, doğrudan döngüden çıkar.

3. Koşul doğruysa, kesme koşulunu kontrol eder.

4. Kesme koşulu doğruysa, döngüden çıkar.

5. Kesme koşulu yanlışsa, döngüde kalan ifadeleri yürütür ve ardından aynı adımları tekrarlar.

Bu deyim için sözdizimi sadece 'break' anahtar sözcüğü ve ardından noktalı virgüldür.

Continue deyimi:

Continue deyimi başka bir kontrol deyimi türüdür. Continue anahtar sözcüğü, döngünün hemen döngünün bir sonraki yinelemesine atlamasına neden olur. Bunu bir akış şeması ile daha iyi anlayalım:

java10.png



Bu akış şemasında, kod aşağıdaki adımlarda yanıt verecektir:

1. Öncelikle koşulu kontrol ettiği döngüye girecektir.

2. Döngü koşulu yanlışsa, doğrudan döngüden çıkar.

3. Döngü koşulu doğruysa, blok 1 ifadelerini yürütecektir.

4. Bundan sonra 'continue' ifadesini kontrol eder. Eğer mevcutsa, bundan sonraki ifadeler döngünün aynı iterasyonunda yürütülmeyecektir.

5. Eğer 'continue' ifadesi mevcut değilse, ondan sonraki tüm ifadeler yürütülecektir.

Sözdizimi sadece 'continue' anahtar sözcüğü ve ardından noktalı virgüldür.
Şimdi, Java'da sınıfların ve nesnelerin ne olduğunu görelim.

Sınıflar ve Nesneler

Java'da bir sınıf, tüm verilerinizi içeren bir plandır. Bir sınıf, bir nesnenin davranışını tanımlamak için alanlar (değişkenler) ve yöntemler içerir. Şimdi bir sınıfın sözdizimine bir göz atalım.

Java:
class Abc {
      member variables // class body
methods
}


Peki bu üye değişkenlere ve metotlara nasıl erişebilirsiniz? İşte burada Nesne kavramı ortaya çıkıyor.

Bir nesne, bir sınıfta bir durumu ve davranışı olan önemli bir öğedir. Verilerinize erişebilen bir sınıf örneğidir. Java'da bir nesne oluşturmak için sözdizimini görelim:

java11.png


Burada, Student sınıf adınızdır ve ardından nesnenin adı gelir. Ardından bellek ayırmak için kullanılan bir “new” anahtar sözcüğü vardır. Son olarak, yapıcıya bir çağrı vardır. Bu çağrı yeni nesneyi başlatır.
Şimdi Java'da bir nesneyi kullanarak bir yöntemi nasıl çağırabileceğinizi görelim:

Java:
class Student()
      void display(); {            // Method
------                           // logic of method
}
public static void main(String args[]){
Student obj=new Student();   // Created an object
obj.display();               // Method called
}

Şimdi, Java yazımızın başka bir anahtar kavramı, yani Dizileri tartışacağımız yere geçelim.

Diziler

Java'daki diziler, C++ veya başka bir programlama dilindekine benzer. Dizi, aynı tipteki sıralı elemanları tutan bir veri yapısıdır.

Diyelim ki 50 sayı saklamak istiyorsunuz. Sayı0, sayı1, ... ve benzeri gibi ayrı değişkenler bildirmek yerine. Bir dizi değişkeni bildirebilirsiniz - “sayılar” ve ayrı değişkenleri temsil etmek için sayı[0], sayı[1] kullanabilirsiniz. Bu işinizi kolaylaştıracak ve fazlalığı en aza indirecektir.

Her dizinin iki bileşeni vardır: indeks ve değer. Daha iyi anlamak için aşağıdaki resme bakın:

java12.png


Burada indeksleme sıfırdan başlar ve (n-1)'e kadar gider, burada n= dizinin boyutu. Diyelim ki 10 sayı saklamak istiyorsunuz, o zaman indeksleme sıfırdan başlar ve 9'a kadar gider.

Java'da iki tür dizi vardır:

Tek Boyutlu Dizi
Çok Boyutlu Dizi

Tek Boyutlu Dizi:

Tek boyutlu bir dizide, aynı türdeki değişkenlerin listesine ortak bir adla erişilebilir. Diziyi aşağıdaki sözdizimini kullanarak başlatabilirsiniz:

Java:
int a[] = new int[12];

Verilen indekse göre verileri depoladığım aşağıdaki resme bakabilirsiniz.

java13.png


Çok Boyutlu Dizi:

Çok boyutlu bir dizide, verileriniz bir matris biçiminde saklanır. Burada, aşağıdaki sözdizimini kullanarak diziyi başlatabilirsiniz:

Java:
int table[][]= new int[4][5];

Matematikte kullandığımız matrise oldukça benzer. Verileri farklı boyutlara göre sakladığım aşağıdaki resme bakın.

java14.png


Böylece diziler, verileri herhangi bir konuma ekleyebileceğiniz kodu optimize etmenize yardımcı olur.

Java'da dizi kavramını anlamak için aşağıdaki kodu görelim.

Java:
import java.util.*;
public class ArrayExample {
public static void main( String args[])
{
double invoice[][]= new double[10][2];  // Initializing array
Scanner obj= new Scanner(System.in);    // creating a scanner object to take input from user
for(i=0;i<10;i++){                       // nested for loops
for(j=0;j<2;j++);
{
System.out.println("Enter the value");
invoice[i][j]=obj.nextDouble();         // store values to array   
for(i=0;i<10;i++){
for(j=0;j<2;j++)
{
System.out.println(invoice[i][j]);
}
}
}
}


Yukarıdaki kodda, dizi için nasıl girdi alabileceğinizi ve aynısını nasıl yazdırabileceğinizi açıkladım.
Umarım bir dizinin nasıl göründüğünü ve bir diziyi nasıl başlattığınızı anlamışsınızdır. Şimdi, yukarıdaki konuları özetleyelim ve bir Java programının tüm yapısını görelim.

Bir Programın Yapısı

Şimdiye kadar üye değişkenler, veri tipleri, kontrol deyimleri, sınıflar ve nesneler hakkında bilgi edindik. Şimdi bunların Java'da bir sınıf içinde nasıl bir araya getirildiğini görelim.

Java:
public class Car{                    // Class creation
       String color;                        // Member variables 
String model;
public void SpeedCheck(int s)        // Method
{
int speed=s;
if(speed>100)                        // Control statement
{
System.out.println(" You are driving very fast");
}
else
{
System.out.println("You are driving at normal speed");
}
public static void main ( String args[])
{
Car obj= new Car();                  // Object creation
obj.speed(60);
}

Son olarak, yazımızdaki son konumuza, yani Nesne Yönelimli programlama kavramlarına geliyoruz.

OOPs Kavramı

Java'da sınıfları ve nesneleri zaten tartışmıştık. Şimdi nesne yönelimli programlamanın 4 ana kavramını tartışalım - Kalıtım, Kapsülleme, Çokbiçimlilik ve Soyutlama.

İlk kavram olan Kalıtım ile başlayalım.

Kalıtım:

Çoğunuz kalıtıma aşina olmalısınız. Kalıtım, bir sınıfın diğerinin özelliklerini aldığı bir süreçtir. Ama kimin özellikleri miras alınır? Burada iki sınıfımız var, bir temel sınıfın özelliklerini miras alan bir çocuk sınıf.
Özellikleri miras alan bir sınıf Çocuk sınıf olarak bilinir. Aynı zamanda türetilmiş sınıf veya alt sınıf olarak da adlandırılır. Daha sonra, özellikleri miras alınan sınıf Ana sınıf veya temel sınıf olarak bilinir.

Bu sınıfları gerçek hayattan bir hayvan örneğine bakarak anlayalım.

java15.png


Yukarıdaki resimde, Animal üst sınıftır; amfibiler, sürüngenler, memeliler ve kuşlar ise 'Animal' sınıfının özelliklerini miras alan alt sınıflarınızdır.

Kapsülleme:

Java'da kapsülleme, veri ve kodu tek bir birim olarak bir araya getirme mekanizmasıdır. Tüm metotlarınızın, değişkenlerinizin tek bir sınıfta birbirine bağlandığı aşağıdaki resme bakın.

java16.png


Kapsüllemede, bir sınıfın değişkenleri diğer sınıflardan gizlenir ve yalnızca mevcut sınıflarının yöntemleri aracılığıyla erişilebilir.

Çok Biçimlilik:

Çok biçimlilik, bir değişkenin, fonksiyonun veya nesnenin birden fazla biçim alabilme yeteneğidir. OOP'lerde çok biçimliliğin en yaygın kullanımı, bir üst sınıfın bir alt sınıf nesnesine başvurmak için kullanıldığında ortaya çıkar. Çok biçimlilik ayrıca fonksiyon aşırı yükleme yoluyla da elde edilir. Merak etmeyin! Tüm kavramı bir sonraki blogumda açıklayacağım. Şimdilik, bir öğretmenin öğrenciye farklı işlevlere sahip farklı şekil/şekiller çizmesini söylediği gerçek hayat senaryosunu ele alalım.

java17.png


Diyelim ki programımın bir parçası olarak zaten birden fazla fonksiyona sahip olan belirli bir şekli çizmek istiyorum. Yani şekil ile ilgilenen fonksiyonları draw() olarak adlandıracağım. Şimdi bu fonksiyonlara aktardığım değerlere bağlı olarak, farklı şekiller çizecektir. Diyelim ki bir dikdörtgen söz konusu olduğunda, uzunluk ve genişlik olmak üzere iki değer geçiyorum. Benzer şekilde, bir daire için bir yarıçap geçiyorum. Geçtiğiniz değerlere bağlı olarak, farklı amaçlara hizmet eden farklı fonksiyonlar çağrılacaktır. Yani bu, fonksiyon aşırı yükleme yoluyla elde edilebilir. Bizi izlemeye devam edin, fonksiyon aşırı yükleme kavramı bir sonraki blogumda ayrıntılı olarak ele alınacaktır.
Soyutlama:

Temel olarak olaylardan ziyade fikirlerle ilgilenme niteliğidir. Soyutlama, uygulama detaylarını kullanıcıdan gizleme ve kullanıcılara sadece işlevsellik sağlama metodolojisidir. Soyutlamanın tam olarak ne olduğunu anlamanıza yardımcı olacağım bu gerçek hayat örneğini görelim.

java18.png


Bu arabanın durumunu düşünürseniz, burada tamirci arabadaki belirli bir işlevi onarıyor. Ancak kullanıcı ya da sürücü bu tür şeyleri bilmek istemez, sadece arabasının çalışır durumda olmasını ister. Dolayısıyla burada, temel olarak uygulamayı ayırırsınız ve diğer kişiye aslında görmek istediği şeyi gösterirsiniz ve bu tam olarak soyutlama anlamına gelir.
 
Geri
Üst