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
Anonim sınıflar: Bu sınıflar bildirimleri sırasında programcının isimlendirmediği sınıflardır.
/*---------------------------------------------------------------------------------------------------------------------- Anonim sınıflar: Bu sınıflar bildirimleri sırasında programcının isimlendirmediği sınıflardır. Anonim sınıf bildiriminin genel biçimi: new <tür>([argümanlar]) { //... } Anonim sınıf bildirimi hem bir türemiş sınıf bildirimi hem de türemiş sınıf türünden nesne yaratma işlemidir. Yani sınıf bildirimi new operatörüne yazılan türden türetilmiş (eğer inteface ise implemente edilmiş) olan bir sınıfın hem bildirimi hem de o sınıf türünden nesne yaratılması anlamına gelir. Şüphesiz derleyici anonim sınıfa da bir isim verecektir. Bu işlem bir türetme ilemi olduğundan anonim sınıfa ilişkin yaratılan nesnenin referansı taban sınıf türünden (veya interface) bir referansa atanmalıdır----------------------------------------------------------------------------------------------------------------------*/
Aşağıdaki örnekte iki farklı anonim sınıf bildirimi yapılmıştır
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte iki farklı anonim sınıf bildirimi yapılmıştır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample() {/*...*/};
Samplek = newSample() {/*...*/};
System.out.println(s.getClass().getName());
System.out.println(k.getClass().getName());
}
}
classSample {
//...
}
Aşağıdaki örnekte iki farklı anonim sınıf bildirimi yapılmıştır. Ekran çıktılarını inceleyiniz
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte iki farklı anonim sınıf bildirimi yapılmıştır. Ekran çıktılarını inceleyiniz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample() {/*...*/};
Samplek = newSample() {/*...*/};
System.out.println(s.getClass().getName());
System.out.println(k.getClass().getName());
System.out.println(sinstanceofSample);
System.out.println(kinstanceofSample);
}
}
classSample {
//...
}
final olarak bildirilmiş sınıflar türetme işlemine kapalı olduğundan anonim sınıf bildirimi de yapılamaz
/*---------------------------------------------------------------------------------------------------------------------- final olarak bildirilmiş sınıflar türetme işlemine kapaıl olduğundan anonim sınıf bildirimi de yapılamaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample() {/*...*/}; //error
}
}
finalclassSample {
//...
}
Anonim sınıf bildiriminde taban sınıfın non-static olan ve final olarak bildirilmemiş bir metodu override edilebilir
/*---------------------------------------------------------------------------------------------------------------------- Anonim sınıf bildiriminde taban sınıfın non-static olan ve final olarak bildirilmemiş bir metodu aynı geri dönüş değeri ve aynı imza ile (public erişimciye sahipse public olarak) yazılabilir (override)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample() {
publicvoidfoo() //override
{
System.out.println("Anonim foo");
}
};
s.foo();
}
}
classSample {
publicvoidfoo()
{
System.out.println("Sample.foo");
}
}
referans sayacı algoritması ve garbage collected ilişkisi
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte Sample türünden bir referans dolaylı da olsa Mample sınıfına bağlandığından referans sayacı bir artırılmış olur. Örnekteki ikinci Sample nesnesi yaratıldığında ilki kopartılıp ikincisi bağlanmış olur. Bu durumda ilk Sample nesnesi "garbage collected" duruma gelir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Mamplemample = newMample();
newSample().foo(mample);
newSample().foo(mample);
}
}
classMample {
privateSamplem_sample;
publicvoidsetSample(Samples)
{
m_sample = s;
}
}
classSample {
publicvoidfoo(Mamplemample)
{
mample.setSample(this);
System.out.println("Sample.foo");
}
}
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte Sample türünden bir referans dolaylı da olsa Mample sınıfına bağlandığından referans sayacı bir artırılmış olur. Örnekteki ikinci Sample nesnesi yaratıldığında ilki kopartılıp ikincisi bağlanmış olur. Bu durumda ilk Sample nesnesi "garbage collected" duruma gelir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Mamplemample = newMample();
newSample().foo(mample);
//...newSample().foo(mample);
}
}
classMample {
privateSamplem_sample;
publicvoidsetSample(Samples)
{
//...m_sample = s;
}
//...
}
classSample {
publicvoidfoo(Mamplemample)
{
mample.setSample(this);
System.out.println("Sample.foo");
}
}
Aşağıdaki örnekte anonim sınıf nesneleri Mample sınıfına bağlanmıştır
Anonim sınıflar içerisinde kendisinden önce bildirilen yerel ve parametre değişkenleri kullanılabilir (capture)
/*---------------------------------------------------------------------------------------------------------------------- Anonim sınıflar içerisinde kendisinden önce bildirilen yerel ve parametre değişkenleri kullanılabilir (capture) Yine burada yakalanan yerel değişkenler ve parametre değişkenleri final kabul edilir (effectively final)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Mamplemample = newMample();
mample.bar(30, 10);
}
}
classMample {
publicvoidbar(inta, intb)
{
Samples = newSample() {
publicvoidfoo(intx)
{
System.out.println(x * a);
}
};
s.foo(b);
}
}
classSample {
publicvoidfoo(intx)
{
//...
}
}
Anonim sınıflar içerisinde içerisinde bildirildikleri metodun ait olduğu sınıfın veri elemanlarına doğrudan erişilebilir.
/*---------------------------------------------------------------------------------------------------------------------- Anonim sınıflar içerisinde içerisinde bildirildikleri metodun ait olduğu sınıfın veri elemanlarına doğrudan erişilebilir. Bu elemanlar erişim durumunda final bildirilmediklerinde final kabul edilmez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Mamplemample = newMample(10);
mample.bar(30);
}
}
classMample {
privateintm_b;
publicMample(intb)
{
m_b = b;
}
publicvoidbar(inta)
{
Samples = newSample() {
publicvoidfoo(intx)
{
System.out.println(x * m_b++);
}
};
s.foo(a);
}
}
classSample {
publicvoidfoo(intx)
{
//...
}
}
Timer sınıfı timer periyodik işlerin yapılmasında kullanılan temel sınıflardan biridir.
/*---------------------------------------------------------------------------------------------------------------------- Timer sınıfı timer periyodik işlerin yapılmasında kullanılan temel sınıflardan biridir. Bu sınıfın scheduleXXX metotları ile ayrı bir akış oluşturulur (thread) ve verilen periyoda göre TimerTask referansı ile verilen referansa ilişkin run metodu çağrılır. Yani aslında Timer sınıfı TimerTask ile verilen periyotta yapılacak işi programcıdan almaktadır. Bu kavrama genel olarak "callback" denir. Timer sınıfına ilişkin diğer detaylar ileride ele alınacaktır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
importjava.util.Timer;
importjava.util.TimerTask;
classApp {
publicstaticvoidmain(String[] args)
{
vart = newTimer();
t.schedule(newTimerTask() {
publicvoidrun()
{
Console.write(".");
}
}, 0, 1000);
}
}
scheduleXXX metotlarının delay parametresi ile timer istenilen zamanda başlatılabilir
/*---------------------------------------------------------------------------------------------------------------------- Sınıf Çalışması: Klavyeden girilen saat ve dakika bilgisine göre o zaman geldiğinde ekrana "Artık uyan" şeklinde bir mesaj veren ve alarmı kapatan, zaman gelene kadar ise ekranda sürekli nokta basan programı yazınız. (İleride Alarm ve AlarmTask sınıfları daha iyi hale getirilecektir)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.samples.alarmapp.AlarmWithoutSecondApp;
classApp {
publicstaticvoidmain(String[] args)
{
AlarmWithoutSecondApp.run();
}
}
packageorg.csystem.samples.alarmapp;
importorg.csystem.util.Console;
importorg.csystem.util.alam.Alarm;
importorg.csystem.util.alam.AlarmTask;
publicclassAlarmWithoutSecondApp {
privateAlarmWithoutSecondApp() {}
publicstaticvoidrun()
{
varhour = Console.readInt("Saati giriniz:");
varminute = Console.readInt("Dakikayı giriniz:");
Alarmalarm = newAlarm(hour, minute);
varperiodTask = newAlarmTask() {
publicvoidrun()
{
Console.write(".");
}
};
varalarmTask = newAlarmTask() {
publicvoidrun()
{
Console.writeLine("\nArtık uyan");
}
};
alarm.run(periodTask, alarmTask);
}
}
Anonim sınıf nesneleri yaratılırken kullanılan ctor ile super ctor sentaksı kullanılmış olur.
/*---------------------------------------------------------------------------------------------------------------------- Anonim sınıf nesneleri yaratılırken kullanılan ctor ile super ctor sentaksı kullanılmış olur. Yani aşağıdaki örnekte A sınıfı ile anonim bildirimi neredeyse aynıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samplesample = newSample(10) {/*...*/};
SamplesampleA = newA();
}
}
classAextendsSample {
publicA()
{
super(10);
//...
}
}
classSample {
//...protectedSample(intval)
{
System.out.println("Sample.Sample(int)");
}
//...
}
Sınıf Çalışması: Aşağıda açıklanan Scheduler isimli sınıfı yazınız.
/*---------------------------------------------------------------------------------------------------------------------- Sınıf Çalışması: Aşağıda açıklanan Scheduler isimli sınıfı yazınız. Açıklamalar: - Sınıf Timer sınıfına benzemekle birlikte gecikme ve periyod elemanlarını TimeUnit ile birlikte alacaktır - Sınıf her periyota ne yapacağını yine TimerTask sınıfı ile alacaktır. - Sınıf ayrıca başka bir TimerTask ile timer sonlandrırılsa ne yapacağı bilgisini de alabilecektir - Sınıf ile tek bir schedule işlemi yapılabilecektir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
importorg.csystem.util.Scheduler;
importjava.util.TimerTask;
importjava.util.concurrent.TimeUnit;
classApp {
publicstaticvoidmain(String[] args)
{
varscheduler = newScheduler(2, 1, TimeUnit.SECONDS);
varcount = 5;
vartimerTask = newTimerTask() {
privateintm_count;
publicvoidrun()
{
++m_count;
Console.write(".");
if (m_count == count)
scheduler.cancel();
}
};
varcancelTask = newTimerTask() {
publicvoidrun()
{
Console.writeLine("\nCancelled");
}
};
scheduler.schedule(timerTask, cancelTask);
}
}
packageorg.csystem.app;
importorg.csystem.util.Console;
importorg.csystem.util.Scheduler;
importjava.util.TimerTask;
importjava.util.concurrent.TimeUnit;
classApp {
publicstaticvoidmain(String[] args)
{
varscheduler = newScheduler(1, TimeUnit.SECONDS);
vartimerTask = newTimerTask() {
publicvoidrun()
{
Console.write(".");
}
};
scheduler.schedule(timerTask);
}
}