Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085

    creazione classe .. con main

    Ciao ..
    prendendo spunto da un esempio che trovo nel manuale del sito (Guida Java) avrei bisogno di un piccolo chiarimento su dei concetti base (siamo proprio all'ABC) ..

    l'esempio in questione (per spiegare la valorizzazione delle variabili) è il seguente:

    codice:
    class p
    {
      int X,Y,Z;
      
      public p()
      {
        X = 10;
        Y = X;
        Z = X + Y;
        System.out.println ("All'inizio ho: X="+X+", Y="+Y+", Z="+Z);
        
        X = X + 1;
        Y = Z - X;
        System.out.println ("Effettuo le operazioni: \nX = X + 1;\nY = Z - X;\ned ottengo:"); 
        System.out.println ("X="+X+", Y="+Y+", Z="+Z);
      }
    }
    
    class decl
    {
      public static void main(String[] a)
      {
        p Prova=new p();
      }
    }
    il commento del manuale è il seguente:.


    come sapete, visto che decl è la classe che contiene il main dovete editare il programma in un file chiamato decl.java, poi eseguitelo e vedete cosa succede. Vi sono anche altri attributi per far vedere l'uso dei modificatori.
    Dall'esempio si vede che io ho creato una classe p e ne ho instanziato l'oggetto Prova, invocandone il costruttore. Questo l'ho dovuto fare perché le variabili sono degli attributi, e quindi, se non sono static, sono attributi di un oggetto, per questo motivo ho dovuto creare un oggetto per potere lavorare con le sue variabili. Abituatevi a programmare sotto questa ottica, perché i programmi Java sono tutti così. Siccome il main del programma DEVE essere dichiarato static (e deve avere una stringa come perametro) esso viene eseguito in assenza dell'oggetto, e quindi delle variabili non statiche.


    quindi ..

    da quello che ho capito dovrei creare un file 'main' (con lo stesso nome della classe) dove inserire appunto la classe 'decl', e un altro file (con nome a piacere) dove inserire la classe 'p'.
    Ho provato la cosa e funziona perfettamente.
    I dubbi sono però i seguenti:
    1) anche se nomino il file del main con nome diverso .. funziona tutto regolarmente
    2) se eseguo il file che contiene solo la classe 'p' .. funziona tutto regolarmente (quindi anche senza che sia stato istanziato l'oggetto prova
    3) nei commenti si parla di costruttore, ma da quello che vedo (e in base a quello che ho letto in precedenza sui 'costruttori', mi sembra di essere
    difronte ad una semplice assegnazione di valore ..


    X = 10;
    Y = X;
    Z = X + Y;



    L'esempio di costruttore che mi era stato fatto vedere a suo tempo, prevedeva una struttura che permetteva l'inizializzazione al momento dell'istanza dell'oggetto:


    codice:
    class Persone                                                     	
    {                                                                	  
        // --> Proprietà                                                
      public int annodinascita;                                         
      public String cognome=new String();                               
                                                                        
        //-->  Costruttori                                              
      public Persone(int default_annodinascita)                                                                            
      {this(default_annodinascita, "Non Conosco");  }                   
                                                                     	  
      public Persone(String default_cognome)                            
      {this(0, default_cognome);        }                               
    																																		
      public Persone(int default_annodinascita, String default_cognome) 
      {                                                                 
        this.annodinascita = default_annodinascita;                     
        this.cognome = default_cognome;                                 
      }                                                                 
                                                                     	  
        // --> Metodo che calcola l'età del soggetto                    
      public int calcolaeta (int annoattuale)                        	  
        {return (annoattuale - annodinascita);}                         
    }
    con istanza e relativa valorizzazione ..

    codice:
    Persone Pietro = new Persone(1974);

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: creazione classe .. con main

    Originariamente inviato da JANUS70
    Ciao ..
    prendendo spunto da un esempio che trovo nel manuale del sito (Guida Java) avrei bisogno di un piccolo chiarimento su dei concetti base (siamo proprio all'ABC) ..

    l'esempio in questione (per spiegare la valorizzazione delle variabili) è il seguente:


    da quello che ho capito dovrei creare un file 'main' (con lo stesso nome della classe) dove inserire appunto la classe 'decl', e un altro file (con nome a piacere) dove inserire la classe 'p'.
    Ho provato la cosa e funziona perfettamente.
    I dubbi sono però i seguenti:
    1) anche se nomino il file del main con nome diverso .. funziona tutto regolarmente
    2) se eseguo il file che contiene solo la classe 'p' .. funziona tutto regolarmente (quindi anche senza che sia stato istanziato l'oggetto prova
    3) nei commenti si parla di costruttore, ma da quello che vedo (e in base a quello che ho letto in precedenza sui 'costruttori', mi sembra di essere
    difronte ad una semplice assegnazione di valore ..
    ecco perché odio le guide, danno le cose a metà (per ovvi motivi di spazio e tempo).
    Allora in java ogni classe pubblica è contenuta all'interno di un file che si chiama come la classe. Se tu hai la classe pubblica Persona questa deve essere contenuta all'interno del file Persona.java.

    Il main è un caso a parte: deve essere presente un punto di partenza, in genere si mette dentro una classe pubblica (non c'è niente fuori dalle classi) che puoi chiamare Pippo, Pluto o come ti pare, ma al suo interno avrà un metodo

    codice:
    public static void main(String []arf);
    in cui

    1. public lo rende accessibile dall'esterno
    2. static per ora ti basta sapere che è una proprietà di classe e non di istanza ed è necessario per avere un punto di partenza valido
    3. void tipo di ritorno

    Ho parlato esplicitamente di classe pubblica perché ci sono dei casi in cui un file ha al suo interno più classi, una sola pubblica il cui nome è uguale al nome del file, quante ne vuoi private e/o protected.
    Per buona norma di programmazione usa le classi inner il meno possibile.

    Il costruttore non è un qualcosa nata per assegnare valori e basta: ha una logica ed è quella di rendere l'oggetto consistente in automatico al momento della creazione.
    In linguaggi non ad oggetti come il C la classe con molta fantasia somiglia ad una struct, per la struct bisogna cmq inizializzare i valori e lo fa l'user.
    Con il concetto di classe, di wrapping delle proprietà è la classe, al momento della creazione, a darsi uno stato consistente e lo fa attraverso le istruzioni del costruttore.
    Il caso banale è quello appunto di assegnare valori.

    Se vuoi davvero imparare java lascia perdere le guide e segui un buon testo

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    Visto che la questione mi sembra fondamentale per il proseguo del pseudo corso, vediamo di fare il punto della situazione di quello che ho capito, così vediamo se è tutto corretto.
    In più avrei anche un paio di dubbi ..

    1) un programma (classe) per partire deve essere inserito in un file (java) con lo stesso nome della classe, deve essere un 'main', e deve contenere un evento con le seguenti caratteristiche:
    - public
    - static
    - void
    - un parametro 'string array'

    -> public static void main(String[] xxx)

    eventuali proprietà dichiarate per la classe devono essere 'static'

    -> static int NOME = 0;

    2) un programma (main) oltre che ad eseguire le istruzioni del proprio evento, può richiamare (far partire) altri programmi (classi) presenti in altri file, attraverso l'istanza dell'oggetto della classe richiamata, facendo partire l'esecuzione del suo evento, dentro al quale evento, può essere fatta l'inizializzazione dei suoi attributi, oppure se è stato previsto un costruttore
    l'inizializzazione degli stessi attributi viene fatta al momento dell'istanza dell'oggetto dalla classe main, attribuendo in parentesi il valore desiderato.

    Persone Pietro = new Persone(1974);


    La chiamata della classe tramite altra classe main prevede:

    Nel caso di inizializzazione tramite istanza, è necessario che attributi e costruttori siano dichiarati 'pubblici', e che gli attributi non siano doppi nel tipo, in modo che al momento dell'istanza il valore numerico, piuttosto che la stringa si associ in maniera univoca al relativo attributo.

    L'evento della classe 'richiamata' deve sempre essere dichiarato 'pubblico'


    dubbi:

    1)
    si parla di classe pubblica ..
    però di pubblico o non pubblico, io vedo solo gli attributi (alcuni possono essere pubblici, altri no), i costruttori e gli eventi, non una classe.

    2)
    una classe può avere più di un evento ?

    Grazie mille

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    il main non è un evento, è un metodo a tutti gli effetti.
    Per convenzione devi avere un punto di partenza per ogni programma, per definizione in Java è il main con quella signature.
    Visto che ogni metodo è all'interno di una classe, ergo serve una classe pubblica (il cui nome è lo stesso del file) in cui è contenuta.

    Non è detto che ogni proprietà del main sia static: ogni cosa che è riferita da un ambito static deve essere static.
    Puoi avere la tua classe Pippo con dentro un metodo statico ogni variabile di classe che riferisci da lì deve essere statica.
    Nel main nessuno ti vieta di inserire roba non statica (che è preferibile).

    codice:
    public class Main{
        
        private String stringa; 
    
         public Main(){
             stringa = "Ciao "; 
         }
    
         public static void main(String ar[]){
             Main main = new Main(); 
             main.print();
         }
    
         public void print(){
             System.out.println(stringa);
        }
    }
    questo codice è funzionante, la classe che contiene il main è una normalissima classe con attributi non statici.
    Occhio alla terminologia, se tu hai un'altra classe e dici nel main

    Pippo pippo = new Pippo();

    non fai partire un altro programma, non sei uscito, crei una nuova istanza della classe object.

    Il costruttore serve a dare all'istanza uno stato consistente, può anche essere private, protected o non esistere.
    Nel caso in cui non esista il compilatore ne costruisce uno vuoto di default. Nel caso in cui ne metti almeno uno da quello devi passare per costruire un oggetto.
    Costruttori private/protected rispondono a particolari esigenze che tu ancora non conosci.

    I metodi possono essere pubblici/private/protected, serve a cambiare lo scope degli stessi.

    la classe ha sempre il suo modificatore, che è bene specificare. In genere le inner sono private/protected, le altre public.

    La classe può avere tutti i metodi che vuoi, non per forza uno.
    Non parlare impropriamente di eventi e programmi.
    Infine lascia perdere le guide e procurati un buon testo come java core 2

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    [b]

    codice:
    public class Main{
        
        private String stringa; 
    
         public Main(){
             stringa = "Ciao "; 
         }
    
         public static void main(String ar[]){
             Main main = new Main(); 
             main.print();
         }
    
         public void print(){
             System.out.println(stringa);
        }
    }
    Creado di aver capito abbastanza ..
    Solo un paio di cosette ..
    Qual'è il motivo per cui si dichiara 'public' una classe ? .. le classi non sono 'viste' da tutti ?
    Avevo capito che poi dipende dalle variabili e dai metodi se essendo pubblici o meno, possono essere gestiti dall'esterno ..

    ah .. cos'è un 'inner' ?

    Grazie mille

    PS. hai in mente qualcosa in particolare quando dici 'procurati un buon testo come java core 2' ?

  6. #6
    Una inner class è una classe contenuta all'interno di un'altra classe e queste in genere sono dichiarate private. Ad esempio:

    codice:
    public class Prova {
    
    	public Prova() {
    		...
    	}
    	
    	private class InnerClass {
    		...
    	}
    
    }
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Ti dico che di procurarti un testo e lasciare perdere le guide (la rovina di chi si accosta ad un linguaggio di programmazione per la prima volta) perché dalle domande che fai e dai commenti si deduce chiaramente che hai delle lacune sulle basi della programmazione ad oggetti.
    Ancora non ti è chiaro il concetto di scope e di come si creano le classi, del motivo delle convenzioni in java e dei default che vengono presi

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    mi fare un nome di un buon testo ?

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    java core 2 è uno buono

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    Ok grazie
    è in italiano .. spero ?

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.