Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    8

    this() e .this - static e non-static

    scusate la basilarità della domanda, ma vorrei sapere a cosa serve esattamente usare il .this e il this().
    e la differenza tra un metodo statico o non statico.
    vi ringrazio

  2. #2

    Re: this() e .this - static e non-static

    Originariamente inviato da gujelmo
    scusate la basilarità della domanda, ma vorrei sapere a cosa serve esattamente usare il .this e il this().
    e la differenza tra un metodo statico o non statico.
    vi ringrazio
    Tutto sulla parola chiave THIS.

    Per quanto riguarda la differenza tra metodo statico e di istanza (non statico):
    banalmente, un metodo statico accede ai campi statici di una classe e questi sono condivisi da tutte le istanze della classe a cui offre il servizio;
    un metodo di istanza accede ai campi di istanza di una classe, che dunque sono propri di una istanza e variano di oggetto in oggetto.

    Esempio:
    codice:
    public class ContoBancario{
           private static int contiEsistenti;
           private int numeroConto;
           private int saldoConto;
    
           //corpo per l'inizializzazione dei campi statici
           static{
                   contiEsistenti = 0;
           }
    
           public ContoBancario(int saldoIniziale){
                    this.saldoConto = saldoIniziale;
                    this.numeroConto = ++contiEsistenti;
           }
    
           public int getSaldo(){
                    return this.saldo;
           }
    
           public int numeroConto(){
                    return this.numeroConto;
           }
    
           //statico
           public static int numContiEsistenti(){
                    return contiEsistenti;
           }
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    8
    ok, la differenze tra statico e d'istanza forse l'ho capita..

    Tutto sulla parola chiave THIS.

    ma l'uso del this mi rimane veramente arcano...

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da gujelmo
    ok, la differenze tra statico e d'istanza forse l'ho capita..

    ma l'uso del this mi rimane veramente arcano...
    In sostanza, quando crei un oggetto non viene creata alcuna copia di una variabile statica, poichè questa sarà in comune a tutti gli oggetti (quindi modificando il valore di quella variabile di un oggetto A, modifichi anche il valore di quella variabile dell'oggetto B).

    Questo esempio (banale) ti chiarirà le cose:
    codice:
    class EsempioStatic {
      private int a = 5;
      private static int b;
    
      static {
        b = 0;
      }
      
      int getA() {
        return a;
      }
      int getB() {
        return b;
      }
      
      void sommaA(int n) {
        a += n;
      }
      void sommaB(int n) {
        b +=n;
      }
    }
    
    class Esempio {
      public static void main(String[] args) {
        EsempioStatic primo = new EsempioStatic();
    	EsempioStatic secondo = new EsempioStatic();
    	System.out.println("Prima di operare modifiche:\n");
    	System.out.println("primo.getA(): "+primo.getA());
    	System.out.println("primo.getB(): "+primo.getB()+"\n");
    	System.out.println("secondo.getA(): "+secondo.getA());
    	System.out.println("secondo.getB(): "+secondo.getB());
    	System.out.println("\nOra modifichiamo i valori..\n");
    	primo.sommaA(10);
    	primo.sommaB(100);
    	System.out.println("Dopo alle modifiche: ");
    	System.out.println("primo.getA(): "+primo.getA());
    	System.out.println("primo.getB(): "+primo.getB()+"\n");
    	System.out.println("secondo.getA(): "+secondo.getA());
    	System.out.println("secondo.getB(): "+secondo.getB());
      }
    }
    Output:

    codice:
    Prima di operare modifiche:
    
    primo.getA(): 5
    primo.getB(): 0
    
    secondo.getA(): 5
    secondo.getB(): 0
    
    Ora modifichiamo i valori..
    
    Dopo alle modifiche:
    primo.getA(): 15
    primo.getB(): 100
    
    secondo.getA(): 5
    secondo.getB(): 100

    Come puoi notare, alla variabile a della classe EsempioStatic come valore di default a 5, mentre la variabile statica ha valore 0. Alla prima stampa infatti osserviamo come entrambi i nostri oggetti "primo" e "secondo" abbiano come valore di getA() (ovvero la variabile a) il valore 5 e per la b il valore 0.

    Come puoi vedere, dopo alla modifica delle variabili a e b dell'oggetto primo, la variabile a cambia valore, diventa 15, e la variabile b 100, proprio come abbiamo deciso noi.
    Quando stampiamo le variabili a e b dell'oggetto secondo vediamo che il valore di a è rimasto quello di partenza, ovvero 5, mentre quello di b è lo stesso dell'oggetto primo!

    La variabile a è una variabile di istanza, quindi viene creata una copia di quella variabile per ogni oggetto. Mentre per una variabile static non avviene la stessa cosa...in sostanza quella variabile è condivisa da tutti gli oggetti che creeremo.

    I metodi statici sono diversi..evito anche di accennarli.

    La parola chiave this si riferisce all'oggetto corrente, generalmente viene utilizzata nei costruttori e nei metodi setter per evitare di utilizzare un parametro di un metodo diverso dalla variabile di istanza.
    Guarda qui:
    codice:
    class MiaClasse {
      private int a,b;
    
      MiaClasse(int a, int b) {
        this.a = a;
        this.b = b;
      }
      // metodi ecc.
    
    }
    Qui, se non usassimo il this, la variabile a di MiaClasse avrebbe il valore che assegna Java di default, ovvero 0. Questo perchè quando si hanno 2 variabili con lo stesso nome, una nasconde l'altra.

    Cerco di spiegarmi meglio:
    il this si riferisce all'oggetto corrente. Nella forma vista li sopra, diciamo "prendi la variabile a di questo (this) oggetto ed assegnale il valore del parametro a" (stessa cosa per b ovviamente).

    Se noi levassimo il this useremmo la variabile a, ma non quella della classe..bensì il parametro del costruttore! Quindi sarebbe come scrivere (supponiamo di passare come parametri a = 5 e b = 10)
    codice:
    MiaClasse(int a, int b) {
      a = a; // (parametro) a (5) = (parametro) a (5);
      b = b; // Idem come sopra, ma con il valore 10
    }
    Quindi grazie al this, diciamo a java che la variabile a di MiaClasse è uguale al parametro a.

    Ovviamente, il this riferendosi all'oggetto corrente, permette di chiamare un metodo che si trova nella stessa classe.
    Esempio stupido; immagina una classe che contiene questi metodi (mi viene in mente solo questo esempio al momento, perchè è semplice e veloce xD)
    codice:
    class Numeri {
      // variabili e costruttore...
    
      boolean controlla(int n) {
        if(n %2 == 0) return true;
        else return false;
      }
    
      boolean isPari(int n) {
        return controlla(n);
      }
    }
    ora questo
    codice:
    class Numeri {
      // variabili e costruttore...
    
      boolean controlla(int n) {
        if(n %2 == 0) return true;
        else return false;
      }
    
      boolean isPari(int n) {
        return this.controlla(n);
      }
    }
    Nel primo esempio viene chiamato il metodo controlla passando n come parametro. E' ovvio si stesse chiamando il metodo controlla di quella classe, quindi all'interno dell'oggetto che stiamo manipolando ora! Ma nessuno ci vieta di fare come nel secondo esempio, dove poniamo il this davanti a controlla. Questo è inutile, poichè come già detto, ci si riferisce all'oggetto corrente (quindi nel caso 2 stiamo dicendo "chiama il metodo controlla(n) su questo oggetto")


    Ovviamente capita di utilizzare spesso la forma che ti ho mostrato sopra riguardo alle variabili di istanza.
    Ora non so se per l'orario o perchè ho detto tutto, non mi vengono altri esempi di utilizzo.

    Spero di essere stato chiaro!

  5. #5
    Originariamente inviato da Patrick Jane
    Questo esempio (banale) ti chiarirà le cose:
    [code]
    ...
    private static int b;

    int getB() {
    return b;
    }

    void sommaB(int n) {
    b +=n;
    }

    }
    Concettualmente è assolutamente errato fare una cosa del genere. Così gli confondi solo le idee.

    Poi riguardo al this non dici nulla di nuovo rispetto alla guida ufficiale sopra linkata.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    anche se non è vietato dal compilatore ho sempre visto le modifiche a campi statici all'interno di metodi statici (per meglio differenziare ed evidenziare il comportamento di classe degli stessi)

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da VincenzoTheBest
    Concettualmente è assolutamente errato fare una cosa del genere. Così gli confondi solo le idee.

    Poi riguardo al this non dici nulla di nuovo rispetto alla guida ufficiale sopra linkata.
    Riguardo al this ti posso assicurare che non ho preso lo stesso testo dal sito ufficiale, poichè non l'ho nemmeno mai letto dal sito ufficiale lol ..da dire è tutto li, ho scritto tutto quello che conoscevo io.

    Riguardo all'altro esempio, in effetti avrei dovuto farlo diverso. Il tuo è senza dubbio azzeccato...mi sono accorto dopo che lo stavo praticamente scrivendo uguale, e vista l'ora ho scritto quelle 2 righe che ho postato.

    So che come utilizzo è errato (soprattutto quando l'ho riguardato oggi ad un ora più favorevole). Chiedo venia.

    Il miglior utilizzo di una variabile static è proprio avere una risorsa condivisa da più oggetti (come appunto un contatore di conti bancari).

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 © 2025 vBulletin Solutions, Inc. All rights reserved.