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
Farklı enum'lar için equals metodu false değerini döndürür
/*---------------------------------------------------------------------------------------------------------------------- 12.09.2020 enum türünün equals metodu ile farklı türden enum class'lar kullanılabilir. Bu durum equals metodunun parametresinin türünün Object olmasından kaynaklanır. Bu işlemin nasıl yapılabildiği ve Object sınıfı ileride ele alınacaktır. Farklı enum'lar için equals metodu false değerini döndürür----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Colorcolor = Color.BLUE;
MartialStatusmartialStatus = MartialStatus.DIVORCED;
System.out.println(color.equals(martialStatus));
}
}
enumColor {RED, GREEN, BLUE}
enumMartialStatus {MARRIED, SINGLE, DIVORCED}
Aynı durum compareTo metodu için geçerli değildir.
/*---------------------------------------------------------------------------------------------------------------------- Aynı durum compareTo metodu için geçerli değildir. Çünkü compareTo metodunun parametresi aynı enum türündendir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Colorcolor = Color.BLUE;
MartialStatusmartialStatus = MartialStatus.DIVORCED;
System.out.println(color.compareTo(martialStatus)); //error
}
}
enumColor {RED, GREEN, BLUE}
enumMartialStatus {MARRIED, SINGLE, DIVORCED}
enum türleri switch deyimi ile de kullanılabilmektedir.
/*---------------------------------------------------------------------------------------------------------------------- enum türleri switch deyimi ile de kullanılabilmektedir. Bu durumda case bölümlerine ilişkin sabitler şüphesiz ilgili enum türünden sabitler olmalıdır. Karşılaştırma işlemi == operatörü ile yapılır. case bölümlerine yazılan sabitlerde enum class ismi kullanımı geçersizdir. Sabit isimleri case bölümlerinde enum class'lar için doğrudan kullanılmalıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
importjava.util.Scanner;
classApp {
publicstaticvoidmain(String [] args)
{
Scannerkb = newScanner(System.in);
System.out.print("Input marital status:");
StringmaritalStatusStr = kb.nextLine();
MaritalStatusmaritalStatus = MaritalStatus.valueOf(maritalStatusStr.toUpperCase());
switch (maritalStatus) {
caseMARRIED:
System.out.println("Evli");
break;
caseSINGLE:
System.out.println("Bekar");
break;
caseDIVORCED:
System.out.println("Boşanmış");
break;
}
System.out.println("Tekrar yapıyor musunuz?");
}
}
enumMaritalStatus {MARRIED, SINGLE, DIVORCED}
Aşağıdaki örnekte split metodu daha kolay kullanılır hale getirilmiştir.
/*---------------------------------------------------------------------------------------------------------------------- Aşağıdaki örnekte split metodu daha kolay kullanılır hale getirilmiştir. İlgili metot StringUtil sınıfına da eklenmiştir.----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Stringstr = "bugün hava çok güzel. Bu güzel havada [evde] mi otururulur";
String [] words = Util.split(str, " .][", StringSplitOptions.REMOVE_EMPTY_ENTRIES);
for (Stringword : words)
System.out.println(word);
}
}
enumStringSplitOptions {NONE, REMOVE_EMPTY_ENTRIES}
classUtil {
publicstaticString [] split(Stringstr, Stringdelimiters, StringSplitOptionsstringSplitOptions) // Bazı az kulanılan detaylar gözmezden gelindi
{
Stringpattern = "[";
intlength = delimiters.length();
for (inti = 0; i < length; ++i) {
chardelim = delimiters.charAt(i);
pattern += delim == '[' || delim == ']' ? "\\" + delim : delim;
}
pattern += stringSplitOptions == StringSplitOptions.REMOVE_EMPTY_ENTRIES ? "]+" : "]";
returnstr.split(pattern);
}
}
/*---------------------------------------------------------------------------------------------------------------------- Sınıflararası ilişkiler: Sınıflararası ilişkiler aslında nesneler arasındaki ilişkisi temsil eder. Örneğin araba ile motoru arasında bir ilişki vardır. İnsan ile o kişiye ait olan kimliği arasında bir ilişki vardır. Örneklerde görüldüğü gibi aslında ilişkiler nesneler arasındadır. Ancak nesnelerin bu ilişkilerini belirtebilmek için sınıfların buna uygun yazılması gerekir. Nesne yönelimli programlama tekniği yapılacak bir projenin kodlama aşamasında önce sınıflar sonra da sınıflararası ilişkiler belirlenir ve kodlamaya geçilir. Sınıflar ve aralarındaki ilişkiler şüphesiz sınıfların/nesnelerin gerçek durumları düşünülerek belirlenir. Anahtar Notlar: Bir projenin müşteri ile görüşülmesinden müşteriye teslimine (deployment) geçe süreci çeşitli şemalarla anlatan UML (Unified Mpdeling Language) denilen bir araç bazı durumlarda kullanılmaktadır. Bu aracın en önemli şeması "sınıf şemaları (class diagrams)" dır. Bu şema tamamen kodlamaya yöneliktir. Sınıf şemalarının anlattığı özelliklerden biri de iki sınıf arasındaki ilişkidir. Anahtar Notlar: Bir kavram(lar) modellenirken o kavramın genel durumu düşünülür. İstisna niteliğinde olacak durumlar modelleme yapılırken göz önünde bulundurulmaz. Aksi taktirde hiç bir şey modellenemez. Örneğin arabayla motor arasındaki ilişki için şu kurallar söylenebilir: 1. Araba nesnesine ait olan motor nesnesi başka bir araba tarafından kullanılamaz 2. Araba nesnesine ait olan motor nesnesi ömrüne hemen hemen arabayla başlayacak ve araba ile ömrü son bulacak Burada örnmeğin ikinci koşul bazı durumlarda delinebilir. Ama bu ilişkinin genel durumunu değiştirmez. Bir sınıfın derlenebilmesi için başka bir sınıfın var olması gerektiği durumlara "bağımlılık (dependency)" denir İki sınıf arasında ya hiç bir ilişki yoktur ya da aşağıdakilerden birisi vardır: 1. İçerme (composition) (has a): A ve B arasındaki "A has a B" ilişkisi için aşağıdaki koşulların ikisinin de sağlanması gerekir - A nesnesine ait B nesnesi ömrüne hemen hemen A nesnesi ile başlayacak ve hemen hemen A nesnesi ile ömrü sonlanacak - A nesnesine ait olan B nesnesi başka bir nesne tarafından kullanılamayacak Bu ilişkide A nesnesi B nesnesini istediği durumda (hemen her durumda) kullanabilmektedir. Buna bütünsel (whole) kullanım denir. 2. Birleşme (aggregation) (holds a): A ve B arasındaki "A holds a B" ilişkisi composition kurallarının en az bir tanesinin gerçeklenmediği bütünsel kullanım ilişkisidir 3. Çağrışım (association): A nesnesinin B nesnesini ihtiyacı olduğunda kullanması kullandıktan sonra saklamaması ilişkisidir. Yani bütünsel kullanım yoktur. Bu kullanıma parçalı (partial) kullanım da denir 4. Kalıtım/Türetme (inheritance) (is a): Biyoloji'den programlamaya geçmiş bir kavramdır. Biyoloji'de kalıtım ebeveynin (parent) özelliklerinin çocuğuna (child) aktarılmasıdır. Anahtar Notlar: Bazı sınıflar implementasyonları gereği yukarıdaki ilişkilerin hiç birisine uygun olmayabilir. Ama ortada yine bir bağımlılık (dependency) söz konusudur. Bu da yine genel durumu bozmaz.----------------------------------------------------------------------------------------------------------------------*/
A ile B arasındaki composition ilişkisinin genel biçimi
/*---------------------------------------------------------------------------------------------------------------------- A ile B arasındaki composition ilişkisinin genel biçimi----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newA(/*...*/);
x.doWork1();
x.doWork2();
}
}
classA {
privateBm_b;
//...publicA(/*...*/)
{
//...m_b = newB(/*...*/);
}
publicvoiddoWork1()
{
//...m_b.doSomething();
}
publicvoiddoWork2()
{
//...m_b.doSomething();
}
}
classB {
//...publicvoiddoSomething()
{
//...
}
}
Car, Plane ve Engine sınıfları arasındaki ilişkiler
String sınıfı immutable olduğundan aşağıadaki ilişki ne aggregation ne de composition'dır.
/*---------------------------------------------------------------------------------------------------------------------- 13.09.2020 String sınıfı immutable olduğundan aşağıadaki ilişki ne aggregation ne de composition'dır. Ancak composition ilişkisine daha yakındır denebilir. Ancak gerçek olarak özel bir durumdur ve herhangi isim de verilemeyebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Stringname = "Oğuz";
intno = 1;
Personperson = newPerson(no, name);
System.out.println(person.getName());
System.out.println(name);
name = name.toUpperCase();
System.out.println(person.getName());
System.out.println(name);
}
}
classPerson {
privateintm_no;
privateStringm_name;
publicPerson(intno, Stringname)
{
//...m_no = no;
m_name = name;
}
publicintgetNo()
{
returnm_no;
}
publicvoidsetNo(intno)
{
//...m_no = no;
}
publicStringgetName()
{
returnm_name;
}
publicvoidsetName(Stringname)
{
//...m_name = name;
}
}
Türetme (inheritance)
/*---------------------------------------------------------------------------------------------------------------------- Türetme (inheritance) kavramı programlamada bir sınıfı genişletmek (extension) için kullanılır. Bu genişletme var olan özellikler üzerine ekleme olarak düşünülebilir. Bu ilişkide B sınıfı A sınıfından türetilmişse "B is A" cümlesi kullanılır. B sınıfı A sınıfından türetilmiş olsun. B sınıfına A sınıfının türemiş sınıfı (derived class) denir. A sınıfına ise B sınıfının taban sınıfı (base class) denir. Bu iki terim nesne yönelimli programlama paradigmasına yönelik genel terimlerdir. Java'da "base class" yerine "super class", "derived class" yerine ise "sub class" terimleri kullanılır. Anahtar Notlar: Nesne yönelimli programlamada "base class" yerine Biyoloji'den gelen terim olarak "parent class" da denilmektedir. Benzer şekilde "derived class" yerine yine Biyoloji'den gelen "child class" da denilmektedir. Bu terimler az kullanılsa da bazı kaynbaklarda görülmektedir. Bir dizi türetme söz konusu olabilir. Örneğin C sınıfı B sınıfından, B sınıfı da A sınıfından türetilmiş olabilir. Bu durumda C'nin taban sınıfı (super class) dendiğinden doğrudan taban sınıfı (direct super class) olan B anlaşılır. C nin dolaylı bir taban sınıfı (indirect super class) A dır. Örneğimizde "C'nin taban sınıfları B ve A'dır" cümlesi tamamen doğru değildir. Doğrusu "C nin taban sınıfı B'dir. Dolaylı taban sınıflarından biri A'dır" cümlesidir. Java' da bir sınıf birden fazla (doğrudan) taban sınıfa sahip olamaz. Yani Java' da çoklu türetme (multiple inheritance) yoktur. Java'da bir sınıf yalnızca tek bir sınıftan türetilir. Anahtar Not: Java' da çoklu türetmeyi gerektiği yerlerde kısmi olarak desteklemesini sağlayan "interface" denilen bir tür bulunmaktadır. Bu konu ileride ele alınacaktır. Çoklu türetmenin pratikte örneği yoktur. Varolan olan örnekler de interface ile yapılabilecek şekildedir Türetme kavramı aynı zamanda "bir sınıfın kodlarına dokunmadan o sınıfı genişletmek" anlamına gelir. Bu kavramında içinde bulunduğu prensibe nesne yönelimli programlama tekniğinde "Open Closed Principle" denir. Bu prensibin İngilizce olarak mottosu "Open for extension closed for modification" dır.----------------------------------------------------------------------------------------------------------------------*/
Java'da türetme extends anahtar sözcüğü ile aşağıdaki gibi yapılır
/*---------------------------------------------------------------------------------------------------------------------- Java'da türetme extends anahtar sözcüğü ile aşağıdaki gibi yapılır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classDextendsA {
//...
}
classCextendsB {
//...
}
classBextendsA {
//...
}
classA {
//...
}
Taban sınıfın metotları türemiş sınıfa da aktarılır.
/*---------------------------------------------------------------------------------------------------------------------- Taban sınıfın metotları türemiş sınıfa da aktarılır. Aşağıdaki örnekte foo ve bar metotları B sınıfında da vardır. Bu kavrama "davranışsal genişletme (behavioral extension)" de denir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Bx = newB();
x.foo();
x.bar();
x.tar();
}
}
classBextendsA {
publicvoidtar()
{
System.out.println("B.tar");
}
}
classA {
publicvoidfoo()
{
System.out.println("A.foo");
}
publicvoidbar()
{
System.out.println("A.bar");
}
}
Türemiş sınıf referansı ile taban sınıfın non-static bir veri elemanına erişilebilir.
/*---------------------------------------------------------------------------------------------------------------------- Türemiş sınıf referansı ile taban sınıfın non-static bir veri elemanına erişilebilir. Yani taban sınıfın non-static veri elemanları da türemiş sınıfa aktarılmış olur. Türemiş sınıf nesnesi içerisinde taban sınıf kadarlık bir bölüm bulunmaktadır. Burada nesnesel bir kapsama söz konusudur. Buna göre, türemiş sınıf nesnesinin bellekte kapladığı alan "en az taban sınıf nesnesinin bellekte kapladığı alan + türemiş sınıfa eklenen non-static veri elemanlarının toplam uzunluğu kadardır"----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Bb = newB();
b.x = 10;
b.y = 20;
System.out.printf("b.x=%d%n", b.x);
System.out.printf("b.y=%d%n", b.y);
}
}
classBextendsA {
publicinty;
}
classA {
publicintx;
}
super ctor sentaksı adından da anlaşılacağı gibi yalnızca ctor'larda kullanılabilir
/*---------------------------------------------------------------------------------------------------------------------- super ctor sentaksı adından da anlaşılacağı gibi yalnızca ctor'larda kullanılabilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Bx = newB();
System.out.println("//////////////////");
By = newB(10);
}
}
classBextendsA {
publicB()
{
System.out.println("B.B()");
}
publicB(intval)
{
super(val);
System.out.println("B.B(int)");
}
publicvoidfoo()
{
super(9); //error
}
}
classA {
publicA()
{
System.out.println("A.A()");
}
publicA(inta)
{
System.out.println("A.A(int)");
}
}
** ile belirtilen super ctor sentaksı default ctor çağrısı demek olduğundan yazılması ya da yazılmamamsı aynı anlamdadır.
/*---------------------------------------------------------------------------------------------------------------------- ** ile belirtilen super ctor sentaksı default ctor çağrısı demek olduğundan yazılması ya da yazılmamamsı aynı anlamdadır. Yani bir sınıfının ctor'unun başına super ctor sentaksı yazmamak derleyicinin super(); şeklindeki deyimi kendisinin yerleştirmesi demektir. Bu şekilde düşünülebilir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Bx = newB();
System.out.println("//////////////////");
By = newB(10);
}
}
classBextendsA {
publicB()
{
super(); //**: Yazılması yazılmaması ile aynı anlamdadırSystem.out.println("B.B()");
}
publicB(intval)
{
super(val);
System.out.println("B.B(int)");
}
}
classA {
publicA()
{
System.out.println("A.A()");
}
publicA(inta)
{
System.out.println("A.A(int)");
}
}
Bir dizi türetme durumunda taban sınıfın ctor'unun çağrılması
Bazı durumlarda bir sınıfın ctor'u içerisinde sınıfın başka bir ctor'unun çağrılması gerekebilir. Bu durumda this ctor sentaksı kullanılır
/*---------------------------------------------------------------------------------------------------------------------- Bazı durumlarda bir sınıfın ctor'u içerisinde sınıfın başka bir ctor'unun çağrılması gerekebilir. Bu durumda this ctor sentaksı kullanılır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newA();
System.out.println("////////////");
Ay = newA(10);
System.out.println("////////////");
Az = newA(3.4);
}
}
classA {
publicA()
{
System.out.println("A.A()");
}
publicA(doublea)
{
this();
System.out.println("A.A(double)");
}
publicA(inta)
{
this();
System.out.println("A.A(int)");
}
}
/*---------------------------------------------------------------------------------------------------------------------- Bazı durumlarda bir sınıfın ctor'u içerisinde sınıfın başka bir ctor'unun çağrılması gerekebilir. Bu durumda this ctor sentaksı kullanılır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newA();
System.out.println("////////////");
Ay = newA(10);
System.out.println("////////////");
Az = newA(3.4);
}
}
classA {
publicA()
{
System.out.println("A.A()");
}
publicA(doublea)
{
this();
System.out.println("A.A(double)");
}
publicA(inta)
{
this("ankara");
System.out.println("A.A(int)");
}
publicA(Strings)
{
System.out.println("A.A(String)");
}
}
this ctor sentaksı da ctor'un ilk deyimi olmak zorundadır
/*---------------------------------------------------------------------------------------------------------------------- this ctor sentaksı da ctor'un ilk deyimi olmak zorundadır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
Ax = newA();
System.out.println("////////////");
Ay = newA(10);
System.out.println("////////////");
Az = newA(3.4);
}
}
classA {
publicA()
{
System.out.println("A.A()");
}
publicA(doublea)
{
System.out.println("A.A(double)");
this(); //error
}
publicA(inta)
{
this("ankara");
System.out.println("A.A(int)");
}
publicA(Strings)
{
System.out.println("A.A(String)");
}
}
this ve super ctor sentaksları aynı anda bulunamazlar.
/*---------------------------------------------------------------------------------------------------------------------- this ve super ctor sentaksları aynı anda bulunamazlar. Böyle bir durumla karşılaşan programcı yazdığı koda bakmalıdır. Çünkü iyi bir tasarımın programcıyı bu şekilde bir ihtiyaca sokmaması gerekir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classBextendsA {
publicB(Strings)
{
System.out.println("B.B(String)");
}
publicB(intval)
{
this("ankara");
super(val);//error
}
}
classA {
publicA()
{
System.out.println("A.A()");
}
publicA(inta)
{
System.out.println("A.A(int)");
}
}
Java'da bir sınıf herhangi bir sınıftan extends anahtar sözcüğü ile türetilmese bile java.lang paketi içerisinde bulunan Object isimli bir sınıftan türetilmiş olur.
/*---------------------------------------------------------------------------------------------------------------------- Java'da bir sınıf herhangi bir sınıftan extends anahtar sözcüğü ile türetilmese bile java.lang paketi içerisinde bulunan Object isimli bir sınıftan türetilmiş olur. Yani tüm sınıflar aslında doğrudan ya da dolaylı olarak Object sınıfından türetilmiştir. Başka bir deyişle Object sınıfı tüm sınıfların doğrudan ya da dolaylı olarak taban sınıfıdır----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classBextendsA {
}
classA {
}
Object sınıfı istenirse extends anahtar sözcüğü ile de bildirimde yazılabilir.
/*---------------------------------------------------------------------------------------------------------------------- Object sınıfı istenirse extends anahtar sözcüğü ile de bildirimde yazılabilir. Şüphesiz bu sınıfın başka bir sınıftan türetilmemiş olması gerekir. Ancak Object sınıfı bu şekilde yazılmaz. Zaten Java programcısı bunu bilmektedir----------------------------------------------------------------------------------------------------------------------*/packageorg.csystem.app;
classApp {
publicstaticvoidmain(String [] args)
{
}
}
classBextendsA {
}
classAextendsObject {
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/