Domanda mi potreste aiutare con questo esercizio?

Samu03cs

Utente Iron
17 Novembre 2020
10
5
0
11
Ultima modifica da un moderatore:
Si tratta di un esercizio che però non mi esce quando lo vado a compilare su java....
il testo dell'esercizio dice questo: "progetta la gerarchia di classi per definire una classe Pianoforte a partire da una superclasse StrumentoMusicale"
il codice è il seguente:

Java:
public class StrumentoMusicale { // prima classe
    public static String nomeStrumento;
  
    StrumentoMusicale(){
    }
    StrumentoMusicale(String n){
        nomeStrumento=n;
      
    }
    public static void setNomeStrumento(String n) {
        n=nomeStrumento;
    }
  
    public String getNomeStrumento(String n ) {
        return n;
    }
    public String getTipoStrumento (String t) {
        return t;
    }
    public void stampa() {
        System.out.println("lo strumento e' un"+nomeStrumento);
  
    }
}
class strumentiaCorde extends StrumentoMusicale{// seconda classe
    public static  String tipoStrumento;
    strumentiaCorde(){
    }
strumentiaCorde (String t) {
    t=tipoStrumento;  
    }
public void stampa() {
    System.out.println("lo strumento appartiene alla famiglia degli strumenti a "+tipoStrumento);
}
}
class pianoforte extends strumentiaCorde{ //terza classe
    public static String tasti;
    pianoforte(){
    }
    pianoforte(String s){
        s=tasti;  
    }
    public void stampa(){
        System.out.println("il pianoforte ha "+tasti+"tasti");
    }

public static void main(String[] args) {
    StrumentoMusicale sm= new StrumentoMusicale("PIANOFORTE");
    System.out.println("\nStrumentoMusicale");
    sm.stampa();
  
    strumentiaCorde sc= new strumentiaCorde("corde");
    System.out.println("\nstrumentiaCorde");
    sc.stampa();
  
    pianoforte pi= new pianoforte("80 tasti");
    System.out.println("\npianoforte");
    pi.stampa();
}
}

QUANDO LO VADO A COMPILARE ESCE UN ERRORE CHE POTETE VEDERE NELLA FOTO CHE HO ALLEGATO. vi chiedo se potete scrivermi il codice senza errori o magari dirmi solo cosa cambiare e dove
GRAZIE IN ANTICIPO E BUONA SERATA.
 

Allegati

  • WhatsApp Image 2021-01-06 at 4.34.05 PM.jpeg
    WhatsApp Image 2021-01-06 at 4.34.05 PM.jpeg
    123.2 KB · Visualizzazioni: 11
Ho editato alcuni tuoi post per aggiungere il tag code lasciandoti sempre l'avviso, quindi ribadisco anche nel post: utilizza il tag CODE quando pubblichi codice, grazie.

In primo luogo anche se sembra un suggerimento inutile, dovresti rispettare le convenzioni. Le classi iniziano con la lettera maiuscola e se sono composte da più parole ogni iniziale va in maiuscolo.

Poi, ho il dubbio che tu abbia dato l'estensione sbagliata al file... hai dato al file come estensione "prova"? Perchè non vedo errori formali.

La variabile static che hai dichiarato non dovrebbe essere static, non ne hai bisogno.
Non serve nemmeno dichiarare per forza il costruttore "vuoto", se non lo scrivi viene generato di default.
 
Ultima modifica da un moderatore:
Ho editato alcuni tuoi post per aggiungere il tag code lasciandoti sempre l'avviso, quindi ribadisco anche nel post: utilizza il tag CODE quando pubblichi codice, grazie.

In primo luogo anche se sembra un suggerimento inutile, dovresti rispettare le convenzioni. Le classi iniziano con la lettera maiuscola e se sono composte da più parole ogni iniziale va in maiuscolo.

Poi, ho il dubbio che tu abbia dato l'estensione sbagliata al file... hai dato al file come estensione "prova"? Perchè non vedo errori formali.

La variabile static che hai dichiarato non dovrebbe essere static, non ne hai bisogno.
Non serve nemmeno dichiarare per forza il costruttore "vuoto", se non lo scrivi viene generato di default.
Va bene il codice in questo modo?

Java:
import java.util.Scanner;
public class StrumentoMusicale { // prima classe
    public  String nomeStrumento;
   
    StrumentoMusicale(){
    }
    StrumentoMusicale(String n){
        nomeStrumento=n;
       
    }
    public  void setNomeStrumento(String n) {
        n=nomeStrumento;
    }
   
    public String getNomeStrumento(String n ) {
        return n;
    }
    public String getTipoStrumento (String t) {
        return t;
    }
    public void stampa() {
        System.out.println("lo strumento e' un"+nomeStrumento);
   
    }
}
class StrumentiaCorde extends StrumentoMusicale{// seconda classe
    public   String tipoStrumento;
    StrumentiaCorde(){
    }
StrumentiaCorde (String t) {
    t=tipoStrumento;   
    }
public void stampa() {
    System.out.println("lo strumento appartiene alla famiglia degli strumenti a "+tipoStrumento);
}
}
class Pianoforte extends StrumentiaCorde{ //terza classe
    public  String tasti;
    Pianoforte(){
    }
    Pianoforte(String s){
        s=tasti;   
    }
    public void stampa(){
        System.out.println("il pianoforte ha "+tasti+"tasti");
    }
public class Prova{
public  void main(String[] args) {
    StrumentoMusicale sm= new StrumentoMusicale("PIANOFORTE");
    System.out.println("\nStrumentoMusicale");
    sm.stampa();
   
    StrumentiaCorde sc= new StrumentiaCorde("corde");
    System.out.println("\nstrumentiaCorde");
    sc.stampa();
   
    Pianoforte pi= new Pianoforte("80 tasti");
    System.out.println("\npianoforte");
    pi.stampa();
}
}
}
 
Hai ignorato nuovamente quanto ti ho scritto però.

Comunque si, meglio di prima. Puoi rimuovere il costruttore.
Le variabili di classe, salvo in casi particolari, dovrebbero essere private. E' giusto accedere ad esse attraverso opportune interfacce (i metodi getter/setter).

Al di là di questo ci sono comunque cose sbagliate che andrebbero riviste. Stai usando l'ereditarietà, ma non sfrutti praticamente nulla. Ti è chiara l'ereditarietà?
Da come hai scritto il tutto, secondo me no, e anche la logica non mi sembra ben impostata (a quanto si evince, non avendo a disposizione il testo dell'esercizio).

Esempio:
Java:
    public String getNomeStrumento(String n ) {
        return n;
    }
    public String getTipoStrumento (String t) {
        return t;
    }

Strutturato così non ha molto senso: usi un metodo getter al quale passi un attributo che viene restituito al chiamante... perchè?
Il tipo dello strumento, così come il nome, sono attributi della classe (variabili di istanza, o come le chiama il tuo prof).

Invece di:
Java:
    public void stampa() {
        System.out.println("lo strumento e' un"+nomeStrumento);
   
    }

Puoi sfruttare il metodo toString volendo.

Prima di mostrarti il codice attento due domande e progressi (se ti lascio del codice da copiare non ti sarà d'aiuto).