Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51

    Specificatori di accesso??

    Salve,
    osservate questo codice
    codice:
    import java.awt.*;
    import java.awt.geom.*;
    import javax.swing.*;
     
    public class Graf_01{  
        public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                 JFrame f = new JFrame("Disegno un ellisse");
                    f.setBounds(800, 500, 300, 245);
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                 
                    f.add(new MyComp());
                    f.setVisible(true);          
                }            
           });
        }
    }
    class MyComp extends JComponent{    
        final BasicStroke spessore = new BasicStroke(5.0f);
        public void paintComponent(Graphics g) { 
           super.paintComponent(g);
           Graphics2D g2d =(Graphics2D)g;
           g2d.setStroke(spessore);
           Ellipse2D.Double fc = new Ellipse2D.Double(95,30,100,150);
           g2d.draw(fc);
        }
    }

    Sullo stesso file Graf_01.java abbiamo due classi la seconda MyComp non è una classe interna a Graf_01 è una classe esterna ma nello stesso file. Come si vede non ha nessun specificatore di accesso (o descrittore di visibilità) e così funziona. La cosa che chiedo è: omettendo lo specificatore per default quale specificatore le viene attribuito!?

    Ho privato a metterglieli tutti con i seguenti risultati:

    • private Error: identifier not allowed here
    • public Error: Class MyComp is public, should be declared in a file named MyComp.java
    • protected Error: modifier protected not allowed here
    • package Error: Class, interface or enum expected

    A questo punto ammetto di essere molto confuso.
    Grazie per l'eventuale chiarimento.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da cersil Visualizza il messaggio
    La cosa che chiedo è: omettendo lo specificatore per default quale specificatore le viene attribuito!?
    Le classi "top level" (non definite dentro altri tipi) possono solo avere il livello di accesso public oppure package-level (detto anche package-private). Se non metti esplicitamente public, è per default package-private.

    Le classi inner/nested possono avere uno dei 4 livelli di accesso: public / protected / package-private / private. Idem per i membri in generale delle classi. E se non metti esplicitamente public/protected/private, per default il membro è package-private.

    Casi particolari:
    - i metodi delle interfacce sono sempre implicitamente public (in Java 9 si possono mettere metodi private nelle interfacce).
    - i costruttori delle enum sono sempre implicitamente private.

    Il fatto di avere 2+ classi nello stesso sorgente richiede la conoscenza di un'altra regola: un file sorgente può contenere più definizioni di classi/interfacce ma solo UNA al massimo può essere public. Se c'è tale tipo public, il file sorgente DEVE chiamarsi esattamente come quel tipo (a parte estensione .java). Se nel sorgente non c'è un tipo public, il file può chiamarsi come si vuole.
    Ultima modifica di andbin; 09-02-2018 a 11:57
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    Ma allora perchè se metto:
    packead class MyComb extends JComponent...
    mi da Error: Class, interface or enum expected
    lo stesso se scrivo:
    package-private o package-level?
    Grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da cersil Visualizza il messaggio
    Ma allora perchè se metto:
    packead class MyComb extends JComponent...
    mi da Error: Class, interface or enum expected
    lo stesso se scrivo:
    package-private o package-level?
    Grazie
    Il livello di accesso package-level (o detto package-private) NON ha un corrispondente modificatore di accesso. Lo ottieni solo come "default" se non metti esplicitamente public/protected/private.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    Grazie andbin, sono commosso come fai ad avere tutta questa pazienza! Rispondi sempre con molta perizia.
    Sei un grande. Grazie finalmente riuscirò a crescere un po.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.