|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
[Java] Aiuto problema classi
Non riesco a capire un esercizio di java, speravo potevate aiutarmi. Il testo prevede le seguenti classi:
Codice:
public class A { static int a; int b; public A() { this(++a); } public A(int x) { b = x+2; } public String toString() { return "a = " + a + " b = " + b; } } Codice:
class B extends A { int b; public B() { b = a; } public String toString() { return super.toString() + "\n" + "a = " + a + " b = " + b; } } Codice:
public class Prova { public static void main(String[] args) { B b = new B(); System.out.println(b.toString()); } } Codice:
a = 1 b = 3 a = 1 b = 1 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Codice:
public class A { static int a; int b; public A() { this(++a); } public A(int x) { b = x+2; } public String toString() { return "a = " + a + " b = " + b; } } Codice:
class B extends A { int b; public B() { b = a; } public String toString() { return super.toString() + "\n" + "a = " + a + " b = " + b; } } Codice:
public class Prova { public static void main(String[] args) { B b = new B(); System.out.println(b.toString()); } } Codice:
B b = new B(); - B estende A, quindi viene chiamato implicitamente il costruttore senza parametri di A. Codice:
public A() { this(++a); } - nel costruttore di default di A il suo valore viene incrementato a 1 dall'operatore ++; - quindi 'a' viene passato come parametro al costruttore di A che prende un parametro 'int' con la chiamata this(++a); Codice:
public A(int x) { b = x+2; } - Ora abbiamo che 'a' vale 1 e il campo 'b' della classe A vale 3; - Si torna al contesto del costruttore della classe B; Codice:
public B() { b = a; } - Ora abbiamo che 'a' vale 1, il campo 'b' della classe A vale 3 e il campo 'b' della classe B vale 1; - Si torna al contesto del metodo main; Codice:
System.out.println(b.toString()); Codice:
return super.toString() + "\n" + "a = " + a + " b = " + b; - nel toString() di A: Codice:
return "a = " + a + " b = " + b; - quindi alla precedente stringa viene concatenata la stringa " b = " a cui viene concatenato il valore del campo 'b' di A che come sappiamo vale 3; - si torna al contesto del toString() di B; Codice:
return super.toString() + "\n" + "a = " + a + " b = " + b; In pratica in questo esercizio era neccessario stare attenti alle regole di visibilità dei campi e all'ordine di inizializzazione delle varie parti di un'istanza di una classe che ne estende un'altra.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 19-01-2010 alle 11:33. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Ti ringrazio mille per la descrizione molto dettagliata, vorrei chiederti ancora una o due delucidazioni.
Siccome il costruttore di B è privo di argomenti viene chiamato il costruttore della superclasse giusto? Ora non ho capito una cosa, perchè il costruttore senza argomenti di A poi passa i parametri all'altro costruttore? E this(++a) cosa comporta? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
Ultima modifica di ndakota : 17-01-2010 alle 20:46. |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Perfetto grazie! Ne approfitto per chiedere conferma di un altro esercizio che magari non ho capito XDD
Il testo è : Si considerino le tre classi concrete Alfa, Beta, Gamma. La classe Alfa implementa i metodi di segnatura m(long x) e m(int x). La classe Beta estende Alfa e implementa i metodi di segnatura m(long x) e m(double x). La classe Gamma estende Beta e implementa i metodi di segnatura m(double x) e m(int x). Per ciascuna delle seguenti coppie di istruzioni si determini se la coppia viene compilata correttamente e, in caso positivo, si determini la segnatura selezionata dal compilatore e la classe in cui il metodo effettivamente eseguito al runtime `e stato implementato. Nota: Si rammenti che 2 denota un letterale int, 2L denota un letterale long e 2.0 denota un letterale double. Ora, alla voce Codice:
Alfa p = new Beta(); p.m(2.0); non compila Io ho pensato che anche se Beta possiede il metodo m(doublex) la variabile p è di tipo Alfa e di conseguenza siccome Alfa non possiede metodi per i double non può essere compilato. E' corretto? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Penso sia come dici tu. Il compilatore risolve l'overloading aspettandosi una delle due segnature di Alfa e ciò non avviene. Anche perchè il parametro non può essere promosso implicitamente. L'esercizio mi è familiare e sei di Milano. Hai il professor Pighizzini?
![]() |
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Io ho passato i due compitini con quasi il massimo. Quindi attendo la prova di laboratorio il 25. Buona fortuna
![]() |
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Avrei bisogno di un ultimo consiglio per capire una cosa.
Si considerino le seguenti classi: Codice:
class A { int a=0; public A() { a = 1 + getCampo(); } public int getCampo() { return a; } } Codice:
class B extends A { int b=1; public B() { b = 1 + getCampo(); } public int getCampo() { return a+b; } } Codice:
B obj1 = new B(); System.out.println("a = " + obj1.a + " b = " + obj1.b); EDIT: sono stupido, definiscono le variabili a e b delle due classi XDDDD Ultima modifica di Snakethesniper : 18-01-2010 alle 11:20. |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
E' corretta.
Quote:
Ci sono poi 4 livelli di accesso possibili assegnabili ai campi e metodi di una classe/istanza che si controllano mediante l'uso di quattro modificatori di accesso (per tre di questi esistono delle specifiche parole chiave da usare: private, protected, public; il quarto è quello di default, per il quale non occorre alcuna specificazione). Qui trovi una breve spiegazione
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 18-01-2010 alle 11:44. |
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Sto provando a fare un altro esercizio, ma mi è sorto un problema e non capisco perchè. Sostanzialmente ho creato una classe Matrice
Codice:
public class Matrice{ private int r,c; private int[][] m; Codice:
public Matrice(int x, int y){ r = x; c = y; m = new int[r][c]; } Codice:
public Matrice trasponi(){ Matrice m2 = new Matrice(this.c,this.r); for(int a=0;a<this.r;a++){ for(int b=0;b<this.c;b++){ m2.m[b][a]=this.m[a][b]; } } return m2; } Codice:
public int[][] getMatrice(){ return this.m; } Codice:
123 123 Codice:
12 12 12 Codice:
11 22 33 Codice:
import java.lang.*; public class Soluzione{ public static void main(String[] args){ Matrice m = new Matrice(2,3); int[][] m2 = m.getMatrice(); int s=0,i,j; for(i=0;i<2;i++){ for(j=0;j<3;j++){ m2[i][j]=1+j+s; System.out.print(m2[i][j]); } System.out.println(""); } Matrice m1 = m.trasponi(); int[][] m3 = m1.getMatrice(); for(i=0;i<3;i++){ for(j=0;j<2;j++){ m3[i][j]=1+j+s; System.out.print(m3[i][j]); } System.out.println(""); } } } p.s:la variabile s servirebbe in teoria a memorizzare il valore dell'ultima colonna della riga in modo da sommarlo a quella sotto ed ottenere continuità, solo che java mi segnala un errore e non capisco perchè. |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ovviamente e' errato il metodo trasponi.
Guarda il metodo getTrasposta che ho scritto qui sotto e prova a capire che errore hai commesso: Codice:
public class Matrice { private final int ROWS, COLUMNS; private boolean initialized; private final int[][]DATA; public Matrice(int r, int c) { if (r<1 || c<1) { throw new IllegalArgumentException("Il valore di righe e colunne deve essere maggiore di zero."); } ROWS = r; COLUMNS = c; DATA = new int[ROWS][COLUMNS]; } // torna una copia dei dati nella matrice public int[][] getData() { int[][] copyData = new int[ROWS][COLUMNS]; for(int r=0; r<ROWS; r++) { for(int c=0; c<COLUMNS; c++) { copyData[r][c] = DATA[r][c]; } } return copyData; } // inizializza la matrice public void initData(int newdata[][]) { if (initialized) { throw new RuntimeException("Impossibile modificare la matrice"); } initialized = true; for(int r=0; r<ROWS; r++) { for(int c=0; c<COLUMNS; c++) { DATA[r][c] = newdata[r][c]; } } } public int getValueAt(int row, int column) { if (!isRowValid(row) || !isColumnValid(column)) { throw new IllegalArgumentException("Valore di riga o di colonna fuori dal range valido"); } return DATA[row][column]; } private boolean isRowValid(int row) { return row>=0 && row<ROWS; } private boolean isColumnValid(int column) { return column>=0 && column<COLUMNS; } // torna la matrice trasposta di questa matrice public Matrice getTrasposta() { Matrice tras = new Matrice(COLUMNS, ROWS); for(int c=0; c<COLUMNS; c++) { for(int r=0; r<ROWS; r++) { tras.DATA[c][r] = DATA[r][c]; } } return tras; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for(int r=0; r<ROWS; r++) { for(int c=0; c<COLUMNS; c++) { sb.append(DATA[r][c]).append("\t"); } sb.append("\n"); } return sb.toString(); } // ESEMPIO: public static void main(String... argv) { // crea la matrice int[][]data = { {1,2,3}, {1,2,3} }; Matrice m = new Matrice(2,3); m.initData(data); System.out.println("m"+"\n"+m.toString()); // ottieni la sua trasposta Matrice m2 = m.getTrasposta(); System.out.println("m2"+"\n"+m2.toString()); // dovrebbe stampare sullo standard outpt: // m // 1 2 3 // 1 2 3 // // m2 // 1 1 // 2 2 // 3 3 } } Ho importato il tuo codice in NetBeans (e' un IDE per Java) perchè a prima vista non capivo quale potesse essere l'errore, relativamente a 's', e infatti non ce n'è nessuno ne a compile time ne a run time.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 20-01-2010 alle 13:37. |
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Ho invertito i contatori nei due cicli??
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Sì, direi che hai fatto confusione con gli indici di riga e colonna nei due cicli annidati.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Rompo di nuovo le balle perchè ho incontrato un'altra difficoltà XD
Devo scrivere un programma che legge da standard input delle righe con dei valori e assegnare questi valori ad un array. Ovvero, ho la classe astratta: Codice:
public abstract class Persona{ String nome,cognome; int matricola; //costruttore public Persona(){ nome="";; cognome="";; matricola=0; } //metodi public void ordina(Persona[] p){ int i; for(i=0;i<p.length;i++){ if(p[i].matricola<p[i+1].matricola){ Persona d=p[i]; p[i]=p[i+1]; p[i+1]=d; } } } public String toString(){ return nome + " " + cognome + " " + matricola; } } Codice:
public class Dirigente extends Persona{ public Dirigente(){ super(); double perc=0.0; } } Codice:
public class Impiegato extends Persona{ public Impiegato(){ super(); int tasso=0; } } Codice:
D,Mario,Rossi,1234,0.23 Non ho idea di come farlo! Per lo standard input nel programma di prova ho messo Codice:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String input; while((input=in.readLine()) != null){ |
![]() |
![]() |
![]() |
#20 | |
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 90
|
Quote:
Codice:
public Matrice trasponi(){ Matrice m2 = new Matrice(this.c,this.r); for(int a=0;a<this.c;a++){ for(int b=0;b<this.r;b++){ m2.m[a][b]=this.m[b][a]; } } return m2; } Inoltre se aggiungo Codice:
Matrice m1 = m.trasponi(); int[][] m3 = m1.getMatrice(); for(i=0;i<3;i++){ for(j=0;j<2;j++){ m3[i][j]=1+j+s; System.out.print(m3[i][j]); } s=m3[i][j]; System.out.println(""); } Ultima modifica di Snakethesniper : 20-01-2010 alle 23:31. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:18.