Çözüldü Java abstract sınıfı konusu nasıl anlaşılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Çözüm
Site bilgilerinden ziyade kullanıcı ağzından yazılmış yazıların daha az kafa karıştırıcı olduğunu düşünüyorum.

"Genellikle soyut sınıfları oluşturmadaki amacımız fonksiyonların kalıtım yoluyla transferini sağlamaktır. e peki neden abstract diyoruz ki normal kalıtım yoluyla da fonksiyonların transfer edebiliyorduk diyebiliriz. ama soyut sınıfın bir konsepti var. bir sınıf abstract edilmiş ise o sınıftan bir nesne üretemiyor ayrıca bu soyut sınıf ile kalıtım ilişkisi bulunan bir sınıfımız varsa soyut sınıftaki ilgili fonksiyonları kendine göre düzenlemek zorundadır. e ben normal sınıf oluşturur kalıtım yoluyla ilişkilendirdiğim sınıflarında her birinde gider yeniden kendime göre düzenlerim üst sınıfa da abstract demem diyebiliriz. buradaki olay da şu, çocuk sınıf ilgi fonksiyonu oldu ki yeniden düzenlemeyi unuttu. haliyle çağırdığımızda üstteki sınıfın fonksiyonu çalışacak. ama burada da fonksiyonun içi belki boş bırakıldı belki dolu. hani kendimize güvenip sürekli eziyoruz ya çocuk sınıflarda, ne yazdığı önemli değil diye yazdık bir şeyler diyelim. burada isteğimizin dışında bilgisayarın belleğinde boşu boşuna hiç çalışmaması gereken bir fonksiyon için yer tutmuş ve bunu yürütmüş olduk. bir yerde böyle hataların önüne geçmiş olmak dışında nesne üretmeyeceğimiz ayrıca fonksiyon tanımının aktarımına ihtiyaç duyacağımız ve bu fonksiyonun nedenli bir şey olduğunu kullanacağımız sınıflarda özellikle tanımlamamız yani fonksiyonun ebeveyn olan classta içinin dolu olmasının bir amacının olmadığı zaten çocuk sınıflarda kendine özgü olarak çalışma prensibi olan bir yapıya ihtiyaç duyulduğundan abstract sınıflara ihtiyaç duyuyoruz. detaylarına girmeden basitinden böyle bir ihtiyaç tanımı yapılabilir."




"Türkçesi soyut sınıf olan oop’de çokça kullanılan sınıf çeşidi.

-abstract class’ı, birden fazla ortak özelliği bulunan nesnelerin ortak özelliklerini tekrar tekrar tanımlamak yerine, ortak özelliklerin tanımlandığı yer olarak tanımlayabiliriz. örneğin fabrikamız var ve bu fabrikada çalışan işçilerin bilgilerinin tutulduğu bir program tasarlayacağız. fabrikada çalışanları işçi, yönetici, mühendis, tekniker diye 4 kategoriyi ayırdığımızı varsayalım. bu 4 çeşit çalışanın da ortak özellikleri vardır. aldıkları maaşlar, yaşları, cinsiyetleri gibi. bu ortak özellikleri her sınıf için tekrar tekrar tanımlamak yerine bir kez abstract class’da tanımlarız ve bu class’ı diğer sınıflara miras veririz işimiz kolaylaşmış olur.

-abstract classlar içlerinde normal fonksiyonlar tanımlayabildiğimiz gibi abstract fonksiyonlar da tanımlayabiliriz.
abstract fonksiyon tanımlayabilmek için fonksiyonun başına abstract anahtar kelimesini koymalıyız. abstract fonksiyonun mantığı şudur: benzer özelliklere sahip nesnelerde, her bir nesne veya bir grup nesne için farklı olan özellikleri tekrar tekrar tanımlama zorluğunu ortadan kaldırmak. çok bilinen bir örnek üzerinden anlatayım. neredeyse bütün hayvanlar ses çıkarırlar. peki hayvanların çıkardıkları sesler birbirinin aynısı mıdır hayır. o zaman hayvanların sesi için abstract fonksiyon tanımlayıp, her bir hayvandan çıkan farklı ses için bu fonksiyonu override edebiliriz.

-kendilerinden obje oluşturulamaz. yalnızca sınıflara miras verebilir.

-genellikle bu konulara yeni başlayanlar interface ile abstract class’ları karıştırabiliyor. aralarındaki benzerlikleri ve farklılıkları anlatmak gerekirse:

benzerlikler

a. her ikisinden de obje oluşturulamaz.

b. her ikisinde de fonksiyonların gövdeleri boş olmalıdır ve bu fonksiyonların kullanılabilmeleri için override edilmeleri gerekir. (abstract class’lardaki normal tanımlanan fonksiyonlar hariç.)

farklılıklar

a. interface’lerde değişken tanımlanamazken abstract class’larda değişken tanımlanabilir.

b. bir sınıf birden fazla interface den miras alabilirken, en fazla bir abstract class dan miras alabilir."
Site bilgilerinden ziyade kullanıcı ağzından yazılmış yazıların daha az kafa karıştırıcı olduğunu düşünüyorum.

"Genellikle soyut sınıfları oluşturmadaki amacımız fonksiyonların kalıtım yoluyla transferini sağlamaktır. e peki neden abstract diyoruz ki normal kalıtım yoluyla da fonksiyonların transfer edebiliyorduk diyebiliriz. ama soyut sınıfın bir konsepti var. bir sınıf abstract edilmiş ise o sınıftan bir nesne üretemiyor ayrıca bu soyut sınıf ile kalıtım ilişkisi bulunan bir sınıfımız varsa soyut sınıftaki ilgili fonksiyonları kendine göre düzenlemek zorundadır. e ben normal sınıf oluşturur kalıtım yoluyla ilişkilendirdiğim sınıflarında her birinde gider yeniden kendime göre düzenlerim üst sınıfa da abstract demem diyebiliriz. buradaki olay da şu, çocuk sınıf ilgi fonksiyonu oldu ki yeniden düzenlemeyi unuttu. haliyle çağırdığımızda üstteki sınıfın fonksiyonu çalışacak. ama burada da fonksiyonun içi belki boş bırakıldı belki dolu. hani kendimize güvenip sürekli eziyoruz ya çocuk sınıflarda, ne yazdığı önemli değil diye yazdık bir şeyler diyelim. burada isteğimizin dışında bilgisayarın belleğinde boşu boşuna hiç çalışmaması gereken bir fonksiyon için yer tutmuş ve bunu yürütmüş olduk. bir yerde böyle hataların önüne geçmiş olmak dışında nesne üretmeyeceğimiz ayrıca fonksiyon tanımının aktarımına ihtiyaç duyacağımız ve bu fonksiyonun nedenli bir şey olduğunu kullanacağımız sınıflarda özellikle tanımlamamız yani fonksiyonun ebeveyn olan classta içinin dolu olmasının bir amacının olmadığı zaten çocuk sınıflarda kendine özgü olarak çalışma prensibi olan bir yapıya ihtiyaç duyulduğundan abstract sınıflara ihtiyaç duyuyoruz. detaylarına girmeden basitinden böyle bir ihtiyaç tanımı yapılabilir."




"Türkçesi soyut sınıf olan oop’de çokça kullanılan sınıf çeşidi.

-abstract class’ı, birden fazla ortak özelliği bulunan nesnelerin ortak özelliklerini tekrar tekrar tanımlamak yerine, ortak özelliklerin tanımlandığı yer olarak tanımlayabiliriz. örneğin fabrikamız var ve bu fabrikada çalışan işçilerin bilgilerinin tutulduğu bir program tasarlayacağız. fabrikada çalışanları işçi, yönetici, mühendis, tekniker diye 4 kategoriyi ayırdığımızı varsayalım. bu 4 çeşit çalışanın da ortak özellikleri vardır. aldıkları maaşlar, yaşları, cinsiyetleri gibi. bu ortak özellikleri her sınıf için tekrar tekrar tanımlamak yerine bir kez abstract class’da tanımlarız ve bu class’ı diğer sınıflara miras veririz işimiz kolaylaşmış olur.

-abstract classlar içlerinde normal fonksiyonlar tanımlayabildiğimiz gibi abstract fonksiyonlar da tanımlayabiliriz.
abstract fonksiyon tanımlayabilmek için fonksiyonun başına abstract anahtar kelimesini koymalıyız. abstract fonksiyonun mantığı şudur: benzer özelliklere sahip nesnelerde, her bir nesne veya bir grup nesne için farklı olan özellikleri tekrar tekrar tanımlama zorluğunu ortadan kaldırmak. çok bilinen bir örnek üzerinden anlatayım. neredeyse bütün hayvanlar ses çıkarırlar. peki hayvanların çıkardıkları sesler birbirinin aynısı mıdır hayır. o zaman hayvanların sesi için abstract fonksiyon tanımlayıp, her bir hayvandan çıkan farklı ses için bu fonksiyonu override edebiliriz.

-kendilerinden obje oluşturulamaz. yalnızca sınıflara miras verebilir.

-genellikle bu konulara yeni başlayanlar interface ile abstract class’ları karıştırabiliyor. aralarındaki benzerlikleri ve farklılıkları anlatmak gerekirse:

benzerlikler

a. her ikisinden de obje oluşturulamaz.

b. her ikisinde de fonksiyonların gövdeleri boş olmalıdır ve bu fonksiyonların kullanılabilmeleri için override edilmeleri gerekir. (abstract class’lardaki normal tanımlanan fonksiyonlar hariç.)

farklılıklar

a. interface’lerde değişken tanımlanamazken abstract class’larda değişken tanımlanabilir.

b. bir sınıf birden fazla interface den miras alabilirken, en fazla bir abstract class dan miras alabilir."
 
Çözüm
Site bilgilerinden ziyade kullanıcı ağzından yazılmış yazıların daha az kafa karıştırıcı olduğunu düşünüyorum.

"Genellikle soyut sınıfları oluşturmadaki amacımız fonksiyonların kalıtım yoluyla transferini sağlamaktır. E peki neden abstract diyoruz ki normal kalıtım yoluyla da fonksiyonların transfer edebiliyorduk diyebiliriz. Ama soyut sınıfın bir konsepti var. Bir sınıf abstract edilmiş ise o sınıftan bir nesne üretemiyor ayrıca bu soyut sınıf ile kalıtım ilişkisi bulunan bir sınıfımız varsa soyut sınıftaki ilgili fonksiyonları kendine göre düzenlemek zorundadır. E ben normal sınıf oluşturur kalıtım yoluyla ilişkilendirdiğim sınıflarında her birinde gider yeniden kendime göre düzenlerim üst sınıfa da abstract demem diyebiliriz. Buradaki olay da şu, çocuk sınıf ilgi fonksiyonu oldu ki yeniden düzenlemeyi unuttu. Haliyle çağırdığımızda üstteki sınıfın fonksiyonu çalışacak. Ama burada da fonksiyonun içi belki boş bırakıldı belki dolu. Hani kendimize güvenip sürekli eziyoruz ya çocuk sınıflarda, ne yazdığı önemli değil diye yazdık bir şeyler diyelim. Burada isteğimizin dışında bilgisayarın belleğinde boşu boşuna hiç çalışmaması gereken bir fonksiyon için yer tutmuş ve bunu yürütmüş olduk. Bir yerde böyle hataların önüne geçmiş olmak dışında nesne üretmeyeceğimiz ayrıca fonksiyon tanımının aktarımına ihtiyaç duyacağımız ve bu fonksiyonun nedenli bir şey olduğunu kullanacağımız sınıflarda özellikle tanımlamamız yani fonksiyonun ebeveyn olan classta içinin dolu olmasının bir amacının olmadığı zaten çocuk sınıflarda kendine özgü olarak çalışma prensibi olan bir yapıya ihtiyaç duyulduğundan abstract sınıflara ihtiyaç duyuyoruz. Detaylarına girmeden basitinden böyle bir ihtiyaç tanımı yapılabilir."

"Türkçesi soyut sınıf olan OOP'de çokça kullanılan sınıf çeşidi.

-Abstract Class'ı, birden fazla ortak özelliği bulunan nesnelerin ortak özelliklerini tekrar tekrar tanımlamak yerine, ortak özelliklerin tanımlandığı yer olarak tanımlayabiliriz. Örneğin fabrikamız var ve bu fabrikada çalışan işçilerin bilgilerinin tutulduğu bir program tasarlayacağız. Fabrikada çalışanları işçi, yönetici, mühendis, tekniker diye 4 kategoriyi ayırdığımızı varsayalım. Bu 4 çeşit çalışanın da ortak özellikleri vardır. Aldıkları maaşlar, yaşları, cinsiyetleri gibi. Bu ortak özellikleri her sınıf için tekrar tekrar tanımlamak yerine bir kez abstract Class'da tanımlarız ve bu Class'ı diğer sınıflara miras veririz işimiz kolaylaşmış olur.

-Abstract classlar içlerinde normal fonksiyonlar tanımlayabildiğimiz gibi abstract fonksiyonlar da tanımlayabiliriz.
Abstract fonksiyon tanımlayabilmek için fonksiyonun başına abstract anahtar kelimesini koymalıyız. Abstract fonksiyonun mantığı şudur: Benzer özelliklere sahip nesnelerde, her bir nesne veya bir grup nesne için farklı olan özellikleri tekrar tekrar tanımlama zorluğunu ortadan kaldırmak. Çok bilinen bir örnek üzerinden anlatayım. Neredeyse bütün hayvanlar ses çıkarırlar. Peki hayvanların çıkardıkları sesler birbirinin aynısı mıdır hayır. O zaman hayvanların sesi için abstract fonksiyon tanımlayıp, her bir hayvandan çıkan farklı ses için bu fonksiyonu override edebiliriz.

-Kendilerinden obje oluşturulamaz. Yalnızca sınıflara miras verebilir.

-Genellikle bu konulara yeni başlayanlar interface ile abstract Class'ları karıştırabiliyor. Aralarındaki benzerlikleri ve farklılıkları anlatmak gerekirse:

Benzerlikler.

A. Her ikisinden de obje oluşturulamaz.

B. Her ikisinde de fonksiyonların gövdeleri boş olmalıdır ve bu fonksiyonların kullanılabilmeleri için override edilmeleri gerekir. (abstract Class'lardaki normal tanımlanan fonksiyonlar hariç.)

Farklılıklar.

A. İnterface'lerde değişken tanımlanamazken abstract Class'larda değişken tanımlanabilir.

B. Bir sınıf birden fazla interfaceden miras alabilirken, en fazla bir abstract classdan miras alabilir."

Çok güzel anlatmışsınız hocam teşekkürler.
 
Object Oriented prensiplerinde, gercek hayattaki iliskileri modellemek gerekir.

Bazi seylerin spesifikasyonlari bellidir, bazi seylerin belli degildir.

Ornegin "motorlu tasit" dedigin zaman kafanda bir sey canlanir ama bu kavram abstract'tir.
Her motorlu tasitta bulunan bazi ozellikler vardir ve bunlar nettir. Ornegin motorunun olmasi.
"Araba" bir cesit motorlu tasittir ama hala abstrakttir.
Fiat Egea bilmem ne dersen artik iyice ne oldugu belirgin hale gelir.

Iste bu yuzden motorlu tasit -> araba -> egea ; soldan saga dogru abstrakt bir modelden somut modele dogru gidersin.

Abstract bir class, belirli konseptlerin ne olacagini seklen belirtir ancak implementasyon detaylarini concrete class belirler.

Abstract class'lari "new MotorluTasit()" seklinde instantiate edememenin sebebi de budur. Motorlu tasit diye bir sey tek basina var olamaz, detaylandirilmasi daha dogrusu implemente edilmesi gerekir. Galeriye gidip "bana ordan bir motorlu tasit verin" demek gibi bir sey bu.

Cok gerekmedikce kullanmamak gerekir cunku kisitlayicidir. Abstract bir class dizayni sirasinda yapacagin bir hata onu extend eden tum class'lara etkiyecektir. Interface kullanmak daha dogrudur.

Ornegin gercek hayatta "Canli" -> hayvan -> kedigiller -> Sibirya Kaplani gibi bir hiyerarsi kurulabilir. Yine saga dogru ne oldugu netlesir sola dogru abstractlasir. "Canli" diye bir sinif yaziyorsan bunu abstract yapman en dogrusudur. Ancak buna "oksijenliSolunum()" diye bir metod koyarsan yanlis bir tasarim yapmis olursun cunku her canli oksijenli solunum yapmaz.
 
Object oriented prensiplerinde, gercek hayattaki iliskileri modellemek gerekir.

Bazi seylerin spesifikasyonlari bellidir, bazi seylerin belli degildir.

Ornegin "motorlu tasit" dedigin zaman kafanda bir şey canlanir ama bu kavram abstract'tir.
Her motorlu tasitta bulunan bazi ozellikler vardir ve bunlar nettir. Ornegin motorunun olmasi.
"Araba" bir cesit motorlu tasittir ama hala abstrakttir.
Fiat egea bilmem ne dersen artik iyice ne oldugu belirgin hale gelir.

Iste bu yuzden motorlu tasit -> araba -> egea; soldan saga dogru abstrakt bir modelden somut modele dogru gidersin.

Abstract bir class, belirli konseptlerin ne olacagini seklen belirtir ancak implementasyon detaylarini concrete class belirler.

Abstract Class'lari "New MotorluTasit()" seklinde instantiate edememenin sebebi de budur. Motorlu tasit diye bir sey tek basina var olamaz, detaylandirilmasi daha dogrusu implemente edilmesi gerekir. Galeriye gidip "bana ordan bir motorlu tasit verin" demek gibi bir sey bu.

Cok gerekmedikce kullanmamak gerekir cunku kisitlayicidir. Abstract bir class dizayni sirasinda yapacagin bir hata onu extend eden tum Class'lara etkiyecektir. Interface kullanmak daha dogrudur.

Ornegin gercek hayatta "canli" -> hayvan -> kedigiller -> sibirya kaplani gibi bir hiyerarsi kurulabilir. Yine saga dogru ne oldugu netlesir sola dogru abstractlasir. "canli" diye bir sinif yaziyorsan bunu abstract yapman en dogrusudur. Ancak buna "oksijenliSolunum()" diye bir metod koyarsan yanlis bir tasarim yapmis olursun cunku her canli oksijenli solunum yapmaz.

Teşekkürler hocam sizin örneğinizde çok güzelmiş. Zaten kafamda oturmuştu ama çok çabuk unutan biriyim artık unuttukça buraya gelip hatırlarım.
 
Abstract bir sinif kolayca anlatilamaz ama anlatmaya yardimci olacak basit bir örnek verilebilir.

Öncelikle abstract sinifin asil amaci, programciya icinde bulunan abstract metodlarin hepsinin kullanmaya zorlanmasidir. Peki neden ? Ayrica bir bir abstract siniftan neden Obje olusturulamaz ?


Ancak asagidaki sekilde anlatabilirim.

Bir sinif düsünelim ismi Hayvan olsun. Tüm hayvanlarin ortak olan bir kac özelikleri olsun. Yemek yemek , suc icmek , yasamak ve ölmek gibi.

Simdi bir hayvan sinifini kullaninca sadece su icen ama yemek yemeyen ,sadece ölen ama yasamayan bir hayvan ifade edebilir misin ? Eger edemiyorsan bunun anlami suna denk geliyor: "Tüm abstract metotlari kullanmak zorundasin." Aksi takdirde bu sinifi bir hayvan olarak niteleyemezsin.


Peki bana türsüz , sekilsiz bir hayvan söyleyebilir misin ? Bana sadece hayvandan bir obje versen bu birsey ifade eder mi ? ( Türsüz, sekilsiz ama yemek yiyen, su icen, yasayan ve ölen bir hayvan) ? Öyle bir hayvan yok dünyada. Her hayvanin türü vardir , kendine ait sesi vardir , kendi yasam döngüsü , yasam süresi falan vardir. O nedenle abstract bir sinif ALT SINIFLAR olmadan hicbir sey ifade etmez. O nedenle Abstract bir sinifin da objesi olusturulamaz.

Asil kullanim amaci budur. O sinif ne icin ordaysa , amacina tamamen hizmet etmek zorundadir.

Ama normal bir sinif yapinca bu kavramlar ortadan kalkar ve sen hicbir türü olmayan bir hayvan objesi olusturur ve kullanmaya calisirsin . Mesela hic yasamamis olan bir hayvani öldürmeye calisirsin ya da bir hayvan yaratirsin , sadece su icer ama ne yasar ne de ölür. Bunlarin önüne gecmek icin Abstract kavramini ortaya atmislar iste..
 

Geri
Yukarı