Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [JAVA] Esercizietto

  1. #1

    [JAVA] Esercizietto

    public class test5{
    C c=null;
    public test5(){
    System.out.println("+10");
    C c1=new C();
    c=new C();
    }
    public static void main(String[] args){
    test5 a = new test5();
    System.gc();
    new C();
    a = null;
    System.gc();
    }
    }

    class C{
    static int count=0;
    String name=null;
    public C(){
    name="2"+(++count);
    System.out.println("+"+name);
    }
    protected void finalize() {
    System.out.print("-"+name);
    }
    }


    Cosa e perchè dovrebbe sputare?

    io vedo un +10 +21 +??? qui sarebbe 22 ma sulla carta faccio 21 come prima..

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    10 + 21 + 22 + 23

    il 21 e 22 per gli oggetti C istanziati nel costruttore di test5 e il 23 per l'oggetto C istannziato nel main.

    le stampe del metodo finalize non sono predicibili a priori.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    la correzione dice:

    +10 +21 +22 -21 +23 -22 -23

    è dunque sbagliata?


    ma spé... un attimino..

    io parto dal main e faccio:

    A a = new A();
    e stampa +10

    poi sempre nella classe A, proseguo e trovo:

    C c1=new C();
    e mi stampa +21

    se ne esce dalla classe C; tornando nella classe A e trova un nuovo:
    c = new C();
    che DOVREBBE stamparmi ancora +21... è una nuova istanza.. perchè stamperebbe +22? :master:

    e poi, proseguendo pechè parte il primo garbage collection? nn c'è nulla da finalizzare..... :master:



  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    il campo count di C è static quindi codiviso da tutte le istanze di C per questo i numeri stampati dal costruttore di C sono sempre crescenti e mai ripetuti. Il primo -21 è dovuto al fatto che l'oggetto istanziato nel costruttore di test5:

    C c1=new C();

    una vola finito il costruttore non è piu riferibile, quindi il garbage collector lo elimina. La soluzione chet i hanno dato non è nè sbaglita nè giusta, inquanto non è predicibile quando il garbage collector entrerà in azione, anche se invochi System.gc potrebbe benissimo non effettuare alcuna azione: le specifiche per la java virtual machine non impongono nulla in tal senso. Quindi puoi indicare l'ordine in cui saranno stampati i messaggi +xx , ma non l'ordine e la posizione dei messaggi -xx: usando macchine virutali diverse potresti ottere risultati diversi.

    Ti riporto alcuni concetti sul garbage collector presi da qui:

    http://www.jchq.net/certkey/0301certkey.htm

    (una guida online sull'eame di certificazione java programmer)

    Let me re-state that point, you cannot force garbage collection, just suggest it.
    Java guarantees that the finalize method will be run before an object is Garbage collected
    Because garbage collection is “non deterministic” ie you cannot predict when it will happen, you thus cannot predict exactly when the finalize method will run.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    grazie, fin qui ho capito bene.


    un ultima cosa:

    Il gc() finalizza la C c1 = new C(); e NON --> C c = null; c=newC();



  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    finalizza il c1, il campo c dell'oggetto test5 non può essere finalizzato finchè non è eseguita l'istruzione a = null; : a quel punto l'oggetto test5 creato nel main può esesre finalizzato quindi anche l'oggetto puntato dal suo campo c in quanto non c'è altromodo per riferirlo

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.