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
Sınıf içerisinde enum bildirimlerinin static veya non-static olmasının bir farklı yoktur.
/*---------------------------------------------------------------------------------------------------------------------- Sınıf içerisinde enum bildirimlerinin static veya non-static olmasının bir farklı yoktur. Çünkü hatırlanacağı gibi enum türünden nesne new operatörü ile hiç bir şekilde ve hiç bir yerde yaratılamaz----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
vars = newSample();
s.foo(2);
//..
}
}
classSample {
privatestaticenumColor {RED, GREEN, BLUE} //static yazılmasa da aynı şeypublicvoidfoo(intval)
{
Colorc = val < 0 || val > 2 ? Color.RED : Color.values()[val];
System.out.println(c.toString());
}
}
Aşağıdaki örnekte Figther sınıfına int türden yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotları da değiştirilmek zorundadır.
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte Figther sınıfına int türden yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotları da değiştirilmek zorundadır. Şüphesiz ctor'da aşağıdaki örnekte değiştirilmelidir ancak gerekirse bir AlertDialog örneğindeki gibi static bir sınıf ile bu durum kodları değişse bile bu sınıfı kullanan programcıya farkettirilmez. Problem: Aşağıdaki sınıfa yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotlarını değiştirmek zorunda kalmayacak şekilde sınıfı yeniden yazınız. Bu problemde ctor önemli değildir. İstenirse sadece default ctor da bırakılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
//...
}
}
classFighter {
privateStringm_name;
privateintm_health;
privateintm_agility;
privateintm_intelligence;
publicFighter(Stringname, inthealth, intagility, intintelligence)
{
m_name = name;
m_health = health;
m_agility = agility;
m_intelligence = intelligence;
}
publicStringgetName()
{
returnm_name;
}
publicvoidsetName(Stringname)
{
m_name = name;
}
publicintgetHealth()
{
returnm_health;
}
publicvoidsetHealth(inthealth)
{
m_health = health;
}
publicintgetAgility()
{
returnm_agility;
}
publicvoidsetAgility(intagility)
{
m_agility = agility;
}
publicintgetIntelligence()
{
returnm_intelligence;
}
publicvoidsetIntelligence(intintelligence)
{
m_intelligence = intelligence;
}
publicintsumOfAbilities()
{
returnm_agility + m_health + m_intelligence;
}
publicdoubleaverageOfAbilities()
{
returnsumOfAbilities() / 3.;
}
}
Problem: Aşağıdaki sınıfa yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotlarını değiştirmek zorunda kalmayacak şekilde sınıfı yeniden yazınız.
/*---------------------------------------------------------------------------------------------------------------------- Problem: Aşağıdaki sınıfa yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotlarını değiştirmek zorunda kalmayacak şekilde sınıfı yeniden yazınız. Bu problemde ctor önemli değildir. İstenirse sadece default ctor da bırakılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Fighterfighter = newFighter("Ali", 78, 90, 100, 67);
System.out.printf("Sum of Abilities:%d%n", fighter.sumOfAbilities());
System.out.printf("Average of Abilities:%f%n", fighter.averageOfAbilities());
}
}
classFighter {
privateStringm_name;
privatefinalint [] m_abilities;
privateenumABILITY {HEALTH, STRENGTH, AGILITY, INTELLIGENCE}
publicFighter(Stringname, inthealth, intagility, intintelligence, intstrength)
{
m_name = name;
m_abilities = newint[ABILITY.values().length];
setHealth(health);
setAgility(agility);
setIntelligence(intelligence);
setStrength(strength);
}
publicStringgetName()
{
returnm_name;
}
publicvoidsetName(Stringname)
{
m_name = name;
}
publicintgetHealth()
{
returnm_abilities[ABILITY.HEALTH.ordinal()];
}
publicvoidsetHealth(inthealth)
{
m_abilities[ABILITY.HEALTH.ordinal()] = health;
}
publicintgetAgility()
{
returnm_abilities[ABILITY.AGILITY.ordinal()];
}
publicvoidsetAgility(intagility)
{
m_abilities[ABILITY.AGILITY.ordinal()] = agility;
}
publicintgetIntelligence()
{
returnm_abilities[ABILITY.INTELLIGENCE.ordinal()];
}
publicvoidsetIntelligence(intintelligence)
{
m_abilities[ABILITY.INTELLIGENCE.ordinal()] = intelligence;
}
publicintgetStrength()
{
returnm_abilities[ABILITY.STRENGTH.ordinal()];
}
publicvoidsetStrength(intstrength)
{
m_abilities[ABILITY.STRENGTH.ordinal()] = strength;
}
publicintsumOfAbilities()
{
intsum = 0;
for (varval : m_abilities)
sum += val;
returnsum;
}
publicdoubleaverageOfAbilities()
{
return (double)sumOfAbilities() / m_abilities.length;
}
}
Problem: Aşağıdaki sınıfa yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotlarını değiştirmek zorunda kalmayacak şekilde sınıfı yeniden yazınız.
/*---------------------------------------------------------------------------------------------------------------------- Problem: Aşağıdaki sınıfa yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotlarını değiştirmek zorunda kalmayacak şekilde sınıfı yeniden yazınız. Bu problemde ctor önemli değildir. İstenirse sadece default ctor da bırakılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Fighterfighter = newFighter("Ali", 78, 90, 100, 67);
System.out.printf("Sum of Abilities:%d%n", fighter.sumOfAbilities());
System.out.printf("Average of Abilities:%f%n", fighter.averageOfAbilities());
}
}
classFighter {
privateStringm_name;
privatefinalint [] m_abilities;
privateenumABILITY {HEALTH, STRENGTH, AGILITY, INTELLIGENCE, COUNT}
publicFighter(Stringname, inthealth, intagility, intintelligence, intstrength)
{
m_name = name;
m_abilities = newint[ABILITY.COUNT.ordinal()];
setHealth(health);
setAgility(agility);
setIntelligence(intelligence);
setStrength(strength);
}
publicStringgetName()
{
returnm_name;
}
publicvoidsetName(Stringname)
{
m_name = name;
}
publicintgetHealth()
{
returnm_abilities[ABILITY.HEALTH.ordinal()];
}
publicvoidsetHealth(inthealth)
{
m_abilities[ABILITY.HEALTH.ordinal()] = health;
}
publicintgetAgility()
{
returnm_abilities[ABILITY.AGILITY.ordinal()];
}
publicvoidsetAgility(intagility)
{
m_abilities[ABILITY.AGILITY.ordinal()] = agility;
}
publicintgetIntelligence()
{
returnm_abilities[ABILITY.INTELLIGENCE.ordinal()];
}
publicvoidsetIntelligence(intintelligence)
{
m_abilities[ABILITY.INTELLIGENCE.ordinal()] = intelligence;
}
publicintgetStrength()
{
returnm_abilities[ABILITY.STRENGTH.ordinal()];
}
publicvoidsetStrength(intstrength)
{
m_abilities[ABILITY.STRENGTH.ordinal()] = strength;
}
publicintsumOfAbilities()
{
intsum = 0;
for (varval : m_abilities)
sum += val;
returnsum;
}
publicdoubleaverageOfAbilities()
{
return (double)sumOfAbilities() / m_abilities.length;
}
}
Problem: Aşağıdaki sınıfa yeni bir yetenek eklendiğinde sumOfAbilities ve averageOfAbilities metotlarını değiştirmek zorunda kalmayacak şekilde sınıfı yeniden yazınız.
/*---------------------------------------------------------------------------------------------------------------------- Bir metot içerisinde bildirilen sınıflara yerel sınıflar (local classes) denir. Farklı metotlar içerisinde aynı isimde yerel sınıf bildirimi geçerlidir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
}
}
classSample {
publicvoidfoo()
{
classA {
//...
}
classB {
//...
}
classC {
//...
}
}
publicvoidbar()
{
classA {
//...
}
classB {
//...
}
classC {
//...
}
}
publicvoidtar()
{
classA {
//...
}
classB {
//...
}
classC {
//...
}
}
}
Yerel sınıf isimleri faaliyet alanı bakımından yerel değişkenler ile aynıdır
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıf isimleri faaliyet alanı bakımından yerel değişkenler ile aynıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
}
}
classSample {
publicvoidfoo()
{
classA {
//...
}
Aa = newA();
classB {
publicvoidfoo()
{
}
}
Bb = newB();
b.foo();
}
}
Aynı faaliyet alanı içerisinde aynı isimde yerel sınıf bildirimi geçersizdir
/*---------------------------------------------------------------------------------------------------------------------- Aynı faaliyet alanı içerisinde aynı isimde yerel sınıf bildirimi geçersizdir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
}
}
classSample {
publicvoidfoo()
{
classA {
//...
}
Aa = newA();
classB {
publicvoidfoo()
{
}
}
Bb = newB();
b.foo();
classA { //error
}
}
}
Yerel sınıflar herhangi bir blok içerisinde bildirilebilir
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıflar herhangi bir blok içerisinde bildirilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(5);
}
}
classSample {
publicvoidfoo(intn)
{
for (inti = 0; i < n; ++i) {
classA {
publicvoidfoo()
{
System.out.println("A.foo");
}
}
Ax = newA();
x.foo();
}
}
}
non-static, static ve yerel sınıflar başka bir sınıftan türetilebilir
/*---------------------------------------------------------------------------------------------------------------------- non-static, static ve yerel sınıflar başka bir sınıftan türetilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
}
}
classA {
}
classSample {
publicclassCextendsA {
//...
}
privatestaticclassDextendsA {
//...
}
publicvoidfoo(intn)
{
classBextendsA {
}
}
}
erel bir sınıf başka bir yerel sınıftan türetilebilir. Şüphesiz taban sınıfın türemiş sınıfın bildirildiği yerde görülebilir olması gerekir
/*---------------------------------------------------------------------------------------------------------------------- Yerel bir sınıf başka bir yerel sınıftan türetilebilir. Şüphesiz taban sınıfın türemiş sınıfın bildirildiği yerde görülebilir olması gerekir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String[] args)
{
}
}
classSample {
publicvoidfoo(intn)
{
classA {
}
//...classBextendsA {
}
}
}
Yerel bir sınıf içerisinde kendisinden önce bildirilen yerel değişkenler ve parametre değişkenleri kullanılabilir (capture)
/*---------------------------------------------------------------------------------------------------------------------- Yerel bir sınıf içerisinde kendisinden önce bildirilen yerel değişkenler ve parametre değişkenleri kullanılabilir (capture)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(20);
}
}
classSample {
publicvoidfoo(intval)
{
inta = Console.readInt("Bir sayı giriniz:");
classA {
publicvoidbar(intb)
{
Console.writeLine(a + b + val);
}
}
Ax = newA();
x.bar(10);
}
}
Yerel bir sınıf içerisinde kendisinden önce bildirilen yerel değişkenler ve parametre değişkenleri kullanılabilir (capture)
/*---------------------------------------------------------------------------------------------------------------------- Yerel bir sınıf içerisinde kendisinden önce bildirilen yerel değişkenler ve parametre değişkenleri kullanılabilir (capture)----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(20);
}
}
classSample {
publicvoidfoo(intval)
{
classUtil {
privatefinalintm_value;
publicUtil(intvalue)
{
m_value = value;
}
publicbooleanisEven()
{
returnval % 2 == 0;
}
publicintgetTotal()
{
returnm_value + val;
}
}
Utilutil = newUtil(10);
Console.writeLine(util.isEven() ? "Çift" : "Tek");
Console.writeLine("Toplam:%d", util.getTotal());
}
}
yerel ya da parametre değişkeni ya yakalandığında değiştirilemez, ya da değiştirilse yakalanamaz
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıflar içerisinde yakalanan yerel veya parametre değişkenleri faaliyet alanı içerisinde tek bir değer alabilirler. Yani yakalanmış değişkenlerin değerleri faaliyet alanları içerisinde hiçbiryerde değiştirilemez. Java 8 ile birlikte yakalanmış olan yerel veya parametre değişkenlerine "effectively final" değişkenler denir. Yani bu değişkenler yakalandıklarında final bildirilmiş kabul edilirler. Java8 öncesinde yakalanan yerel veya parametre değişkenlerinin final olarak bildirilmesi zorunluydu Yani özetle, yerel ya da parametre değişkeni ya yakalandığında değiştirilemez, ya da değiştirilse yakalanamaz Anahtar Notlar: Yerel değişkenlerin yakalanabilmesi yalnızca yerel sınıflara özgü değildir. Anonim sınıflarda ve Lambda ifadelerinde de yakalanabilir. Yukarıdaki anlatılan durumlar tamamen aynıdır. Anonim sınıflar ve Lambda ifadeleri ileride ele alınacaktır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo(20);
}
}
classSample {
publicvoidfoo(intval)
{
inta = Console.readInt("Birinci sayı giriniz:");
intb = Console.readInt("İkinci sayı giriniz:");
b++;
classUtil {
publicbooleanisEven() {return (val + a++) % 2 == 0;} //errorpublicbooleanisOdd() {return (val + b) % 2 == 0;} //error//...
}
b = 10;
varutil = newUtil();
Console.writeLine(util.isEven() ? "Çift" : "Tek");
}
}
Yerel sınıflar içerisinde (anonim sınıflar ve lambda ifadelerinde de) sınıf veri elemanları yakalanablir ve değiştirilebilir!
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıflar içerisinde (anonim sınıflar ve lambda ifadelerinde de) sınıf veri elemanları yakalanablir ve değiştirilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Sample.foo();
Console.writeLine("value:%d", Sample.getVal());
}
}
classSample {
privatestaticintms_val;
publicstaticintgetVal()
{
returnms_val;
}
publicstaticvoidfoo()
{
ms_val = Console.readInt("Bir sayı giriniz:");
classUtil {
publicbooleanisEven() {returnms_val++ % 2 == 0;}
//...
}
varutil = newUtil();
Console.writeLine(util.isEven() ? "Çift" : "Tek");
}
}
Yerel sınıflar içerisinde (anonim sınıflar ve lambda ifadelerinde de) sınıf veri elemanları yakalanablir ve değiştirilebilir
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıflar içerisinde (anonim sınıflar ve lambda ifadelerinde de) sınıf veri elemanları yakalanablir ve değiştirilebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Samples = newSample();
s.foo();
Console.writeLine("value:%d", s.getVal());
}
}
classSample {
privateintm_val;
publicintgetVal()
{
returnm_val;
}
publicvoidfoo()
{
m_val = Console.readInt("Bir sayı giriniz:");
classUtil {
publicbooleanisEven() {returnm_val++ % 2 == 0;}
//...
}
varutil = newUtil();
Console.writeLine(util.isEven() ? "Çift" : "Tek");
}
}
Yerel sınıflar aşağıdaki gibi basit testlerde kullanılabilir.
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıflar aşağıdaki gibi basit testlerde kullanılabilir. Şüphesiz aşağıdaki testi daha iyi yapabilecek araçlar vardır. Bunlar ileride ele alınacaktır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Samplesample = newSample(10);
sample.displayResult(10);
}
}
classSampleTest {
publicstaticvoidtest(intval)
{
classTestUtil {
publicbooleanisNegative()
{
returnval < 0;
}
}
vartestUtil = newTestUtil();
if (testUtil.isNegative()) {
Console.Error.writeLine("Invalid value");
System.exit(-1);
}
Console.writeLine("OK...");
}
}
classSample {
privatestaticfinalbooleanTEST = false;
privatestaticintm_val;
publicSample(intval)
{
m_val = val;
}
privatevoiddisplayPow(intn)
{
if (TEST)
SampleTest.test(n);
Console.writeLine(Math.pow(m_val, n));
}
publicvoiddisplayResult(intn)
{
if (n >= 0)
displayPow(n);
elseSystem.out.println("Geçersiz değer");
}
}
Yerel sınıflar aşağıdaki gibi basit testlerde kullanılabilir.
/*---------------------------------------------------------------------------------------------------------------------- Yerel sınıflar aşağıdaki gibi basit testlerde kullanılabilir. Şüphesiz aşağıdaki testi daha iyi yapabilecek araçlar vardır. Bunlar ileride ele alınacaktır. Aşağıdaki kodu açıklanan biçimlerde derleyip üretilen veya üretilmeyen byte code'ları gözlemleyiniz: 1. TEST == true ve final ise 2. TEST == false ve final ise 3. TEST == true ve final değilse 4. TEST == false ve final değilse Burada TEST == false ve final ise TestUtil sınıfı için arakod üretilmeyecektir. Çünkü TEST her zaman false olacak ve final olduğu için de TEST hiç bir zaman değiştirilemeyecektir. Bu durumda if (TEST) { //... } kodunun arakoda dahil edilmesi gereksiz olacaktır. Derleyici de bu gereksiz kodu dahil etmeyecektir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importorg.csystem.util.Console;
classApp {
publicstaticvoidmain(String[] args)
{
Samplesample = newSample(10);
sample.displayResult(10);
}
}
classSample {
privatestaticfinalbooleanTEST = false;
privatestaticintm_val;
publicSample(intval)
{
m_val = val;
}
privatevoiddisplayPow(intn)
{
if (TEST) {
classTestUtil {
publicbooleanisNegative()
{
returnn < 0;
}
}
vartestUtil = newTestUtil();
if (testUtil.isNegative()) {
Console.Error.writeLine("Invalid value");
System.exit(-1);
}
Console.writeLine("OK...");
}
Console.writeLine(Math.pow(m_val, n));
}
publicvoiddisplayResult(intn)
{
if (n >= 0)
displayPow(n);
elseSystem.out.println("Geçersiz değer");
}
}