|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 91
|
[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: 91
|
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: 91
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 91
|
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: 91
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jun 2008
Città: Milano
Messaggi: 91
|
|
|
|
|
|
|
#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: 91
|
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: 91
|
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: 91
|
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: 91
|
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: 91
|
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: 16:16.




















