You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/*---------------------------------------------------------------------------------------------------------------------- 27.06.2020 Method overloading: Bir sınıfın içerisinde bulunan aynı isimli metotlar overload edilmiş olur ----------------------------------------------------------------------------------------------------------------------*//*---------------------------------------------------------------------------------------------------------------------- Bir metodun erişim belirleyicisinin değiştirilmesinin overload işlemine etkisi yoktur ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicstaticvoidfoo(intval) //error
{
}
privatestaticvoidfoo(intval) //error
{
}
}
Bir metodun static olup olmamasının overload işlemine etkisi yoktur
/*---------------------------------------------------------------------------------------------------------------------- Bir metodun static olup olmamasının overload işlemine etkisi yoktur ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicstaticvoidfoo(intval) //error
{
}
publicvoidfoo(intval) //error
{
}
}
Bir metodun geri dönüş tür bilgisinin overload işlemine etkisi yoktur.
/*---------------------------------------------------------------------------------------------------------------------- Bir metodun geri dönüş tür bilgisinin overload işlemine etkisi yoktur ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicstaticintfoo(intval) //error
{
return0;
}
publicstaticvoidfoo(intval) //error
{
}
}
Bir metodun parametre değişkenlerinin isimlerinin overload işlemine etkisi yoktur.
Bir metodun overload edilebilmesi için parametrik yapısı farklı olması gerekir.
/*---------------------------------------------------------------------------------------------------------------------- Bir metodun overload edilebilmesi için metodun parametrik tür bilgisinin ve dizilimlerinin (hepsine birden parametrik yapı denebilir) farklı olması gerekir----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicstaticvoidfoo(inta)
{
}
publicstaticvoidfoo(doublea)
{
}
publicstaticvoidfoo(doublea, intb)
{
}
publicstaticvoidfoo(intb, doublea)
{
}
}
Bir metodun imzası nedir?
/*---------------------------------------------------------------------------------------------------------------------- Bir metodun imzası ismi ve parametrik yapı diziliminin tamamıdır. Kural: Bir sınıf içerisinde aynı imzaya sahip birden fazla metot bildirimi geçersizdir----------------------------------------------------------------------------------------------------------------------*//*---------------------------------------------------------------------------------------------------------------------- Bir metot çağrısında derleyicinin hangi metodu çağıracağına karar vermesi sürecine İngilizce olarak "method overload resolution" veya yalnızca "overload resolution" denir. Metot çağrısında argümanlar ile parametrelerinin türlerinin birebir uyumlu olduğu bir metot varsa o metot çağrılır (best match, exact match)----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
inta = 10;
longb = 34;
Sample.foo(a, b); //#5 çağrılır (tam uyum)
}
}
classSample {
publicstaticvoidfoo() //#1
{
System.out.println("foo");
}
publicstaticvoidfoo(inta) //#2
{
System.out.println("foo, int");
}
publicstaticvoidfoo(inta, intb) //#3
{
System.out.println("foo, int, int");
}
publicstaticvoidfoo(doublea, intb) //#4
{
System.out.println("foo, double, int");
}
publicstaticvoidfoo(inta, longb) //#5
{
System.out.println("foo, int, long");
}
publicstaticvoidbar(inta) //#6
{
System.out.println("bar, int");
}
}
Overload Resolution işlemi nasıl gerçekleşir?
/*---------------------------------------------------------------------------------------------------------------------- Tam uyum yoksa overload resolution aşağıdaki gibi gerçekleşir: 1. Aday Metotlar (candidate methods): Çağrılan metot ile aynı isimdeki tüm metotlardır 2. Uygun metotlar (applicable methods): Argüman sayısı parametre sayısı ile aynı olan ve argümanlardan parametrelere otomatik tür dönüşümünün olduğu metotlardır 3. En uygun metot (the most applicable method): Uygun uygun metotlar arasında en kaliteli dönüşümü sunan metot belirlenir. En uygun metot öyle bir metottur ki argümanlardan parametrelere dönüşüm yarışa sokulduğunda daha iyi dönüşümü veya daha kötü olmayan dönüşümü yapar. Dönüşüm kalitesi aşağıdaki gibi belirlenir: 1. T1 -> T2 ve T1 -> T3 otomatik dönüştürmelerinde T2 veya T3'den birisi T1 ile aynı ise aynı olan dönüşüm kalitelidir int -> double int -> int * 2. T1 -> T2 ve T1 -> T3 otomatik dönüştürmelerinde T2 den T3 otomatik dönüşüm var T3 den T2 ye yoksa T1->T2 daha kalitelidir. int -> long * int -> float ya da örneğin short -> int * short -> double Bu aşamalardan herhangi bir tanesi gerçekleşemezse error oluşur.----------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------- Bilindiği bir değişkenin faaliyet alanı derleme zamanına ilişkin bir kavramdır. Bir değişkenin bellekte yaratılması ile yok edilmesi arasındaki zamana değişkenin ömrü (storage duration). Bu kavram şüphesiz çalışma zamanına ilişkin bir kavramdır. Mantıksal bir ayrı kavramlara olmasalar da, faaliyet alanı ile ömür aynı şey değildir.----------------------------------------------------------------------------------------------------------------------*//*---------------------------------------------------------------------------------------------------------------------- Yerel değişkenler ve parametre değişkenleri stack alanında yaratılır. Yerel değişkenin ömrü akış bakımından bildirildiği yerde yaratılır bildirildiği blok sonunda yok edilir. Parametre değişkenleri ömrü akış bakımından metot çağrısında yaratılır metot bittiğinde yok edilir----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
{
inta; //Akış buradayken stack'te yaratıldıintb;
//...
} // b ve a yok edildi//...Sample.foo(10, 20);
//..Sample.foo(20, 40);
}
}
classSample {
publicstaticvoidfoo(inta, intb)
{
//...
}
}
Sınıfın elemanları: metot ve veri elemanı.
/*---------------------------------------------------------------------------------------------------------------------- 28.06.2020 Sınıfın içerindeki bildirimlere sınıfın elemanları (members) denir. Sınıfın bir elemanı eğer bir alt programsa buna metot eğer bir değişken ise buna veri elemanı (member variable) denir----------------------------------------------------------------------------------------------------------------------*/
Sınıfın veri elemanı nedir?
/*---------------------------------------------------------------------------------------------------------------------- Sınıf içerisinde tüm metotların dışında herhangi bir yerde bildirilen değişkenlere sınıf veri elemanı denir. Sınıf veri elemanları metotlarda olduğu gibi erişim belirleyiciye sahip olabilirler, sınıf veri elemanı static veya non-static olarak bildirilebilirler----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicinta;
publicstaticvoidfoo()
{
}
privatestaticdoubleb;
doublec;
}
Bir sınıf içerisinde aynı isimde birden fazla veri elemanı bildirimi yapılamaz.
/*---------------------------------------------------------------------------------------------------------------------- Bir sınıf içerisinde aynı isimde birden fazla veri elemanı bildirimi yapılamaz----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicinta; //error staticdoublea; //error
}
/*---------------------------------------------------------------------------------------------------------------------- Birden fazla veri elemanı aynı türdense, static veya non-static durumları aynı ise ve erişim belirleyicileri de aynı ise bildirimde virgül ile ayrılacak şekilde yazılabilirler----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
publicinta, b, c;
}
Sınıf bildirimi bir tür bildirimidir!
/*---------------------------------------------------------------------------------------------------------------------- Sınıf bildirimi bir tür bildirimidir (user defined type)----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classSample {
//...
}
classSerialPort {
//...
}
classPerson {
//...
}
classCar {
//...
}
Sınıf bildirimi bir tür bildirimi olduğuna göre sınıf türünden de değişkenler bildirilebilir.
/*---------------------------------------------------------------------------------------------------------------------- Sınıf bildirimi bir tür bildirimi olduğuna göre sınıf türünden de değişkenler bildirilebilir----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples;
Mamplem;
}
}
classSample {
//...
}
classMample {
//...
}
Java' da türler kategori olarak iki gruba ayrılır: değer türleri (value types), referans türleri (reference types).
/*---------------------------------------------------------------------------------------------------------------------- Java' da türler kategori olarak iki gruba ayrılır: değer türleri (value types), referans türleri (reference types) T bir tür ismi olmak üzere T türden bir değişken içerisinde değerin kendisi tutuluyorsa T kategori olarak değer türlerine ilişkindir. Eğer T türünden değişkenin içerisinde bir adres bilgisi tutuluyorsa T bir referans türüne ilişkindir. Tüm temel türler değer türleridir. Temel türler dışında kalan tüm türler (user defined type) referans türleridir----------------------------------------------------------------------------------------------------------------------*/
Sınıf türünden bir değişkene referans değişken ya da referans denir.
/*---------------------------------------------------------------------------------------------------------------------- Sınıf türünden bir değişkene referans değişken ya da referans denir. Anahtar Not: Java' da referans terimi adres yerine de kullanılabilir. Örneğin bir nesnenin adresi yerine bir nesnenin referansı da doğru bir cümledir. Ancak buradaki referans terimi değişken değil adresi temsil eder. Referans değişken (ya da kısaca referans) içerisinde adres (referans) tutabilen bir değişkendir----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples; //referansMamplem; //referans
}
}
classSample {
//...
}
classMample {
//...
}
Java'da nesne yaratılması.
/*---------------------------------------------------------------------------------------------------------------------- Sınıf türünden bellekte ayrılan bölgelere nesne denir. Nesneler heap de yaratılır. Java' da stack'de nesne yaratılamaz. Bir nesneyi yaratmak için new operatörü kullanılır. new operatörü operatör öncelik tablosunun birinci seviyesinde ve tek operandlı bir operatördür. Operatörün kullanımının genel biçimi: new <referans tür ismi>([argümanlar]); new operatörünün ürettiği değer heap de yaratılan nesnenin adresidir (referansıdır). Bu durumda new operatörünün değer uygun bir referansa atanabilir. Uygun referans new operatörü kullanılırken yazılan referans türden bir değişkendir. Nesneler ilgili sınıf türünün bir örneği kabul edilir ve instance terimi kullanılır----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples; //referanss = newSample();
}
}
classSample {
//...
}
Sınıfın non-static veri elemanları her nesne için ayrıca yaratılır.
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın non-static veri elemanları her nesne için ayrıca yaratılır. Sınıfın non-static veri elamanlarına sınıf dışından referans ve nokta operatörü ile erişilebilir. Her new işlemi yeni bir nesne yaratmak demektir. Aşağıdaki örneği inceleyiniz----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples, k;
s = newSample();
s.x = 10;
s.y = false;
k = newSample();
k.x = 20;
k.y = true;
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
System.out.printf("k.x=%d%n", k.x);
System.out.printf("k.y=%b%n", k.y);
}
}
classSample {
publicintx;
publicbooleany;
//...
}
Non-static veri elemanlarına nesnenin yaratılması aşamasında default değerler atanır.
/*---------------------------------------------------------------------------------------------------------------------- Non-static veri elemanlarına nesnenin yaratılması aşamasında default değerler atanır. Default değerler mantıksal sıfır değerleridir. Örneğin int türü için sıfırken, boolean türü için false değeridir ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples, k;
s = newSample();
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
}
}
classSample {
publicintx;
publicbooleany;
//...
}
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte s değişkenine değer atanmadığı için error oluşur ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples;
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
}
}
classSample {
publicintx;
publicbooleany;
//...
}
Java'da nesnenin bellekte kapladığı alan en az non-static veri elemanlarının toplam uzunluğu kadardır.
/*---------------------------------------------------------------------------------------------------------------------- Bir nesnenin bellekte kapladığı alan "en az non-static veri elemanının toplam uzunluğu kadardır" Bu durumda aynı türden nesneler için aynı uzunlukta yer ayrılır. Farklı türden nesnelerin farklı veri elemanları olabileceğinden aynı uzunlukta yer ayrılması gerekmez. Türü ne olursa olsun tüm referansların uzunlukları aynıdır. Bu da adreslenebilecek sayıları tutabilecek kadar uzunluktadır. Yani örneğin 64 bit bir işlemci de tüm referanslar 64 bit uzunluktadır.----------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte her s referansı nesneden kopartılıp yeni bir nesnenin adresi referansı atanmıştır ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples;
s = newSample();
s.x = 10;
s.y = true;
s = newSample();
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
}
}
classSample {
publicintx;
publicbooleany;
//...
}
İki aynı türden referansın birbirine atanması iki referansın da aynı nesneyi göstermeleri demektir.
/*---------------------------------------------------------------------------------------------------------------------- İki aynı türden referansın birbirine atanması iki referansın da aynı nesneyi göstermeleri demektir. Bu durumda hangi referans ile nesneye erişildiğinin bir önemi yoktur. ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples, k;
s = newSample();
s.x = 10;
s.y = true;
k = s;
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
System.out.printf("k.x=%d%n", k.x);
System.out.printf("k.y=%b%n", k.y);
++k.x;
k.y = false;
System.out.println("////////////////////////");
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
System.out.printf("k.x=%d%n", k.x);
System.out.printf("k.y=%b%n", k.y);
}
}
classSample {
publicintx;
publicbooleany;
//...
}
/*---------------------------------------------------------------------------------------------------------------------- İki aynı türden referansın birbirine atanması iki referansın da aynı nesneyi göstermeleri demektir. Bu durumda hangi referans ile nesneye erişildiğinin bir önemi yoktur. ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Samples, k;
s = newSample();
s.x = 10;
s.y = true;
k = s;
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
System.out.printf("k.x=%d%n", k.x);
System.out.printf("k.y=%b%n", k.y);
++k.x;
k.y = false;
System.out.println("////////////////////////");
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
System.out.printf("k.x=%d%n", k.x);
System.out.printf("k.y=%b%n", k.y);
k = newSample();
System.out.println("////////////////////////");
System.out.printf("s.x=%d%n", s.x);
System.out.printf("s.y=%b%n", s.y);
System.out.printf("k.x=%d%n", k.x);
System.out.printf("k.y=%b%n", k.y);
}
}
classSample {
publicintx;
publicbooleany;
//...
}
Referans parametreli metotlar olabilir.
/*---------------------------------------------------------------------------------------------------------------------- Referans parametreli metotlar olabilir. Bu durumda metot içerisinde referans parametresine geçilen adrese ilişkin nesneye erişilebilir ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
DatebirthDate = newDate();
birthDate.day = 10;
birthDate.month = 9;
birthDate.year = 1976;
DateUtil.display(birthDate);
}
}
classDateUtil {
publicstaticvoiddisplay(Datedate)
{
System.out.printf("%02d/%02d/%04d%n", date.day, date.month, date.year);
}
}
classDate {
publicintday, month, year;
//...
}
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın static bir veri elemanı bir tanedir. Bu elemanın kullanılabilmesi için nesne yaratılmış olması gerekmez. Sınıfın static veri elemanına sınıf dışından sınıf ismi ve nokta operatörü ile erişilebilir ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Sample.a = 10;
Sample.b = true;
System.out.printf("Sample.a=%d%n", Sample.a);
System.out.printf("Sample.b=%b%n", Sample.b);
}
}
classSample {
publicstaticinta;
publicstaticbooleanb;
//...
}
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın static bir veri elemanı bir tanedir. Bu elemanın kullanılabilmesi için nesne yaratılmış olması gerekmez. Sınıfın static veri elemanına sınıf dışından sınıf ismi ve nokta operatörü ile erişilebilir. ----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Sample.a = 10;
Sample.b = true;
System.out.printf("Sample.a=%d%n", Sample.a);
System.out.printf("Sample.b=%b%n", Sample.b);
}
}
classSample {
publicstaticinta;
publicstaticbooleanb;
//...
}
Sınıfın static veri elemanlarının hepsi sınıfın bir elemanı ilk kez kez kullanıldığında yaratılır ve programın sonuna kadar yaşarlar.
/*---------------------------------------------------------------------------------------------------------------------- Sınıfın static veri elemanlarının hepsi sınıfın bir elemanı ilk kez kez kullanıldığında yaratılır ve programın sonuna kadar yaşarlar----------------------------------------------------------------------------------------------------------------------*/packagecsd;
classApp {
publicstaticvoidmain(String [] args)
{
Sample.foo();
}
}
classSample {
publicstaticinta;
publicstaticbooleanb;
publicstaticvoidfoo()
{
}
//...
}
Sınıfın static veri elemanlarına da default değerler atanır.