Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    415

    errore nell'uso di "extends"

    Ciao a tutti,
    sto facendo un esercizio sull'uso dell'ereditarietà, ma ottengo il seguente errore:

    .\Punto3D.java:4: cannot find symbol
    symbol : constructor Punto()
    location : class Punto
    public Punto3D(int x, int y, int z) {

    Il codice:

    TestDistanza.java
    Codice PHP:
    public class TestDistanza {
        public static 
    void main(String args[])
        {
            
    Punto p1 = new Punto(24);
            
    Punto p2 = new Punto(56);
            
    Punto3D p31 = new Punto3D(246);
            
    Punto3D p32 = new Punto3D(567);
            
    Double risultato1 p1.calcolaDistanza(p2);
            
    Double risultato2 p31.calcolaDistanza3D(p32);
            
    System.out.println(risultato1 "\n");
            
    System.out.println(risultato2 "\n");
        }

    Punto.java
    Codice PHP:
    public class Punto {
        private 
    int x;
        private 
    int y;
        private 
    double distanza;
            
        public 
    Punto(int xint y){
            
    setXY(xy);
        }

        public 
    void setXY(int xint y) {
            
    this.x;
            
    this.y;
        }
        
        public 
    int getX() {
            return 
    x;
        }
        
        public 
    int getY() {
            return 
    y;
        }
        
        public 
    double calcolaDistanza(Punto p) {
            
    double dy p.getY();
            
    double dx p.getX();
            return 
    Math.sqrt(dy*dy dx*dx);
        }

    Punto3D.java
    Codice PHP:
    public class Punto3D extends Punto {
        private 
    int z;
        
        public 
    Punto3D(int xint yint z) {
            
    setXYZ(xyz);
        }

        public 
    void setXYZ(int xint yint z) {
            
    setXY(xy);
            
    this.z;
        }
        
        public 
    int getZ() {
            return 
    z;
        }
        
        public 
    double calcolaDistanza3D(Punto3D p) {
            
    double dy getY() - p.getY();
            
    double dx getX() - p.getX();
            
    double dz getZ() - p.getZ();
            return 
    Math.sqrt(dy*dy dx*dx dz*dz);
        }

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: errore nell'uso di "extends"

    Originariamente inviato da Teo80
    sto facendo un esercizio sull'uso dell'ereditarietà, ma ottengo il seguente errore:

    .\Punto3D.java:4: cannot find symbol
    symbol : constructor Punto()
    location : class Punto
    public Punto3D(int x, int y, int z) {
    Beh, sì. Il motivo è semplice: la prima istruzione di un costruttore deve essere una invocazione di super() o this() (con o senza argomenti). Se non si mette nulla, viene messo in automatico (dal compilatore) un super() senza argomenti.
    Nel costruttore di Punto3D c'è un super() senza argomenti, messo in automatico. Ma la classe Punto non ha un costruttore senza argomenti!!!!

    E comunque la tua estensione viola il principio di sostituzione di Liskov (LSP, Liskov substitution principle). Il LSP dice una cosa molto semplice: un sottotipo deve poter essere sostituibile al posto del tipo base.
    Ora ... se un metodo ha un parametro di tipo Punto, puoi passare un Punto3D?? Tecnicamente certo, è ovvio. Ma è sbagliato concettualmente!! Cosa potrebbe fare il metodo con un oggetto Punto3D visto che si aspetta un Punto??? Direi nulla ....

    Non ha senso questa estensione!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Se la superclasse ha un construttore con parametri lo devi chiamare te direttamente.

    Ad esempio:

    codice:
    public Punto3D(int x, int y, int z) {
      super(x, y);
    
       ...
    }
    edit: and l'ha spiegato meglio
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di preben
    Registrato dal
    Mar 2008
    Messaggi
    78
    Il mio intervento è per segnalarti un errore (sicuramente di distrazione) nella classe Punto nel metodo per il calcolo della distanza.
    Ciao!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    415
    Grazie per le risposte.

    Nel manuale che sto seguendo tutti questi passaggi vengono spiegati nel modulo successivo a dove ero arrivato quando ho iniziato l'esercizio... ora mi è più chiaro.

    Nel manuale viene anche spiegato che questo esempio viola il principio di sostituzione di Liskov come giustamente diceva and...

    grazie anche a Preben per la segnalazione, sì, è un errore di distrazione, ma tanto è solo una classe di esempio fatta per esercizio.

    Un'ulteriore domanda: la sottoclasse eredita tutti i metodi (private e public) della superclasse? Dalle prove che ho fatto sembra di sì, mentre mi sembra che erediti solo le variabili d'istanza dichiarate come public, è corretto?

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Teo80
    Un'ulteriore domanda: la sottoclasse eredita tutti i metodi (private e public) della superclasse? Dalle prove che ho fatto sembra di sì, mentre mi sembra che erediti solo le variabili d'istanza dichiarate come public, è corretto?
    Solo quelli public, protected e "di default".
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    415
    Originariamente inviato da Alex'87
    Solo quelli public, protected e "di default".
    a me sembra che erediti anche i metodi private: per esempio ho provato a chiamare setXY da Punto3D e funziona (mettendo un costruttore Punto senza parametri nella classe Punto per evitare il problema che avevo segnalato all'inizio del thread).

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Teo80
    a me sembra che erediti anche i metodi private
    I membri private sono visibili solo dalla classe in cui sono dichiarati (salvo quando entrano in gioco le inner class ma è un altro discorso).

    Originariamente inviato da Teo80
    per esempio ho provato a chiamare setXY da Punto3D e funziona (mettendo un costruttore Punto senza parametri nella classe Punto per evitare il problema che avevo segnalato all'inizio del thread).
    Che hai scritto?? Fai vedere .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    415
    Originariamente inviato da andbin
    Che hai scritto?? Fai vedere .....
    Punto.java
    Codice PHP:
    public class Punto {
        private 
    int x;
        private 
    int y;
        private 
    double distanza;
        
        public 
    Punto() {
            
        }
            
        public 
    Punto(int xint y){
            
    setXY(xy);
        }

        public 
    void setXY(int xint y) {
            
    this.x;
            
    this.y;
        }
        
        public 
    int getX() {
            return 
    x;
        }
        
        public 
    int getY() {
            return 
    y;
        }
        
        public 
    double calcolaDistanza(Punto p) {
            
    double dy p.getY();
            
    double dx p.getX();
            return 
    Math.sqrt(dy*dy dx*dx);
        }

    Punto3D.java
    Codice PHP:
    public class Punto3D extends Punto {
        private 
    int z;
                
        public 
    Punto3D(int xint yint z) {
            
    setXYZ(xyz);
        }

        public 
    void setXYZ(int xint yint z) {
            
    setXY(xy);
            
    this.z;
        }
        
        public 
    int getZ() {
            return 
    z;
        }
        
        public 
    double calcolaDistanza3D(Punto3D p) {
            
    double dy getY() - p.getY();
            
    double dx getX() - p.getX();
            
    double dz getZ() - p.getZ();
            return 
    Math.sqrt(dy*dy dx*dx dz*dz);
        }


  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Teo80
    a me sembra che erediti anche i metodi private: per esempio ho provato a chiamare setXY da Punto3D e funziona (mettendo un costruttore Punto senza parametri nella classe Punto per evitare il problema che avevo segnalato all'inizio del thread).
    Forse perchè setXY è public?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.