Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143

    [JAVA] Esercizi semplici

    Ciao, ho due esercizi semplici su cui ho qualche dubbio.

    1) Ho un programma del genere e devo dire cosa mi stampa il main.
    codice:
    class A {
       int x;
    }
    class PP {
       static void metUno(int a) {
          a = 0;
       }
       static void metDue(int[] a) {
          a[0] = 0;
       }
       static void metTre(int[] a) {
          a = null;
       }
       static void metQuattro(A a) {
          a = null;
       }
       static void metCinque(A a) {
          a.x = 0;
       }
       public static void main(String[] args) {
           int i1 = 5;
           metUno(i1);
           System.out.println(i1);
           int[] a1 = new int[] {5, 5};
           metDue(a1);
           System.out.println(a1[0]);   
           int[] a2 = new int[] {5, 5};   
           metTre(a2); 
           System.out.println(a2[0]);
           A o1 = new A();
           o1.x = 5;
           metQuattro(o1); 
           System.out.println(o1.x);
           A o2 = new A();
           o2.x = 5;
           metCinque(o2); 
           System.out.println(o2.x);
       }
    }
    La soluzione mi dice che viene stampato: 5 0 5 5 0. Qualcuno mi spiega il perchè?
    Io avrei detto che viene stampato: 0 0 null null 0. Inoltre non ho capito cosa fa metCinque e o2.x = 5 cosa vuol dire?

    2) Dato questo programma

    Devo dire cosa stampa il main in questi casi:
    • a. X è 0, Y è A
      b. X è 0, Y è B
      c. X è 1, Y è A
      d. X è 1, Y è B

    Qui non ho proprio capito l'esercizio, cosa sono X, Y, A e B?


    Grazie in anticipo!

  2. #2
    il primo a mimo parere stampa 5 0 null null 0 intanto ti spiego il primo 5, cosa fa metCinque e o2.x = 5;

    Allora se tu passi a un metodo una variabile di tipo primitivo (int double float char ..) il metodo non modifica la variabile che gli hai passato ma se ne fa una copia e modifica la copia quindi la variabile che tu gli hai passato, nel tuo caso i1 resta invariata, mente se un metodo come parametro vuole un oggetto o un'array questo non viene copiato e quindi viene modificato come succede negli altri casi.

    l'istruzione o2.x = 5 è un'assegnazione. siccome o2 è un oggetto di tipo A (la classe che è dichiarata sopra) questo contiene delle "sotto variabili" che nel tuo caso sono pubbliche siccome sono stati dichiarate con "int x;" senza mettere la parola privat davanti, questo vuol dire che possono essere modificate dall'esterno dell oggetto.
    Quindi creando un oggetto "A o1 = new A();" con l'istruzione o1.x accediamo alla variabile x contenuta in o1 e ponendola = 5 diamo il valore 5 alla x contenuta in o1;

  3. #3
    il secondo esercizio ha qualcosa che non quadra siccome non ci sono variabili X e Y nel programma.. controlla bene che non stai sbagliando programma

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: [JAVA] Esercizi semplici

    Originariamente inviato da andreaben94
    Allora se tu passi a un metodo una variabile di tipo primitivo (int double float char ..) il metodo non modifica la variabile che gli hai passato ma se ne fa una copia e modifica la copia quindi la variabile che tu gli hai passato, nel tuo caso i1 resta invariata, mente se un metodo come parametro vuole un oggetto o un'array questo non viene copiato e quindi viene modificato come succede negli altri casi.
    Non è proprio così, il passaggio dei parametri in Java avviene sempre per copia ed il valore viene sempre copiato nel parametro. Però le variabili dichiarate con tipi primitivi contengono i dati, mentre quelle dichiarate come oggetti contengono reference (indirizzi) ai dati veri e propri.

    Originariamente inviato da andreaben94
    nel tuo caso sono pubbliche siccome sono stati dichiarate con "int x;" senza mettere la parola privat davanti, questo vuol dire che possono essere modificate dall'esterno dell oggetto.
    public è una cosa, private è un altra ed il non mettere niente è un'altra ancora. Una variabile dichiarata senza modificatore d'accesso è visibile solo al package, non a tutti come le variabili public.

    Riguardo al quarto caso:

    codice:
    static void metQuattro(A a) {
      a = null;
    }
    codice:
    A o1 = new A();
    o1.x = 5;
    metQuattro(o1); 
    System.out.println(o1.x);
    Il metodo non fa nulla, assegna al parametro (che è pur sempre una variabile locale, come se fosse dichiarata all'interno del metodo) il valore null e termina, non influenzando l'"esterno". Quindi l'invocazione di metQuattro non ha effetti. Per altro, modificare i parametri non è una buona pratica.
    A questo punto il codice è semplice, crea un oggetto A, assegna il valore 5 al suo campo x e lo stampa.

    Nel terzo caso, succede la stessa cosa.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Grazie mille per la risposta! Sei stato molto chiaro. Ho provato il programma ed effettivamente stampa 5 0 5 5 0. Penso di averli capiti tutti apparte il metTre(). Perchè non stampa null?

    Il secondo esercizio è così, non è sbagliato..

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da vfldj
    Grazie mille per la risposta! Sei stato molto chiaro. Ho provato il programma ed effettivamente stampa 5 0 5 5 0. Penso di averli capiti tutti apparte il metTre(). Perchè non stampa null?

    Il secondo esercizio è così, non è sbagliato..
    metTre e metQuattro fanno la stessa cosa, non puoi capirne uno e non capire l'altro. Il motivo per cui non stampa null è quello che ho scritto nel post precedente, ricorda che gli array sono oggetti e come tali vengono trattati.

    Per il secondo esercizio, non c'è nessuna X e nessuna Y, come facciamo ad aiutarti? Chiedi delucidazioni a chi te lo ha assegnato e/o a qualche compagno.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Va bene, grazie ugualmente

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Se invece ho
    codice:
    class A {
       void metodo1(int x) {
           System.out.printll("Istruzione 1, valore x: " + x );
           metodo2(x);
       }
       void metodo2(int y) {
           System.out.println("Istruzione 2, valore x: " + y);
       }
    }
    
    class B extends A {
       void metodo2(int x){
           System.out.println("Istruzione 3, valore x: " + x);
           super.metodo2(x);
       }
    }
    
    class ProvaExtends {
       public static void main (String[] args) {
       A a = new A();
       B b = new B();
       A c = new B();
       a.metodo2(10);
       b.metodo1(20);
       c.metodo1(30);
       }
    }
    posso scrivere A c = new B() ma non B c = new A(), giusto? Se si perchè?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da vfldj
    posso scrivere A c = new B() ma non B c = new A(), giusto? Se si perchè?
    Perchè "c" è di tipo "A" e qualunque sua sottoclasse è di tipo A.... quindi gli puoi assegnare qualunque cosa sia una sua sottoclasse.

    Mentre non è vero il contrario... è come con le figure dell'altro post: a un oggetto di tipo Figura puoi assegnare qualsiasi figura (un Cerchio, un Triangolo, un Quadrato), ma non è vero il contrario... cioè, ad un Cerchio non puoi assegnare una figura qualunque (quindi, non puoi assegnargli un Triangolo e nemmeno un oggetto Figura che, per sua natura, può essere qualunque cosa).

    PS: non è questo il modo di condurre le discussioni nel forum. Ho lasciato correre inizialmente perchè tutta la discussione era incentrata su un argomento abbastanza preciso, ma ora si sta divagando: il forum non è il luogo in cui chiedere di svolgere degli esercizi... casomai si pone la propria soluzione e si chiede come mai non funzioni o come mai sia errata.

    Devo chiudere la discussione.


    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

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.