Java statik / dinamik bağlama

Bugün "Java Core Technology I" kitabında dinamik bağlamayı gördüm, bu, alt sınıf ve ana sınıf aynı yönteme sahip olduğunda, alt sınıfın ana sınıfın yöntemini geçersiz kıldığı ve yöntemin çalışma zamanında ana sınıfı çağırdığı anlamına gelir. Alt sınıfın yöntemi mi yoksa geçersiz kılma yöntemi mi? Program, çalışırken belirli bir yöntemi otomatik olarak çağırmayı seçecektir (yöntem tablosuna göre).

Bunu okuduktan sonra yardım edemiyorum ama dinamik varsa statik olması gerektiğini düşünüyorum, bu yüzden yardım için google'a gittim ve önce bağlamanın ne olduğuna baktım:

Bağlama, bir yöntemin çağrılması ile yöntemin bulunduğu sınıf (yöntem gövdesi) arasındaki ilişkiyi ifade eder. Java için bağlanma, statik bağlama ve dinamik bağlama olarak ikiye ayrılır veya erken bağlama ve geç bağlama olarak adlandırılır.

Sonra ikisi arasındaki anlam ve farka ayrı ayrı bakarız

Dinamik bağlama: çalışma zamanında belirli nesne türüne göre bağlama. Bir dil geç bağlama uygularsa, çalışma zamanı sırasında nesnenin türünü belirlemek için bazı mekanizmalar sağlamalı ve sırasıyla uygun yöntemi çağırmalıdır. Başka bir deyişle, derleyici şu anda hala nesnenin türünü bilmiyor, ancak yöntem çağrı mekanizması kendi başına araştırabilir ve doğru yöntem gövdesini bulabilir. Farklı dillerin geç bağlama için farklı uygulama yöntemleri vardır. Ama en azından şu şekilde düşünebiliriz: hepsinin nesneye bazı özel bilgi türleri eklemesi gerekir.

Dinamik bağlama süreci:

Sanal makinenin nesnenin gerçek türünü çıkarması için bir yöntem tablosu;

Sanal makine arama yöntemi imzası;

Yöntemi çağırın.

Statik bağlama: Yöntem, program çalıştırılmadan önce bağlanmıştır (yani, derleme işlemi sırasında yöntemin zaten bilindiği sınıf yöntemi) derleyici veya başka bir bağlayıcı tarafından uygulanmıştır. Java için, basitçe program derleme sırasındaki bağlayıcılık olarak anlaşılabilir; burada özel bir nokta, java'daki tek yöntemler nihai, statik, özel ve inşa yöntemleri ön bağlayıcıdır.

Fark: Aslında, yukarıdaki açıklama birçok şeyi anlatabilir.

(1) Statik bağlama derleme zamanında gerçekleşir ve dinamik bağlama çalışma zamanında gerçekleşir

(2) Özel veya statik veya son değiştirilmiş değişkenler veya yöntemler kullanın ve statik bağlama kullanın. Sanal yöntemler (alt sınıflar tarafından geçersiz kılınabilen yöntemler), çalışma zamanı nesnesine göre dinamik olarak bağlanır.

(3) Statik bağlama, tamamlamak için sınıf bilgilerini kullanırken, dinamik bağlamanın tamamlamak için nesne bilgilerini kullanması gerekir.

(4) Aşırı Yükleme yöntemi statik bağlama ile tamamlanır ve Geçersiz Kılma yöntemi dinamik bağlama ile tamamlanır.

Aşağıda kod testine başlayın:

Sonuçları :

Yukarıdaki kodda, lee yönteminin aşırı yüklenmiş iki uygulaması vardır, biri parametre olarak Object türünde bir nesneyi almak ve diğeri parametre olarak String türünde bir nesneyi almaktır. Ve str bir String nesnesidir, String tipi parametrelerini alan tüm çağrı yöntemleri çağrılır. Buradaki bağlama, derleme zamanında parametre tipine dayalı statik bağlamadır.

Ardından derlemeyi çözer ve doğrularız:

Bu satırı 18 gördüm: invokevirtual # 6 // Yöntem CoreJava / day_2 / Test $ Lee.call: (Ljava / lang / String;) V aslında statik olarak bağlanmış, String nesnesini parametre olarak alan sayının çağrıldığını doğruluyor yöntem.

Şimdi yeniden yazabilirsiniz:

Sonuç :

Yukarıda SecLee, Lee'yi miras aldı ve say yöntemini yeniden yazdı. Lee türünde bir değişken lee bildiriyoruz, ancak bu değişken onun alt sınıfı SecLee'ye işaret ediyor. Sonuçlara göre Lee'nin say yöntemi yerine SecLee'nin say yöntemi uygulamasını çağırdığı görülüyor. Bu sonucun nedeni, dinamik bağlamanın çalışma zamanında gerçekleşmesidir ve bağlama işlemi sırasında say yönteminin hangi sürümünün uygulanacağını belirlemek gerekir.

Ayrıştırma işleminin sonucuna bakın:

Yukarıdaki sonuç olarak, 18: invokevirtual # 6 // Yöntem CoreJava / day_2 / Test Lee.say: (Ljava / lang / String;) V, burada Test $ SecLee.say yerine TestLee.say'dir, çünkü çağrı derleme sırasında belirlenemez Alt sınıf hala üst sınıfın uygulamasıdır, bu nedenle işlem için yalnızca çalışma zamanında dinamik bağlamaya bırakılabilir.

Artık test yeniden yazıldığına göre yeniden yüklemeyi deneyelim:

Aşağıdaki örnek daha karmaşıktır! Lee sınıfında say yönteminin iki aşırı yüklemesi vardır: Daha karmaşık olanı SecLee'nin Lee'yi entegre etmesi ve bu iki yöntemi yeniden yazmasıdır. Aslında bu durum, yukarıdaki iki durumun birleşimidir.

Aşağıdaki kod önce statik olarak bağlanacak, parametre olarak bir String nesnesiyle say yöntemini çağırmayı belirleyecek ve daha sonra söz konusu alt sınıfın mı yoksa üst sınıfın mı uygulanacağını belirlemek için çalışma zamanında dinamik olarak bağlanacaktır.

sonuç :

Sonuç bekleniyor, bu yüzden daha fazlasını söylemeyeceğim.

İşte sorun geliyor, Dinamik olarak bağlanmak mümkün değil mi?

Aslında, belirli yöntemlerin bağlanması, statik bağlama ile de elde edilebilir, örneğin:

Burada lee'nin SecLee nesnesini tuttuğu ve lee değişkeninin son olduğu ve say yöntemini hemen çalıştırdığı görülebilir Teoride, derleyici SecLee'nin say yönteminin yeterli kod analizi ile çağrılması gerektiğini bilir.

sonuç olarak:

Dinamik bağlamanın, çalışma zamanında hangi yöntem uygulamasının veya değişkeninin yürütüleceğini belirlemesi gerektiğinden, statik bağlama ile karşılaştırıldığında zaman alır, bu nedenle kitapta da belirtildiği gibi, bazı programcılar polimorfizmi kullanmak için yeterli neden olmadıkça inanırlar. Tüm yöntemler modifikasyon için nihai, özel veya statik olarak beyan edilmelidir. Bunun biraz aşırı olduğunu düşünüyorum, hayırsever iyilikseverliği, bilge de bilgeliği görür.

21 yaşındaki Song Zuer her gün evlilikten nefret etsin mi? Bu varyete şovuna ne oldu?
önceki
Huang Bo neden her zaman doğru varyete şovunu seçer? İyi şans mı yoksa sert güç mü? Üç ayrıntı için gizemi görün!
Sonraki
Zhang Ziyi'nin yeni filmi: Canavarlar sadece üç saniyede yakışıklı oluyor.
Dao İlçesinde iyi ekoloji: Dragon Boat Festivali'ne hoş geldiniz, bahçe çalışanları budamakla meşgul
Douban 8.9, hayranlara özel, gerçek bir film değilsin!
Çok tatlı! Zhong Liti, Zhang Lunshuo'nun ailesi gecikmiş bir komedi adamı mı saklıyor?
Peng Yuchang'ın oyunu yenildi ve Huang Lei ve He Jiong farklı şekillerde yanıt verdi!
Birbiri ardına "beyaz yıkamak" olarak yanıt veren Zhou Dongyu ve Guan Xiaotong'un üç kelimesi çok yakın!
Röportajın sorması gereken SpringCloud uygulamasının şematik diyagramı
Mahçup! Shen Yue alay edildi ve sadece yoğun resimde yaşayabildi, Yang Zi, Wang Jiaer tarafından bir idol olarak görüldü!
"Extreme Challenge" uzun zaman önce gelmeliydi! Bu yeni konuk iyi, ne kadar mutsuzsa seyirci o kadar mutlu olacak!
Eğlence endüstrisi neden kimseyi gücendiriyor, Huang Lei'yi gücendirmeyin, sadece arkadaş grubuna bakın ve anlayacaksınız
Zhang Yadong açıkça şu anki halk kafiyesinin çok dünyevi olduğunu ve hastalıksız inlediğini ve Gao Xiaosong'un utançla yüzleşmek için dövüldüğünü söyledi.
Cecilia Cheung, Zhang Wei tarafından alenen yalanlara maruz kaldı ve baskı karşısında bunaldı ve korkunç bir şey söylemekten başka seçeneği yoktu.
To Top