web-dev-qa-db-fra.com

Différence entre le spécificateur d'accès par défaut et le spécificateur d'accès protégé en java

J'essayais d'apprendre Java et quand j'ai eu recours aux spécificateurs d'accès, j'ai eu un doute. Quelle est la différence entre le paramètre par défaut si aucun n'est spécifié et le spécificateur d'accès protégé?

20
abhips

Le spécificateur protected permet l'accès à toutes les sous-classes de la classe en question, quel que soit le package dans lequel elles résident, ainsi qu'à d'autres codes du même package. Le spécificateur par défaut autorise l'accès par un autre code du même package, mais pas par le code des sous-classes résidant dans des packages différents. Voir Spécification du langage Java, section 6.6 .

EDIT: à la demande de Michael Schmeißer (afin que les autres utilisateurs n'aient pas à lire les commentaires ni à suivre un lien pour le trouver): tous les membres des interfaces sont implicitement publics. En fait, c’est une erreur de compilation de spécifier tout spécificateur d’accès pour un membre d’interface autre que public (bien qu’aucun spécificateur d’accès ne soit par défaut défini sur l’accès public). Voici l'ensemble des règles du JLS pour les membres de la classe (voir le lien ci-dessus pour les règles pour les packages, les classes de niveau supérieur, les interfaces et les tableaux):

Un membre (classe, interface, champ ou méthode) d'un type de référence (classe, interface ou tableau) ou un constructeur d'un type de classe n'est accessible que si le type est accessible et que le membre ou le constructeur est déclaré pour autoriser l'accès:

  • Si le membre ou le constructeur est déclaré public, l'accès est autorisé.

  • Tous les membres des interfaces sont implicitement publics.

  • Sinon, si le membre ou le constructeur est déclaré protégé, l'accès n'est autorisé que si l'une des conditions suivantes est remplie:

  • L'accès au membre ou au constructeur se fait depuis le package contenant la classe dans laquelle le membre ou le constructeur protégé est déclaré.

  • L'accès est correct comme décrit dans §6.6.2 . (Cette clause fait référence aux règles qui permettent aux classes dérivées d’accéder aux membres protégés des superclasses; §6.6.2 commence par: "Un membre protégé ou un constructeur d’un objet peut être accédé de l’extérieur du paquet dans lequel code responsable de la mise en oeuvre de cet objet. " Il élabore ensuite sur celui-ci.)

  • Autrement, si le membre ou le constructeur est déclaré privé, l'accès est autorisé si et seulement s'il se produit dans le corps de la classe de niveau supérieur ( §7.6 ) qui entoure la déclaration du membre ou du constructeur.

  • Sinon, nous disons qu'il existe un accès par défaut, qui n'est autorisé que lorsque l'accès se fait depuis le package dans lequel le type est déclaré.

32
Ted Hopp

Ce Java tutorial peut vous être utile.

Modifier    | Class | Package | Subclass | World

public      |  Y    |    Y    |    Y     |   Y

protected   |  Y    |    Y    |    Y     |   N

no modifier |  Y    |    Y    |    N     |   N

private     |  Y    |    N    |    N     |   N
34
Coding Master

Spécificateur d'accès protégé - Il existe deux manières d'accéder aux données protégées.

  1. Les membres de données protégés, méthodes protégées d'une classe, seront visibles pour les autres classes si elles résident dans même forfait 

  2. En utilisant Héritage 

    signifie que nous pouvons utiliser les données protégées de cette classe en héritant de cette classe.

Spécificateur d'accès par défaut - Un seul moyen d'accéder aux données par défaut 

Default restreint l'accès uniquement au niveau du package, même après l'extension de la classe ayant des membres de données par défaut, l'accès ne sera pas possible.

Exemple

Pour vérifier le mot clé par défaut remove protected pour int x dans ProvideProtected, une erreur de temps de compilation est générée.

        1. SuperClass

        package nee.superclass;

        public class ProvideProtected {
            protected int x=800;

        }

        2.Subclass


        package nee.subclass;

        import nee.superclass.*;

        public class AccessProtected extends ProvideProtected 

        {   
        public void accessProtected()
            {
                System.out.println(x);
            }

            public static void main(String[] args) {
                AccessProtected obj=new AccessProtected();
                obj.accessProtected();

            }

        }
2
Neelam Chahal

Modificateur d'accès protégé: - Tout élément marqué comme protégé est visible dans le même package et également visible dans la sous-classe.

Accès par défaut: - Par défaut, ce n'est pas un mot clé. Cela s'applique quand aucun modificateur d'accès n'est spécifié. C'est fondamentalement un modificateur de niveau de paquet. Tout ce qui a un tel accès est visible dans le même package.

Maintenant, la différence peut être mieux expliquée à l'aide d'un exemple 

paquet p1

public class A
{

protected void fn()
{

}

} 

paquet p1

public class B
{

A a1 = new A();

a1.fn();// fn() is visible inside the same package

}

}

Nous arrivons maintenant à une sous-classe dans un package différent

paquet p2

public class D extends A

{

void test()

{

A a1 = new new A();

    //a1.fn() -->  would give compilation error
fn();

super.fn();

}

}

fn(), super.fn() ne donnera pas d'erreur.

La différence réside donc dans la sous-classe, la méthode ne peut pas être appelée via une référence de super classe. Soit vous pouvez l'appeler directement ou utiliser super. 

Notez que super.fn() doit faire partie de la méthode non statique.

1
Akshat Bansal