2016-04-19 25 views
9

Nesne sınıfı, her sınıfın temel sınıfıdır, yani, her sınıf Nesne sınıfını genişletir. Nesne sınıfında genel bir String toString() yöntemi vardır ve aynı yöntem String sınıfında bile bulunur. Artık, String sınıfı ayrıca Object sınıfını genişletir ve toString yöntemi bir String türü döndürür.Nesne sınıfının toString() yöntemi java'da nasıl derlenir?

Soruma soru: - Object sınıfını derlerken, String.class öğesini ve String sınıfının Object.class için bir bağımlılık türü oluşturacağını arayacaktır. Bu bağımlılık nasıl çözülür? Derleme mekanizması nasıl çalışır? Lütfen bir yerdeysem beni düzeltin.

+0

Java'nın nasıl bir sınıfta bu tür bir referans döngüsünü desteklediğini bilmiyorum. Bu yüzden bir java dosyasını sınıf yolu olmadan derleyemezsiniz. Derleyici, gerektiğinde diğer sınıfları denetler. Java'da – aalku

+0

, A sınıfı A sınıfına sahip olmanın yanlış bir tarafı yoktur; ve B sınıfı A ithalatı; (ve diğer dillerde ileri beyanlar vardır) – Exceptyon

+0

Birbirine referans veren diğer iki dersi derlemekle aynı şeydir. – SomeJavaGuy

cevap

4

Java derleyici, Multi-Pass Compiler'dur. Bu, derleme prosedüründe aşamalı adımlar olduğu anlamına gelir. Object derlenirken, Object'un derlenebilmesi için String'un geçici bir temsilini kullanır.

Geçici gösterimi bir çeşit gizli arabirimle karşılaştırabilirsiniz. Derleyici bu arabirime derler. Sadece çalışma zamanında derlenmiş parçalar bir araya gelir - derleyicinin, başka bir sınıfı derlemek için tam olarak derlenmiş bir sınıfa, yalnızca bir özetine ihtiyacı yoktur. Aslında

+0

Mükemmel bir şekilde uymasa da, diğer diller için yapılan derleme ve [linkleme] (https://en.wikipedia.org/wiki/Linker_%28computing%29) adımlarına bir başvuru eklenebilir. Derleyici, gereken her şeye sahip olduğunu "varsayar". Bağlayıcı aslında "bağlantıları çözecektir" (ve tüm * tanımsız referans * hatalarını dışarı aktaracaktır) – Marco13

2

, bu tür kodları yazarken: bir şey örneğini çünkü

public class Class1 
{ 
public Class2 giveClass2() 
{ 
    return new Class2(); 
} 
} 
public class Class2 : Class1 { } 

Bu doğru derler. Derleyici, kullandığınız türlerin tanımlanıp tanımlanmadığını kontrol eder.

Ancak, aşağıda bunu yazarsanız:

public class Class1 
    { 
     public Class1(){ 
      aClass2 = new Class2(); 
     } 
     public Class2 aClass2; 
    } 

    public class Class2 : Class1 
    { 

    } 

Bu aynı zamanda derlenmiş alacak, ancak çalışma zamanında Stack-taşması olur sonra döngüsel bağımlılıkları etkisi nedeniyle.