Java
Nesneler ve Sınıflar
Liang,Introduction to Java Programming, Tenth Edition, (c)
2015 Pearson Education, Inc. All rights reserved.
1
2.
2
Motivasyon
Önceki bölümleri öğrendiktensonra seçimleri, döngüleri,
yöntemleri ve dizileri kullanarak birçok programlama
problemini çözebilecek duruma geleceksiniz. Ancak bu
Java özellikleri, grafiksel kullanıcı arayüzleri ve büyük
ölçekli yazılım sistemleri geliştirmek için yeterli değildir.
Aşağıda gösterildiği gibi bir grafik kullanıcı arayüzü
geliştirmek istediğinizi varsayalım. Nasıl programlarsınız?
3.
3
Hedefler
Nesneleri vesınıfları tanımlamak ve nesneleri modellemek için sınıfları kullanmak
Sınıfları ve nesneleri tanımlamak için UML grafik gösterimini kullanmak.
Sınıfların nasıl tanımlanacağını ve nesnelerin nasıl oluşturulacağını göstermek.
Yapıcıları kullanarak nesneler oluşturmak için.
Nesne referans değişkenleri aracılığıyla nesnelere erişmek için.
Bir referans tipi kullanarak bir referans değişkeni tanımlamak için.
Nesne üye erişim operatörünü (.) kullanarak bir nesnenin verilerine ve yöntemlerine erişmek için
Referans türlerinin veri alanlarını tanımlamak ve bir nesnenin veri alanları için varsayılan değerler
atamak.
Nesne referans değişkenleri ile ilkel veri tipi değişkenleri arasında ayrım yapmak.
Java kitaplığı sınıflarını kullanmak için Date, Random ve Point2D.
Örnek ve statik değişkenler ve yöntemler arasında ayrım yapmak.
Özel veri alanlarını uygun get ve set yöntemleriyle tanımlamak.
Sınıfların bakımını kolaylaştırmak için veri alanlarını kapsüllemek.
Nesne argümanları ile yöntemler geliştirmek ve ilkel tip argümanlar ile nesne tipi argümanlar arasında
ayrım yapmak.
Dizilerdeki nesneleri depolamak ve işlemek için.
Nesnelerin içeriğini korumak için değişmez sınıflardan değişmez nesneler oluşturmak.
Bir sınıf bağlamında değişkenlerin kapsamını belirlemek.
Çağıran nesnenin kendisine atıfta bulunmak için this anahtar sözcüğünü kullanmak.
4.
Nesne Yönelimli Programlama
Kavramları
Nesneyönelimli programlama (OOP), nesneleri
kullanarak programlamayı içerir. Bir nesne, gerçek
dünyada açıkça tanımlanabilen bir varlığı temsil
eder. Örneğin, bir öğrenci, bir sıra, bir daire, bir
düğme ve hatta ödünç alınan bir eşyanın tümü nesne
olarak görülebilir. Bir nesnenin benzersiz bir kimliği,
durumu ve davranışları vardır. Bir nesnenin durumu,
mevcut değerleri ile bir dizi veri alanından
(özellikler olarak da bilinir) oluşur. Bir nesnenin
davranışı bir dizi yöntemle tanımlanır.
4
5.
5
Nesneler
Bir nesnenin hemdurumu hem de davranışı vardır.
Durum, nesneyi tanımlar ve davranış, nesnenin ne
yaptığını tanımlar.
Class Name: Circle
Data Fields:
radius is _______
Methods:
getArea
Circle Object 1
Data Fields:
radius is 10
Circle Object 2
Data Fields:
radius is 25
Circle Object 3
Data Fields:
radius is 125
A class template
Three objects of
the Circle class
6.
6
Sınıflar
Sınıflar, aynı türdekinesneleri tanımlayan
yapılardır. Bir Java sınıfı, veri alanlarını
tanımlamak için değişkenleri ve davranışları
tanımlamak için metotları kullanır. Ek olarak, bir
sınıf, yapıcılar olarak bilinen ve sınıftan nesneler
oluşturmak için çağrılan özel bir metot türü sağlar.
7.
7
Sınıflar
class Circle {
/**The radius of this circle */
double radius = 1.0;
/** Construct a circle object */
Circle() {
}
/** Construct a circle object */
Circle(double newRadius) {
radius = newRadius;
}
/** Return the area of this circle */
double getArea() {
return radius * radius * 3.14159;
}
}
Data field
Method
Constructors
8.
8
UML Sınıf Diyagramı
Circle
radius:double
Circle()
Circle(newRadius: double)
getArea(): double
getPerimeter(): double
setRadius(newRadius:
double): void
circle1: Circle
radius = 1.0
Class name
Data fields
Constructors and
methods
circle2: Circle
radius = 25
circle3: Circle
radius = 125
UML Class Diagram
UML notation
for objects
9.
9
Örnek: Sınıf Tanımlamave
Nesne Oluşturma
Amaç: Nesne oluşturmak, verilere erişmek ve
yöntemleri kullanmak.
TestSimpleCircle
Liang LiveExample by Y.
Daniel Liang
(pearsoncmg.com)
Liang LiveExample by Y. Daniel Liang
(pearsoncmg.com)
10.
10
Örnek: Sınıf Tanımlamave Nesne Oluşturma
TV
channel: int
volumeLevel: int
on: boolean
+TV()
+turnOn(): void
+turnOff(): void
+setChannel(newChannel: int): void
+setVolume(newVolumeLevel: int): void
+channelUp(): void
+channelDown(): void
+volumeUp(): void
+volumeDown(): void
The current channel (1 to 120) of this TV.
The current volume level (1 to 7) of this TV.
Indicates whether this TV is on/off.
Constructs a default TV object.
Turns on this TV.
Turns off this TV.
Sets a new channel for this TV.
Sets a new volume level for this TV.
Increases the channel number by 1.
Decreases the channel number by 1.
Increases the volume level by 1.
Decreases the volume level by 1.
The + sign indicates
a public modifier.
TV
Run
TestTV
12
Yapıcı Metotlar
Parametresi olmayanbir oluşturucu, argüman içermeyen bir
oluşturucu olarak anılır.
· Yapıcılar, sınıfın kendisiyle aynı ada sahip olmalıdır.
· Oluşturucuların bir dönüş türü yoktur; geçersiz bile değildir.
· Oluşturucular, bir nesne oluşturulduğunda new operatörü
kullanılarak çağrılır. Yapıcılar nesneleri başlatma rolünü oynarlar.
14
Varsayılan Yapıcı Metot
Birsınıf, yapıcı metotlar olmadan tanımlanabilir.
Bu durumda, argüman içermeyen ve boş bir
gövdeye sahip bir yapıcı metot ortaya çıkar ve
sınıfta dolaylı olarak tanımlanır.
Varsayılan yapıcı metot olarak adlandırılan bu
yapıcı metot, yalnızca sınıfta açıkça hiçbir yapıcı
metot tanımlanmadığında otomatik olarak
oluşturulur.
15.
15
Nesne Referans Değişkenlerini
Tanımlama
Birnesneye referans vermek için, nesneyi bir referans
değişkenine atayın.
Bir referans değişkeni bildirmek için aşağıdaki
sözdizimini kullanın:
ClassName objectRefVar;
Örnek:
Circle myCircle;
18
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100;
myCircle tanımla
no value
myCircle
animation
19.
19
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100; : Circle
radius: 5.0
no value
myCircle
Bir circle
nesnesi oluştur
animation
20.
20
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100; : Circle
radius: 5.0
reference value
myCircle
myCircle'a nesne
referansı atama
animation
21.
21
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100; : Circle
radius: 5.0
reference value
myCircle
no value
yourCircle
yourCircle tanımla
animation
22.
22
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100; : Circle
radius: 5.0
reference value
myCircle
no value
yourCircle
: Circle
radius: 1.0
Yeni bir Circle
nesnesi tanımlama
animation
23.
23
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100; : Circle
radius: 5.0
reference value
myCircle
reference value
yourCircle
: Circle
radius: 1.0
yourCircle'a nesne
referansı atama
animation
24.
24
Kodları Takip Edelim
CirclemyCircle = new Circle(5.0);
Circle yourCircle = new Circle();
yourCircle.radius = 100; : Circle
radius: 5.0
reference value
myCircle
reference value
yourCircle
: Circle
radius: 100.0
Radius’u
yourCircle’da
değiştirin
animation
25.
25
Dikkat
Hatırlayın daha öncekullanıldı
Math.methodName(arguments) (ör, Math.pow(3, 2.5))
Math sınıfında bir yöntemi çağırmak için.
SimpleCircle.getArea() kullanarak getArea()'yı çağırabilir misiniz?
Cevap hayır.
Bu bölümden önce kullanılan tüm yöntemler statik anahtar sözcük
kullanılarak tanımlanan statik yöntemlerdi. Ancak, getArea() statik
değildir. Aşağıdaki kodlar kullanılarak bir nesneden çağrılmalıdır.
objectRefVar.methodName(arguments) (ör., myCircle.getArea()).
26.
26
Referans Veri Alanları
Verialanları referans tiplerinde olabilir. Örneğin,
aşağıdaki Student sınıfı, String türünde bir veri alanı adı
içerir.
public class Student {
String name; // name has default value null
int age; // age has default value 0
boolean isScienceMajor; // isScienceMajor has default value false
char gender; // c has default value 'u0000'
}
27.
27
Boş Değer
Referans tipindekibir veri alanı herhangi bir
nesneye referans vermiyorsa, veri alanı özel
bir hazır bilgi değeri içerir, null.
28.
28
Veri Alanı içinVarsayılan Değer
Bir veri alanının varsayılan değeri, referans türü
için null, sayısal tür için 0, boolean türü için false
ve karakter türü için 'u0000' şeklindedir. Ancak
Java, bir yöntemin içindeki yerel bir değişkene
varsayılan bir değer atamaz.
public class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println("name? " + student.name);
System.out.println("age? " + student.age);
System.out.println("isScienceMajor? " + student.isScienceMajor);
System.out.println("gender? " + student.gender);
}
}
29.
29
Örnek
public class Test{
public static void main(String[] args) {
int x; // x has no default value
String y; // y has no default value
System.out.println("x is " + x);
System.out.println("y is " + y);
}
}
Compile error: variable not
initialized
Java, bir metot içindeki yerel bir değişkene
varsayılan değer atamaz.
30.
30
İlkel Veri Türlerive Nesne Türlerinin
Değişkenleri Arasındaki Farklar
1
İlkel Tip int i = 1 i
Nesne Tipi Circle c c reference
new Circle() kullanılarak
oluşturuldu
c: Circle
radius = 1
31.
31
İlkel Veri Türlerininve Nesne
Türlerinin Değişkenlerini
Kopyalama
i
Ilkel tip değişken atama i = j
önce:
1
j 2
i
sonra:
2
j 2
c1
Nesne tipi atama c1 = c2
Before:
c2
c1
After:
c2
c1: Circle
radius = 5
c2: Circle
radius = 9
c1: Circle
radius = 5
c2: Circle
radius = 9
32.
32
Çöp toplama
Önceki şekildegösterildiği gibi, c1 = c2
atama ifadesinden sonra c1, c2 tarafından
referans verilen aynı nesneyi gösterir. Daha
önce c1 tarafından başvurulan nesneye artık
başvurulmuyor. Bu nesne çöp olarak bilinir.
Çöp, JVM tarafından otomatik olarak
toplanır.
33.
33
Çöp toplama
İPUCU: Birnesneye artık gerek olmadığını
biliyorsanız, nesne için bir referans değişkenine
açık bir şekilde null atayabilirsiniz. Nesneye
herhangi bir değişken tarafından başvurulmuyorsa,
JVM alanı otomatik olarak toplayacaktır.
34.
34
Tarih Sınıfı
Java, java.util.Datesınıfında sistemden bağımsız bir tarih ve
saat kapsüllemesi sağlar. Geçerli tarih ve saat için bir örnek
oluşturmak üzere Date sınıfını kullanabilir ve tarih ve saati
bir dize olarak döndürmek için toString yöntemini
kullanabilirsiniz.
java.util.Date
+Date()
+Date(elapseTime: long)
+toString(): String
+getTime(): long
+setTime(elapseTime: long): void
Constructs a Date object for the current time.
Constructs a Date object for a given time in
milliseconds elapsed since January 1, 1970, GMT.
Returns a string representing the date and time.
Returns the number of milliseconds since January 1,
1970, GMT.
Sets a new elapse time in the object.
The + sign indicates
public modifer
35.
35
Tarih Sınıfı Örneği
ÖrnekKod
java.util.Date date = new java.util.Date();
System.out.println(date.toString());
19 Aralık Pazartesi 13:50:19 EST 2023 gibi bir dizi
görüntüler.
36.
36
Rastgele Sınıfı
0,0 ile1,0 arasında (1,0 hariç) rastgele bir çift değer elde
etmek için Math.random()'u kullandınız. Java.util.Random
sınıfında daha kullanışlı bir rasgele sayı üreteci
sağlanmaktadır.
java.util.Random
+Random()
+Random(seed: long)
+nextInt(): int
+nextInt(n: int): int
+nextLong(): long
+nextDouble(): double
+nextFloat(): float
+nextBoolean(): boolean
Constructs a Random object with the current time as its seed.
Constructs a Random object with a specified seed.
Returns a random int value.
Returns a random int value between 0 and n (exclusive).
Returns a random long value.
Returns a random double value between 0.0 and 1.0 (exclusive).
Returns a random float value between 0.0F and 1.0F (exclusive).
Returns a random boolean value.
37.
37
Rastgele Sınıf Örneği
İkiRandom nesnesi aynı tohuma sahipse, aynı sayı dizilerini
üreteceklerdir. Örneğin, aşağıdaki kod, aynı seed 3'e sahip iki
Random nesnesi oluşturur.
Random random1 = new Random(3);
System.out.print("From random1: ");
for (int i = 0; i < 10; i++)
System.out.print(random1.nextInt(1000) + " ");
Random random2 = new Random(3);
System.out.print("nFrom random2: ");
for (int i = 0; i < 10; i++)
System.out.print(random2.nextInt(1000) + " ");
From random1: 734 660 210 581 128 202 549 564 459 961
From random2: 734 660 210 581 128 202 549 564 459 961
38.
38
Point2D Sınıfı
Java API,iki boyutlu bir düzlemde bir noktayı temsil etmek
için javafx.geometry paketinde kullanışlı bir Point2D
sınıfına sahiptir.
Run
TestPoint2D
39.
39
Örnek Değişkenler veMetotlar
Örnek değişkenleri belirli bir örneğe aittir.
Örnek metotlar, sınıfın bir örneği tarafından
çağrılır.
Örnek değişkenler ve metotlar, static anahtar
sözcüğü atlanarak belirtilir.
40.
40
Statik Değişkenler, Sabitlerve
Metotlar
Statik değişkenler, sınıfın tüm örnekleri tarafından
paylaşılır. Statik metotlar belirli bir nesneye bağlı
değildir.
Statik sabitler, sınıfın tüm örnekleri tarafından
paylaşılan nihai değişkenlerdir.
41.
41
Statik Değişkenler, Sabitlerve
Metotlar
Statik değişkenleri, sabitleri ve metotları bildirmek
için statik değiştiriciyi kullanın.
43
Örnek ve SınıfDeğişkenlerini ve
Metotları Kullanma Örneği
Amaç: Örnek ve sınıf değişkenlerinin
rollerini ve kullanımlarını gösterin. Bu
örnek, oluşturulan Circle nesnelerinin
sayısını izlemek için bir sınıf değişkeni
olan numberOfObjects ekler.
Run
CircleWithStaticMembers
TestCircleWithStaticMembers
44.
44
Görünürlük Değiştiriciler ve
Erişimci/DeğiştiriciMetotlar
Varsayılan olarak, sınıfa, değişkene veya metota aynı
paketteki herhangi bir sınıf tarafından erişilebilir.
public
Sınıf, veri veya metot, herhangi bir paketteki herhangi bir
sınıf tarafından görülebilir.
private
Verilere veya metotlara yalnızca tanımlanan sınıf tarafından
erişilebilir.
Özel (private) özellikleri okumak ve değiştirmek için get ve set
metotları kullanılır.
45.
45
private değiştirici, birsınıf içindeki erişimi kısıtlar, varsayılan
değiştirici, bir paket içindeki erişimi kısıtlar ve genel değiştirici,
sınırsız erişimi etkinleştirir.
46.
46
Bir sınıftaki varsayılandeğiştirici, bir paket içindeki erişimi kısıtlar
ve genel değiştirici, sınırsız erişimi etkinleştirir.
47.
47
NOT
Bir nesne, (b)'degösterildiği gibi özel üyelerine erişemez.
Ancak, nesnenin (a)'da gösterildiği gibi kendi sınıfında
tanımlanması sorun değil.
48.
48
Veri Alanları NedenÖzel
Olmalıdır?
Verileri korumak için.
Kodun bakımını kolaylaştırmak için.
49.
49
Veri Alanı KapsüllemeÖrneği
Circle
-radius: double
-numberOfObjects: int
+Circle()
+Circle(radius: double)
+getRadius(): double
+setRadius(radius: double): void
+getNumberOfObjects(): int
+getArea(): double
The radius of this circle (default: 1.0).
The number of circle objects created.
Constructs a default circle object.
Constructs a circle object with the specified radius.
Returns the radius of this circle.
Sets a new radius for this circle.
Returns the number of circle objects created.
Returns the area of this circle.
The - sign indicates
private modifier
Run
CircleWithPrivateDataFields
TestCircleWithPrivateDataFields
50.
50
Nesneleri Metotlara Geçirmek
İlkel tip değeri için değere göre geçirme
(değer parametreye iletilir)
Referans türü değeri için değere göre
geçirme (değer, nesneye referanstır)
Run
TestPassObject
52
Nesne Dizisi
Circle[] circleArray= new Circle[10];
Bir nesne dizisi aslında bir referans
değişkenleri dizisidir. Bu nedenle,
circleArray[1].getArea() öğesini
çağırmak, sonraki şekilde gösterildiği gibi
iki düzeyde başvuru içerir. tüm diziye
CircleArray başvuruları. circleArray[1],
bir Circle nesnesine başvurur.
55
Değişmez Nesneler veSınıflar
Bir nesnenin içeriği, nesne oluşturulduktan sonra
değiştirilemiyorsa, nesneye değişmez nesne ve sınıfına
değişmez sınıf denir. Liste 8.10'daki Circle sınıfındaki set
yöntemini silerseniz, yarıçap özel olduğundan ve bir set
yöntemi olmadan değiştirilemeyeceğinden sınıf değişmez
olacaktır.
Tüm özel veri alanlarına sahip ve mutator içermeyen bir sınıf
mutlaka değişmez değildir. Örneğin, aşağıdaki Student sınıfı
tüm özel veri alanlarına sahiptir ve mutator içermez, ancak
değişkendir.
56.
56
Örnek
public class Student{
private int id;
private BirthDate birthDate;
public Student(int ssn,
int year, int month, int day) {
id = ssn;
birthDate = new BirthDate(year, month, day);
}
public int getId() {
return id;
}
public BirthDate getBirthDate() {
return birthDate;
}
}
public class BirthDate {
private int year;
private int month;
private int day;
public BirthDate(int newYear,
int newMonth, int newDay) {
year = newYear;
month = newMonth;
day = newDay;
}
public void setYear(int newYear) {
year = newYear;
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student(111223333, 1970, 5, 3);
BirthDate date = student.getBirthDate();
date.setYear(2010); // Now the student birth year is changed!
}
}
57.
57
Hangi Sınıf Değişmez?
Birsınıfın değişmez olması için, tüm veri alanlarını özel
olarak işaretlemesi ve değiştirilebilir bir veri alanı nesnesine
referans döndürecek hiçbir mutator yöntemi ve hiçbir erişimci
yöntemi sağlamaması gerekir.
58.
58
Değişkenlerin Kapsamı
Örnekve statik değişkenlerin kapsamı sınıfın
tamamıdır. Bir sınıf içinde herhangi bir yerde
bildirilebilirler.
Yerel bir değişkenin kapsamı, bildiriminden başlar
ve değişkeni içeren bloğun sonuna kadar devam
eder. Bir yerel değişken, kullanılmadan önce
açıkça başlatılmalıdır.
59.
59
Anahtar Kelime
thisanahtar sözcüğü, bir nesnenin kendisini
ifade eden bir başvurunun adıdır. this anahtar
sözcüğünün yaygın bir kullanımı, bir sınıfın gizli
veri alanlarına atıfta bulunmaktır.
this anahtar sözcüğünün bir oluşturucunun aynı
sınıftan başka bir oluşturucuyu çağırmasını
sağlamak için başka bir yaygın kullanımı.
60.
60
Gizli Veri AlanlarınaBaşvurun
public class F {
private int i = 5;
private static double k = 0;
void setI(int i) {
this.i = i;
}
static void setK(double k) {
F.k = k;
}
}
Suppose that f1 and f2 are two objects of F.
F f1 = new F(); F f2 = new F();
Invoking f1.setI(10) is to execute
this.i = 10, where this refers f1
Invoking f2.setI(45) is to execute
this.i = 45, where this refers f2
61.
61
Aşırı Yüklenmiş YapıcıMetodu Çağırma
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public Circle() {
this(1.0);
}
public double getArea() {
return this.radius * this.radius * Math.PI;
}
} Her örnek değişkeni, bununla temsil edilen ve normalde atlanan bir
örneğe aittir.
bu, inşa edilmekte olan nesnenin veri alanı
yarıçapına atıfta bulunmak için açıkça
kullanılmalıdır.
bu, başka bir yapıcı metodu çağırmak için kullanılır