Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JAVA] Teoria: Principio di incapsulamento

    Ciao a tutti!

    Vi disturbo solo per capire questo principio
    Principio di incapsulamento:

    Lo stato interno di un oggetto può essere
    letto e modificato solo invocando i suoi metodi.

    Le variabili di istanza sono nascoste al programmatore che utilizza una classe, e riguardano solo il programmatore che implementa la classe.
    -Cosa si intende per "stato interno di un oggetto"?
    -E per variabili di istanza? Sono tutte le variabili di una classe?
    -E per programmatore che "utilizza" una classe?
    Gato

  2. #2
    Ti rispondo con un esempio molto banale. Immagina di avere la classe Automobile che espone i metodi accendiMotore(), spegniMotore(), accelera() e frena(). Tramite tali metodi potrai utilizzare la classe Automobile impostando e modificando il suo stato interno (motore acceso o spento, auto in movimento oppure ferma ecc.). Senza minimamente conoscere il suo funzionamento interno ed i valori delle variabili di istanza che verranno accedute e modificate solo atteaverso i metodi esposti.
    Tu utilizzerai la classe in un modo simile:

    codice:
    Automobile auto = new Automobile();
    auto.accendiMotore();
    auto.accelera();
    auto.frena();
    auto.spegniMotore();
    ...
    se la necessita di conoscere il suo funzionamento interno.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    1) Lo stato di un oggetto è il valore delle sue variabili dette attributi ad esempio supponiamo di avere
    codice:
    public class Persona
    { 
       String nome;
       String cognome;
       int eta;
    }
    un possibile stato di questa classe è (Pinco,Palla,35)


    2)Le variabili di istanza sono proprio quelle che definiscono lo stato di una classe ovvero tutte le variabili (e quindi non costanti) non statiche. Le variabili statiche che si definiscono con il costrutto static sono invece definite variabili di classe

    3)Programmatore che utilizza una classe è appunto un programmatore che utilizza una classe. Ad esempio si può utilizzare classi di pacchetti standard tipo la classe ArrayList che è un oggetto per implemntare un array, ma è possibile che noi stessi si implementino classi che poi verranno usate da altri programmatori o da noi stessi. E' inutile tutte le volte reinventare la ruota

  4. #4
    Grazie ad entrambi per la risposta!!

    Ok, quindi Pippo può essere il programmatore che ha scritto il codice per operare sui PDF e per farlo ha implementato una carta classe, mentre noi che ne usufruiamo siamo i programmatori che la utilizzano...era proprio in senso letterale, era questo che non capivo!

    Invece lo stato interno di un oggetto è il valore che assume ogni sua variabile, è corretto?

    2)Le variabili di istanza sono proprio quelle che definiscono lo stato di una classe ovvero tutte le variabili (e quindi non costanti) non statiche. Le variabili statiche che si definiscono con il costrutto static sono invece definite variabili di classe
    Quindi le variabili di istanza sono quelle che appunto danno lo stato di un oggetto, giusto?
    Gato

  5. #5
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    esatto piccolo esempio

    codice:
    public class Persona
    {
          public String nome; //Prima variabile di Istanza pubblica
          private int eta;  //Seconda variabile di Istanza privata
          public static int numero; //Variabile di Classe (senza senso ma per farti un esempio)
    
    
          public Persona(String nome, int eta)//Costruttore
          {
                 numero++;
                 this.nome=nome;
                 if(eta>=0)
                 { 
                     this.eta=eta;
                  }
                  else 
                  {
                      this.eta=0;//ma si può anche lanciare eccezione per bloccare tutto
                   }
          }
    
          public void stampaPersona()
          {
                  System.out.println("Nome "+nome+" - Eta "+eta+" - Numero "+numero);
          }
    
          public int getEta()
         {
              return eta;
         }
       
         public void setEta(int eta)
         {
                if(eta>=0)
                 { 
                     this.eta=eta;
                  }
                  else 
                  {
                      this.eta=0;//ma si può anche lanciare eccezione per bloccare tutto
                   }
          }
    }
    lo stato di una istanza della classe Persona è quindi dovuta alla coppia di valore nome,età e non da numero che è una variaible di classe e non è neanche necessario che esista una istanza per poterla usare. Per esempio

    codice:
     public static void main(String[] args)
     {
            Persona.numero=6;
            System.out.println(Persona.numero);//Output 6 (ancora non istanziato nessun 
            //oggetto ma posso usare numero, se tentassi di fare Persona.nome="Pippo" riceverei 
            //un errore perchè se anche nome è pubblico deve essere associato a una istanza
    
            Persona pluto=new Persona("Pluto",23); //Stato di pluto (pluto,23)
            System.out.println(Persona.numero);//Output 7 (incrementato dal costruttore)
            pluto.stampaPersona();//Output Nome pluto - eta 23 - numero 7
            //se ora tenti di fare pulto.eta=-3; ti verrà dato un errore in compilazione
            //poichè eta è una variabile privata e questo è una forma di controllo
            //per chi utilizzerà la mia classe Persona puoi invece fare
            pluto.setEta(-3);//eta verà settata a 0 non esiste una persona con eta negativa
            pluto.stampaPersona();//Output Nome pluto - eta 0 - numero 7 
           //come si può notare una istanza può variare stato nel corso del programma
           //nuovo stato di pluto (pluto,0)
    
             Persona pippo=new Persona("topolino",2); //Stato di pippo (topolino,2)
            System.out.println(Persona.numero);//Output 8 (incrementato dal costruttore)
            pippo.stampaPersona();//Output Nome topolino - eta 2 - numero 8
            pluto.stampaPersona();//Output Nome pluto - eta 0 - numero 8
            //si puo notare che numero non dipende dalle istanze ma numero
            // è una variabile della classe Persona e ce n'è solo una quindi 
            //comunque la si stampi il valore è unico
      }
    spero di essere stato il + chiaro possibile ciao ciao

  6. #6
    Cavoli più chiaro di così...Grazie mille finalmente qualcuno di veramente esauriente!!
    Gato

  7. #7
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    dunque ora che hai le basi puoi capire il concetto di incapsulamento.
    Tutte le variabili di istanza della classe sono private e quindi puoi agire sul suo stato di una istanza solo invocando i metodi (Per esempio setEta o getEta) e questo permette al programmatore che implementa una classe di avere una forma di controllo sul programmatore che poi la userà (Per esempio non puoi mettermi una età negativa)

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