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
print ve println metotlarının Object parametreli overload'ları ekrana basacakları yazı için toString metodunu çağırır (2)
/*---------------------------------------------------------------------------------------------------------------------- print ve println metotlarının Object parametreli overload'ları ekrana basacakları yazı için toString metodunu çağırır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.math.Rational;
classApp {
publicstaticvoidmain(String [] args)
{
Rationalr = newRational(3, 4);
System.out.println(r);
}
}
print ve println metotlarının Object parametreli overload'ları ekrana basacakları yazı için toString metodunu çağırır (3)
/*---------------------------------------------------------------------------------------------------------------------- printf metodu (dolayısıyla String sınıfının format metodu) s format karakterine karşılık gelen yazı için toString metodunu çağırır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.math.Rational;
classApp {
publicstaticvoidmain(String [] args)
{
Rationalr = newRational(3, 4);
System.out.printf("Kesir:%s%n", r);
}
}
Aşağıdaki örnekte yazıya dönüştürme öncesinde auto-boxing yapılır, sonra toString metodu çağrılır. Şüphesiz derleyici buna ilişkin kodu yazar
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte yazıya dönüştürme öncesinde auto-boxing yapılır, sonra toString metodu çağrılır. Şüphesiz derleyici buna ilişkin kodu yazar----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
intval = 10;
Stringstr = "Değer:" + val; // "Değer:" + Integer.valueOf(val).toString();System.out.println(str);
}
}
Aşağıdaki örnekte r referansı için toString çağrılarak yazı elde edilir
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte r referansı için toString çağrılarak yazı elde edilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.math.Rational;
classApp {
publicstaticvoidmain(String [] args)
{
Rationalr = newRational(3, 4);
Stringstr = "Kesir:" + r; //"Kesir:" + r.toString();System.out.println(str);
}
}
printf (dolayısıyla String.format) metodu için s format karakteri temel türler için de kullanılabilir.
/*---------------------------------------------------------------------------------------------------------------------- printf (dolayısıyla String.format) metodu için s format karakteri temel türler için de kullanılabilir. Bu durumda yine toString metodu çağrılacaktır. Şüphesiz temel bir tür printf metoduna verildiğinde Object ataması dolayısyla atama sırasında yine otomatik kutulama yapılacaktır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
inta = 10;
doubleb = 20;
System.out.printf("a=%s, b=%s%n", a, b);
}
}
/*---------------------------------------------------------------------------------------------------------------------- Bazı durumlarda bir sınıf bir kavramı soyut olarak temsil ediyor olabilir. Bu durumda sınıfın tek başına anlamı yoktur. Yani nesne yönelimli programlama bakış açısıyla o sınıf türünden nesnenin anlamı yoktur. Ancak o sınıftan türeyen sınıfların nesne olarak anlamı vardır. Bu tarz sınıflara soyut (abstract) sınıflar denir. Soyut olmayan sınıflara da somut (concrete) sınıflar denir. Bu tip durumlarda sınıfın soyut (abstract) bildirilmesi daha uygundur.Örneğin CompanyApp uygulamasında Employee sınıfı tek başına anlamlı değildir ancak soyut olarak "çalışan kavramını" temsil eder. Employee sınıfından türetilen sınıflar nesne olarak anlamlıdır. Yani Employee sınıfından türemil olan sınıflar somut (concrete) sınıflardır.----------------------------------------------------------------------------------------------------------------------*/
Soyut bir sınıf abstract anahtar sözcüğü ile bildirilir
/*---------------------------------------------------------------------------------------------------------------------- Soyut bir sınıf abstract anahtar sözcüğü ile bildirilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
abstractclassSample {
//...
}
Bir sınıfın abstract metotları olabilir. abstract metotlar gövdesi olmayan metotlardır.
/*---------------------------------------------------------------------------------------------------------------------- Bir sınıfın abstract metotları olabilir. abstract metotlar gövdesi olmayan metotlardır. Bu metotlara gövde yazımı error oluşturur. abstract metotlar abstract anahtar sözcüğü ile bildirilir. Bu metotlar sanaldır. Dolayısıyla override edilebilir. En az bir tane abstract metodu olan bir sınıf abstract olarak bildirilmelidir. Aksi durumda error oluşur. Dikkat edilirse abstract bir sınıfın abstract bir metodu olmak zorunda değildir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
abstractclassA {
publicabstractvoidfoo() //error
{
}
}
classMample { //errorpublicabstractvoidbar();
}
abstractclassSample {
publicabstractvoidfoo();
publicabstractvoidtar();
publicvoidbar()
{}
}
abstractclassTest {
//...
}
abstract sınıf türünden bir nesne new operatörü ile yaratılamaz. new işlemi sınıf içerisinde de yapılamaz
/*---------------------------------------------------------------------------------------------------------------------- abstract sınıf türünden bir nesne new operatörü ile yaratılamaz. new işlemi sınıf içerisinde de yapılamaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Samples = newSample(); //error
}
}
abstractclassSample {
publicabstractvoidfoo();
publicabstractvoidtar();
publicvoidbar()
{
Samples = newSample(); //error
}
}
abstract sınıfların da non-static veri elemanları olabilir. abstract sınıfların abstract olmayan metotları da olabilir
/*---------------------------------------------------------------------------------------------------------------------- abstract sınıfların da non-static veri elemanları olabilir. abstract sınıfların abstract olmayan metotları da olabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
abstractclassSample {
privateintm_x;
publicabstractvoidfoo();
publicabstractvoidtar();
publicvoidbar()
{
}
}
abstract bir sınıftan türetilmiş olan bir sınıf taban sınıfının en az bir tane abstract metodunu override etmezse türemiş sınıf da abstract olarak bildirilmek zorundadır.
/*---------------------------------------------------------------------------------------------------------------------- abstract bir sınıftan türetilmiş olan bir sınıf taban sınıfının en az bir tane abstract metodunu override etmezse türemiş sınıf da abstract olarak bildirilmek zorundadır. Sınıf içerisinde hiç abstract metot kalmadıysa bu durumda sınıf concrete olabilir. Şüphesiz aşağıdaki örnekte E sınıfının A'nın tüm metotlarını override etmiş olmasına rağmen conrete olma zorunluluğu yoktur----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
abstractclassEextendsA {
publicvoidfoo()
{
//...
}
publicvoidbar()
{
//...
}
}
classCextendsA {
publicvoidfoo()
{
//...
}
publicvoidbar()
{
//...
}
}
abstractclassDextendsA {
publicvoidfoo()
{
//...
}
}
classBextendsA { //errorpublicvoidfoo()
{
//...
}
}
abstractclassA {
publicabstractvoidfoo();
publicabstractvoidbar();
//...
}
Aşağıdaki durumda C sınıfında artık hiç abstract metot kalmadığından concrete olabilir
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki durumda C sınıfında artık hiç abstract metot kalmadığından concrete olabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classCextendsB {
publicvoidbar()
{
//...
}
}
abstractclassBextendsA {
publicvoidfoo()
{
//...
}
}
abstractclassA {
publicabstractvoidfoo();
publicabstractvoidbar();
//...
}
abstract sınıf referanslarının taban sınıf referansı olarak kullanımı anlamlıdır. Bu durumda polymoprhism' de abstract sınıflarla yapılabilir
/*---------------------------------------------------------------------------------------------------------------------- abstract sınıf referanslarının taban sınıf referansı olarak kullanımı anlamlıdır. Bu durumda polymoprhism' de abstract sınıflarla yapılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newC();
x.foo();
x.bar();
}
}
classCextendsB {
publicvoidbar()
{
System.out.println("C.bar");
}
}
abstractclassBextendsA {
publicvoidfoo()
{
System.out.println("B.foo");
}
}
abstractclassA {
publicabstractvoidfoo();
publicabstractvoidbar();
}
abstract sınıflarda ctor olabilir. abstract sınıfların ctor'larının public yapılması anlamsızdır.
/*---------------------------------------------------------------------------------------------------------------------- abstract sınıflarda ctor olabilir. abstract sınıfların ctor'larının public yapılması anlamsızdır. public yerine protected yapılması okunabilirlik açısından daha uygundur. private ve no-modifier erişimcilerin ctor açısından anlamı olabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Bb = newB(10, 20);
//..
}
}
classBextendsA {
privateintm_y;
publicB(intx, inty)
{
super(x);
m_y = y;
}
publicvoidfoo()
{
}
}
abstractclassA {
privateintm_x;
privateA()
{
//...
}
protectedA(intx)
{
this();
m_x = x;
}
publicintgetX()
{
returnm_x;
}
publicvoidsetX(intx)
{
m_x = x;
}
publicabstractvoidfoo();
}
CompanyApp örneğindeki Employee sınıfının calculatePayment metodunun abstract yapılması daha uygundur.
Parser uygulamasında da Source sınıfının artık abstract sınıf olması ve getChar metodunun da abstract olarak bildirilmesi uygundur.
/*---------------------------------------------------------------------------------------------------------------------- Parser uygulamasında da Source sınıfının artık abstract sınıf olması ve getChar metodunun da abstract olarak bildirilmesi uygundur. İleride bu sınıf daha iyi tasarlanacaktır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app.samples.parserapp;
publicabstractclassSource {
publicabstractintgetChar();
}
abstract sınıflar final olarak bildirilemez
/*---------------------------------------------------------------------------------------------------------------------- abstract sınıflar final olarak bildirilemez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
abstractfinalclassA { //error
}
Şüphesiz bir sınıf başka bir sınıftan türetilip abstract olmıyacaksa final bildirilebilir
/*---------------------------------------------------------------------------------------------------------------------- Şüphesiz bir sınıf başka bir sınıftan türetilip abstract olmıyacaksa final bildirilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
finalclassBextendsA {
//...
}
abstractclassA {
//...
}
override işleminde erişim belirleyici erişim anlamında yükseltilebilir ancak düşürülemez.
/*---------------------------------------------------------------------------------------------------------------------- override işleminde erişim belirleyici erişim anlamında yükseltilebilir ancak düşürülemez. Bu durumda public bir sanal metot public olarak override edilmek zorundadır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classBextendsA {
protectedvoidfoo() //error
{
}
}
abstractclassA {
publicabstractvoidfoo();
}
/*---------------------------------------------------------------------------------------------------------------------- override işleminde erişim belirleyici erişim anlamnında yükseltilebilir. Ancak bu durumda aşağıdaki gibi sınıfların da paket anlamında uygun yerlerinde olması gerekir. Erişim belirleyicilerinin anlamlarını hatırlayınız----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importtest.B;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newB();
x.foo();
}
}
packagetest;
importorg.csystem.app.A;
publicclassBextendsA {
publicvoidfoo()
{
System.out.println("B.foo");
}
}
packagetest;
importorg.csystem.app.A;
publicclassBextendsA {
publicvoidfoo()
{
System.out.println("B.foo");
}
}
final olarak bildirilmiş bir metot sanal değildir. Override edilemez
/*---------------------------------------------------------------------------------------------------------------------- final olarak bildirilmiş bir metot sanal değildir. Override edilemez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classBextendsA {
publicvoidfoo() //error
{
}
}
classA {
publicfinalvoidfoo()
{
}
}
final olarak bildirilmiş bir metot sanal değildir.
/*---------------------------------------------------------------------------------------------------------------------- final olarak bildirilmiş bir metot sanal değildir. Override edilemez. Aşağıdaki örnekte B sınıfı foo metodunu override etmiştir. B foo'nun sanallığını kaldırdığında C sınıfında foo override edilemez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classCextendsB {
publicvoidfoo() //error
{}
}
classBextendsA {
publicfinalvoidfoo()
{
}
}
abstractclassA {
publicabstractvoidfoo();
}
Java' da static bir metot türemiş sınıfta aynı geri dönüş değeri ve aynı imza ile ve erişim belirleyiciyi düşürmemek şartıyla yazılabilir.
/*---------------------------------------------------------------------------------------------------------------------- Java' da static bir metot türemiş sınıfta aynı geri dönüş değeri ve aynı imza ile ve erişim belirleyiciyi düşürmemek şartıyla yazılabilir. Bu durumda metot hangi sınıf ismi ile çağrılıyorsa o sınıfın metodu çağrılır. Bu durum her ne kadar override işlemini andırsa da "override" dendiğinde non-static bir metot anlaşılır. static metotlar için bu işleme bazı kaynaklar "static override" derler. Ancak unutulmamalıdır ki "override" non-static metotlar ve polymorphism için anlamlıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
A.foo();
B.foo();
}
}
classBextendsA {
publicstaticvoidfoo()
{
System.out.println("B.foo");
}
}
classA {
publicstaticvoidfoo()
{
System.out.println("A.foo");
}
}
Aşağıdaki örnekte B sınıfının foo metodu içerisinde A sınıfının foo metodu çağrılmıştır
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte B sınıfının foo metodu içerisinde A sınıfının foo metodu çağrılmıştır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
A.foo();
B.foo();
}
}
classBextendsA {
publicstaticvoidfoo()
{
System.out.println("B.foo");
A.foo();
}
}
classA {
publicstaticvoidfoo()
{
System.out.println("A.foo");
}
}
Aşağıdaki örnekte x A türünden olduğundan ve foo' da static olduğundan A'nın foo metodu çağrılır.
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte x A türünden olduğundan ve foo' da static olduğundan A'nın foo metodu çağrılır. static bir metodun referans ile çağrılmasının sınıf ismi ile çağrılmasından farkı olmadığını hatırlayınız----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newB();
x.foo();
}
}
classBextendsA {
publicstaticvoidfoo()
{
System.out.println("B.foo");
}
}
classA {
publicstaticvoidfoo()
{
System.out.println("A.foo");
}
}
/*---------------------------------------------------------------------------------------------------------------------- Exception İşlemleri: Exception programlamada genel olarak çalışma zamanında oluşan hatalara denir. Ancak bazen bir exeception hata durumuna ilişkin olmayabilir. Exception oluştuğunda programın nasıl devam edeceğinin belirlenmesine "exception handling" denir. Örneğin, bir yön bulma uygulamasında uygulamanın GPS sensöründen bilgi alamaması durumu bir exception durumudur. Bu durumda program bunu kullanıcıya belirterek uygulamanın devam etmesini sağlayabilir. Java' da exception işlemleri için aşağıdaki anahtar sözcükler kullanılır: try, catch, throw, finally, throws Bir exception throw anahtar sözcüğü ile fırlatılabilir. throw anahtar sözcüğünün genel biçimi şöyledir: throw <referans>; throw anahtar sözcüğü bir referans alır. throw anahtar sözcüğünün aldığı referansın Throwable sınıfından doğrudan ya da dolaylı olarak türemiş bir sınıf türünden olması gerekir. Bir exception fırlatıldığında akış exception'ın fırlatıldığı metottan çıkar. Bir exception yakalanamaz ise bu durumda exception ın fırlatıldığı akış (thread) sonlanır. Akış exception bakımından ele alınacaksa (handling) try bloğu içerisinde yazılmalıdır. try bloğu catch bloğu veya blokları veya tek başına finally bloğu veya catch blokları ve finally bloğu ile devam edebilir. try bloğu tek başına olamaz. try bloğu tüm diğer blokları ile birlikte tek bir deyimdir. try bloğu ile birlikte bulunan diğer bloklar arasında herhangi bir deyim yazılamaz. catch bloğunun parantezi içerisinde yazılan parametreye catch parametresi denir. catch parametresine ilişkin türün bir exception sınıfı yani Throwable'dan doğrudan ya da dolaylı olarak türetilmiş bir sınıf türünden olması gerekir. Exception oluşursa (fırlatılırsa) akış try bloğundan bir daha geri dönmemek üzere (non-resumptive) catch bloklarına sıçrar. catch blokları yukarıdan aşağıya switch deyimi gibi teker teker kontrol edilir. Uygun catch bloğu bulunursa o catch bloğu çalıştırılır. Uygun catch bloğu fırlatılan exception nesnesinin adresinin (referansının) ilgili catch parametresine doğrudan atanabildiği ilk catch bloğudur. Exception yakalanırsa yakalanan catch bloğuna ilişkin kodlar çalıştırılır. Kodlar bitince tüm diğer catch blokları atlanarak akış devam eder. Eğer exception hiç yakalanamazsa akış çöker. Yani bir catch bloğu çalıştırılırsa diğer catch blokları çalıştırılmaz. try bloğu exception oluşmadan sonlanırsa tüm catch blokları atlanarak akış devam eder.----------------------------------------------------------------------------------------------------------------------*/
Aşağıdaki örnekte MyException sınıfı doğrudan ya da dolaylı olarak Throwable sınıfından türetilmediği için throw' a referans olarak verilemez
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte MyException sınıfı doğrudan ya da dolaylı olarak Throwable sınıfından türetilmediği için throw' a referans olarak verilemez----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classMathUtil {
publicstaticdoublemyLog(doubleval)
{
if (val <= 0) {
MyExceptionex = newMyException();
throwex; //error
}
//...
}
}
classMyException {
}