Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    ereditarieta' e copia di metodi e campi

    ciao

    sto facendo un po di prove con java e il suo modello di ereditarieta'. ho notato che in effetti campi e metodi di una superclasse sono accessibli si (se public o protected) dalla subclasse ma non sono in realta' COPIATI nella subclasse stessa.

    tipo ho che:

    codice:
    class Game {
    
    	private String name = "generic game";
    	
    }
    
    class Basket extends Game {
    
    	public void getName(){
    		System.out.print(this.name + "\n");
    	}	
    	
    }
    e poi da main faccio:

    codice:
    Basket O = new Basket();
    O.getName();
    mi becco un errore di non risolvibilita' della variabile stampata. Insoma "name" rimane nella superclasse e non viene copiato. se infatti overridiamo localmente:

    codice:
    class Basket extends Game {
            private String name = "basket";
    	public void getName(){
    		System.out.print(this.name + "\n");
    	}	
    	
    }
    molto banalmente tutto funzia!

    grazie

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

    Re: ereditarieta' e copia di metodi e campi

    Originariamente inviato da nourdine
    mi becco un errore di non risolvibilita' della variabile stampata.
    Perché quel name è solo visibile all'interno di Game. Nulla di così sconvolgente ....

    Originariamente inviato da nourdine
    Insoma "name" rimane nella superclasse e non viene copiato.
    Non c'è alcuna "copia" .... se istanzi un oggetto Basket, quella variabile di istanza 'name' esiste davvero! Fa cioè parte dello stato dell'oggetto. Solo che ... non è visibile al di fuori di Game.

    Originariamente inviato da nourdine
    se infatti overridiamo localmente:
    "Override" non è il termine adatto. Se 'name' di Game è privato e in Basket dichiari un'altra variabile 'name', quest'ultima non ha nulla a che fare con quella in Game. Non è nemmeno un "hiding".

    Se invece avessi questa situazione:

    codice:
    class Game {
        public String name = "generic game";
    }
    
    class Basket extends Game {
        public String name = "basket game";
    }
    Se istanzi un oggetto Basket, sai quante variabili di istanza ci sarebbero?? 2
    Questo si chiama "hiding", ovvero il name di Basket "nasconde" il name di Game. Ma esistono entrambe e in Basket si potrebbe comunque accedere ad entrambe!

    Se cambi Basket per stampare le due variabili:
    codice:
    class Basket extends Game {
        public String name = "basket game";
    
        public void info ()
        {
            System.out.println (name);         // stampa: basket game
            System.out.println (super.name);   // stampa: generic game
        }
    }
    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 nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    quindi override e' un termine che si usa solo con i metodi? si in effetti il metodo della super deve essere pubblico o protected per essere overridato quindi capisco perche dici che non era nemmeno un hiding. quindi abbiamo override per i metodi e hiding per i campi? ma il concetto e' lo stesso?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nourdine
    quindi override e' un termine che si usa solo con i metodi?
    Esatto, per la precisione: metodi di istanza.

    Originariamente inviato da nourdine
    quindi abbiamo override per i metodi e hiding per i campi?
    Fin qui ok ma .... si può avere "hiding" anche per i metodi di classe (static). E in tal caso, per via di come sono gestite le cose nel bytecode e nella JVM, valgono le stesse regole dell'override (es. il metodo di classe che fa l'hiding non può avere un livello di accesso più ristretto).

    Ma ad ogni modo l'hiding di variabili è differente dall'hiding di metodi di classe. Una variabile di istanza può fare l'hiding di una variabile di classe (e pure viceversa).
    Un metodo di istanza NON può fare l'hiding di un metodo di classe (e nemmeno viceversa).

    Originariamente inviato da nourdine
    ma il concetto e' lo stesso?
    No, l'override per i metodi è proprio un'altra cosa ... ha altre regole.

    Per il resto, ci sono 3 termini: "shadowing", "hiding" e "obscuring". Tutti concettualmente indicano, in generale, un nome che "nasconde" qualcos'altro. Ma sono casi diversi che avvengono in situazioni diverse.

    Per tutti i dettagli più precisi, ti suggerisco di leggere il JLS (Java Language Specification), online sul sito Sun.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.