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

    aiuto esercizio oggetto-attributi-metodo

    buongiorno
    devo svolgere un esercizio, nel quale definire gli attributi e i metodi dell' oggetto lampada.

    come attributi ho pensato al numero di watt e allo stato acceso/spento

    come metodo ho pensato al metodo accendi, che dovrebbe modificare lo stato dell' oggetto in modo che quest' ultimo si dichiari acceso

    il problema è tradurre questo in codice, in particolare per far funzionare il metodo..

    codice:
    package lampada;
    
    /**
     *
     * @author 
     */
    public class Lampada {
    
    
        
        int Nwatt;
        boolean acceso;
        
        public int accendi(Lampada chi){chi.acceso(true);
    }
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
        }
        
    }
    grazie per i consigli

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Come l'hai gestita tu non ha molto senso.

    1) Perchè il metodo accendi() (che non è statico) dovrebbe ricevere un oggetto Lampada come parametro? Io mi aspetterei che invocando il metodo accendi() su un oggetto Lampada, sia proprio questa lampada ad accendersi... e non essendo statico, lui sa già su chi deve agire (agirà sull'oggetto che lo sta invocando).

    2) Perchè il metodo accendi() dovrebbe ritornare un numero intero? Se invocassi il metodo accendi() su un oggetto lampada io non mi aspetterei da lui di ricevere un bel niente... al massimo il metodo potrebbe fornirmi un valore booleano che mi dice se la lampada si è effettivamente accesa oppure no, ma questo esula completamente dal contesto.

    Quindi, quel metodo io lo rivedrei completamente in un ottica più logica: se invoco il metodo accendi() su una Lampada, questa deve modificare il proprio stato. Il metodo non deve ritornare nulla (non ha alcun senso) e non deve ricevere nulla come parametro (ha già tutte le informazioni per fare il suo dovere, senza che nessuno gli dia parametri).

    Prova a modificare il metodo in questo modo e posta, quindi, la soluzione che ritieni essere più corretta.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    grazie Lele.. mi sono avvicinato un po' alla soluzione, ma..
    penso che l' errore stia nella definizione del metodo (tra le parentesi graffe)
    ho provato a inserire nella definizione del metodo il tipo void, e a chiedere un valore booleano come ritorno..ma qui sbaglio, non riesco a farmi ritornare niente...


    codice:
    /* * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package lampada;
    
    
    /**
     *
     * @author 
     */
    public class Lampada {
    
    
        
        int Nwatt;
        boolean acceso;
        
        public void accendi(Lampada lamp) {lampada.lamp.acceso = true};
    
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
    
    Lampada lamp = new Lampada
    lamp.accendi()
            // TODO code application logic here
        
    
    
        
        
    }
    }
    si tratta solo di correggere il corpo del metodo?

    grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Veramente tu stai continuando a scrivere un metodo che vuole un parametro (hai tolto l'inutile valore di ritorno). Come già detto, io mi aspetto che quel metodo non prenda alcun parametro. Il corpo del metodo, inoltre, è assolutamente sbagliato: chi è "lampada" (con la L minuscola)? Nessuno... e anche se fosse in maiuscolo (nome della classe), al suo interno non c'è alcun attributo statico chiamato "lamp"...

    Mi sa che ti stai perdendo in un microscopico bicchierino d'acqua... l'implementazione del metodo è di una banalità disarmante, se pensi bene a cosa deve fare e come deve essere invocato.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    eccomi. grazie Lele, se hai ancora pazienza ti chiedo ancora una cosa..(ho corretto l' implementazione del metodo:

    codice:
    /* * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package lampada;
    
    
    /**
     *
     * @author 
     */
    public class Lampada {
    
    
        
        int Nwatt;
        boolean acceso;
        
        public void accendi(Lampada lamp) {boolean acceso = true;
    };
    
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
    
    Lampada lamp = new Lampada
    Lampada.lamp.accendi(acceso);
            // TODO code application logic here
        
    
    
        
        
    }
    }
    mi rimane un errore, alla riga della chiamata del metodo. (Lampada.lamp.accendi(acceso))

    una volta corretto il programma vorrei poter vedere l' utilità del metodo. cioè vedere cosa succede quando lo chiamo. e magari trovare delle differenze tra l' oggetto prima di chiamare il metodo e l' oggetto dopo la chiamata.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Forse non mi sto spiegando bene o, probabilmente, non hai familiarità con i nomi tecnici.
    Faccio uno schemino prendendo come esempio il metodo "main":

    codice:
    public static void main(String[] args)
      ^      ^      ^    ^     ^       ^
      |      |      |    |     |       +---- nome del parametro
      |      |      |    |     +------------ tipo del parametro
      |      |      |    +------------------ nome del metodo
      |      |      +----------------------- tipo di ritorno
      |      +------------------------------ modificatore
      +------------------------------------- tipo di accesso

    Questo è il classico metodo main. Come ogni altro metodo ha in comune la sua struttura.
    Il metodo main è costituito dai seguenti componenti: un tipo di accesso, un modificatore, un tipo di ritorno, il nome del metodo, un parametro (il parametro è a sua volta identificato da un tipo e da un nome).

    Quando nei miei messaggi precedenti ti ho detto che il metodo accendi() non dovrebbe avere alcun parametro, parlavo, appunto, di quelle cose che vengono messe tra le parentesi tonde del metodo. Un metodo può avere dei parametri (il main ne ha uno, si chiama "args" ed è di tipo String[]), ma può anche non averne (perchè non è obbligatorio che al metodo venga passato qualcosa perchè funzioni). E' il caso del metodo accendi; secondo la logica, un metodo come quello non dovrebbe ricevere alcun parametro, perchè lui sa già chi è che deve essere acceso: l'oggetto su cui viene invocato.

    Quindi, per prima cosa, io sistemerei quel metodo: la chiamata è un'altra cosa senza alcun senso... La classe Lampada, come già detto, non possiede alcun attributo statico chiamato "lamp".

    Quando tu scrivi Lampada.lamp stai cercando di riferirti ad una variabile statica definita dentro la classe Lampada... la tua classe Lampada, come già detto, non ha alcuna variabile statica, quindi scrivere Lampada.qualcosa non ha nessun senso (se non per il main, ma è addirittura più senza senso di quell'altra cosa).

    Quindi "Lampada.lamp" è una cosa che non esiste ed il compilatore lo sa e te lo segnala.


    Ciao.
    Ultima modifica di LeleFT; 29-01-2015 a 17:36
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    grazie Lele. sono riuscito a risolvere

  8. #8
    però, Lele, in riferimento alla prima parte di questo tuo post: io sono riuscito a risolvere l' esercizio inserendo un parametro all' interno del metodo accendi: (se tolgo i parametri nella dichiarazione e nella chiamata, dà errore all' esecuzione

    codice:
    /* * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package lampada;
    
    
    /**
     *
     * @author 
     */
    public class Lampada {
    
    
        
        int Nwatt;
        boolean acceso;
        
        public void accendi(Lampada lamp) {acceso = true;
    };
    
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
    
    
    Lampada lamp = new Lampada();
    lamp.accendi(lamp);
            // TODO code application logic here
        
    
    
        
      System.out.println(lamp.acceso);
    }
    }

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    codice:
    public class Lampada {
       private int nWatt;
       private boolean acceso = false;
    
       public void accendi() {
          acceso = true;
       }
    
       public boolean isAcceso() {
          return acceso;
       }
    
       public static void main(String[] args) {
          Lampada lamp = new Lampada();
          System.out.println("La lampada è: " + (lamp.isAcceso() ? "ACCESA" : "SPENTA"));
          lamp.accendi();
          System.out.println("La lampada è: " + (lamp.isAcceso() ? "ACCESA" : "SPENTA"));
       }
    }

    Fine.


    Ciao.
    Ultima modifica di LeleFT; 29-01-2015 a 19:25
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    bè Lele... grazie!

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.