[]

Android Java

Merhaba ben uygulama içi satın alma işlemini anlamaya çalışıyorum anlamadığım bir konu var.
Şöyle bir tanımlama kullanılmış.

private final BillingClient mBillingClient;
ctrl ile BillingClient üzerine geldiğim de BillingClient.java açılıyor ve BillingClient.javanın bir abstact class olduğunu anlıyorum fakat abstract clas extensts ile dahil edilir.

Hemen aklıma casting yapılma ihtimali geldi fakat bunun içinde kalıtım olması gerekiyor ve kalıtım içinde extensts veya interface ise de imlements kullanılır böyle bir şey kullanılmamış.

Bu tanımlama şekli nedir acaca ?


codelabs.developers.google.com

 
oncelikle abstract class'i illa extend etmek zorunda degilsin. Anonymous olarak da bu classi implement edebilirsin.

new BillingClient() {

@Override
public void myAbstractMethod() {

}
}
seklinde BillingClient instance'i olusturup kullanabilirsin. AsyncTask class'ina bakarsan o da ayni sekilde.

ikincisi extend edilen class'lar super classlari yerine kullanilabilinir. yani


public class BillingClientImpl extends BillingClient {

}
olsun diyelim.

BillingClient billingClient = new BillingClientImpl(); seklinde kullanabilirsin. Gorunuse gore OOP konularini tam kavrayamamissin. OOP uzerine biraz daha calismalisin
  • crucio  (04.04.19 11:38:33) 
Merhaba @crucio bana değerli vaktini ayırarak cevap verdiğin için teşekkür ediyorum. Verdiğin cevap'ı çok faydalı buldum.

Fakat bilgisayarı güncelemem gerekti ve aksilikler yaşadım O yüzden geri dönüş yapmam uzun sürdür özür diliyorum.
instance oluşturarak abstract class'ı oluşturabilirsin diyorsun evet denedim oluyor fakat aşağıda vereceğim link te base class'ların instancesi oluşturulamaz diyor.

www.akinabdullahoglu.com

Birde bu olayın mantığını tam anlayamadım.
Abstrac class soyut class olduğu için nesne oluşturulamaz yani ram'de yer ayrılmaz ama nesne oluşturmak için kullanılan new operatörü absrtact class'ın instance'si oluşturulurken de kullanılabilir peki bu new tam olarak ne yapıyor ?

Aşağıda verdiğim link'teki yazıları google çeviri kullanarak okudum ama tam anlayamadım.

stackoverflow.com

Ayrıca bir abstact class'ı bir metod gibi yazıp nasıl örnekleme oluşturulabiliyor kafam almıyor.

Sonuçta BillingClient bir abstrac class olduğunu kabul edersek bir class'ı metot gibi yazmak da ne demek oluyor new BillingClient() {}

İşe yaradığını biliyorum denedim oluyor fakat mantığını anlayamadım.

İkinci örneğine gelirsek

BillingClient billingClient = new BillingClientImpl();
yukarıda ki yöntemle biz zoyut bir sınıfı yani ram'de yer ayrılamayan bir sınıfı BillingClientImpl sınıfının ram'deki yerini kullanmasını sağlıyoruz değil mi ?

Soyut sınıf somut sınıfın ram'deki yerini kullanıyor.
Doğru mu anladım ?
  • aristotelesin berberi  (09.04.19 12:47:14) 
selam,

rica ederim yardimci olabildigime sevindim. oncelikle terimlerin turkcelerini bilmiyorum o yuzden ingilizce terimler kullanicam kusura bakma.

-verdigin linkte c# icin bahsetmis. c#'da dedigin gibi abstract classlari anonymous class olarak extend edip instantiate edemezsin. java'da bu mumkun. aslinda javada yaptigimiz biraz syntactic sugar gibi dusunebilirsin.
new BillingClient() {} seklinde abstract class'in anonymous instance'ini olusturdugumuzda arka planda java bu BillingClient'tan extend eden baska bir class tanimliyor. genelde bunun ismi BaskaBirClassAdi_$1 seklinde olur. yani aslinda java compiler su sekilde bir kod olusturuyor

public class BaskaBirClassAdi_$1 extends BillingClient{
public vois abstractClass() {
//doSomething
}
}

ve bu class'in instance'ini olusturup sana donuyor. Eger kodu debug edip abstractClass icinde class adina bakarsan class adinin bu sekilde oldugunu gorursun.

"new" operatorunun amaci memory allocation yapmaktir. memory allocation yapmak hafizada o alani sadece bu class'in kullanimi icin isaretlemek demektir. henuz bu hafizada bu alana birsey yazilmadi, cop veri var su anda burada. constructor'da ise bu hafizaya class bilgileri yaziliyor. yani aslinda new operatoru eger C yada C++ biliyorsan "malloc" fonksiyonunun islevini goruyor. java daha high level bir dil oldugu icin memory allocation'i ve initialization'i tek bir komutta yapiyor.

"new BillingClient() {}" bu kullanimin nasil calistigini yukarida yazdim, aciklayici olmustur sanirim.

BillingClient billingClient = new BillingClientImpl(); burada yaptigimiz da polymorphisim. Extend edilen class'a base class gibi davraniyoruz. bu nesne ile etkilesime gecenler sadece base class'in ozelliklerini gorebiliyor.
  • crucio  (09.04.19 13:38:58) 
merhaba @crucio verdiğin bilgiler için çok çok teşekkür ediyorum.

BillingClient'tan extend eden baska bir class tanimliyor

cümlen gerçekten beni aydınlattı yazını anlamaya çalışıyorum debug konusunu öğrenmeye çalışıyorum.

Yarın tekrar sorular sormak istiyorum bu bilgileri sindirdikten sonra gerçekten çok bilgili birisin çok teşekkürler.
  • aristotelesin berberi  (09.04.19 15:54:32) 
@crucio merhaba nasılsın, bir kaç sorum var cevaplarsan çok fayda sağlayacağım.

1. Sorum extent edilen abstract classın nesnesini oluşturmak ile ilgili;
biz eğer bir abstact classı extent ettiysek onun metotlarını ctrl+o yaparak çağırabiliriz, extent edilmiş bir abstact classın neden nesnesini oluşturmaya ihtiyac duyuyoruz.Abstact class zaten soyut class bunun nesnesini oluşturduğumuzda bu remde yer tutar ve soyut olmaktan çıkar.


Galiba kafamda doğru olduğunu düşündüğüm şöyle bir düşünce var
ben bir classın metotlarını çağırmak için nesnesini oluşturmam gerektiğini düşünüyorum. Bu yanlış mı ?

2. Sorum da bir classı debug edip bir abstac classın şu şekilde oluşturup
new BillingClient() {

@Override
public void myAbstractMethod() {

}
}
sonra debug ettiğimde arka planda nesne oluşturan metotdu bulamadım nasıl bulacağımı bana öğretebilirmisin.
Bu bilgi çok işime yarayacak çünkü.
Ben debug edebiliyorum fakat dediğin metodu bulamıyorum bulamıyorum.
Teşekkürler.
  • aristotelesin berberi  (15.04.19 19:15:09) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.