Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 12h09   #1
Fr@ncky
Membre du Club
 
Inscription : juin 2004
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 64
Points : 55
Points : 55
Par défaut Visibilité d'une variable protected

Bonjour,
J'ai vraiment un problème avec la visibilité du protected. Dans la FAQ java c'est écrit:
"rien" ou défaut Les variables, méthodes ou classes définies sans modificateur sont accessibles par toute classe appartenant au même package. Attention : les variables sans modificateur ne sont pas accessibles aux classes fille définies dans un autre package.
protected Les variables, méthodes ou classes définies comme protégées ne sont accessibles que par les classes filles et classes du même package.

Une variable protected est comme "rien" ou défaut pas accessible aux classes fille définies dans un autre package.

Quel est la différence entre rien et protected ?

Merci
Fr@ncky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 12h53   #2
Julien Sanchez
Membre éclairé
 
Avatar de Julien Sanchez
 
Homme Julien Sanchez
Étudiant
Inscription : décembre 2012
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Julien Sanchez
Âge : 25
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2012
Messages : 50
Points : 392
Points : 392
Bonjour,

Les variables "rien" ne sont pas toujours accessibles aux classes filles. Alors que les variables protected le sont toujours.
__________________
Un logiciel est libre si vous avez le droit d'étudier son code source, de le modifier et de le redistribuer.
GNU/Linux est un logiciel libre, alors que Windows et Mac OS ne le sont pas. (aide)
Julien Sanchez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 12h54   #3
zhouyu
Membre habitué
 
Avatar de zhouyu
 
Homme Loïc
Étudiant
Inscription : octobre 2009
Messages : 83
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 83
Points : 129
Points : 129
Si les définitions sont juste :

- "rien" les variables,méthodes,etc.. sont accessibles par toutes les classes du même package, SEULEMENT du même package.

- "protected" même package PLUS les classes enfants, même les enfants d'un autre package

L'intérêt du protected c'est surtout pour laisser l'accès aux classes enfants.

Personnellement je ne me suis jamais servis du "rien" ou "défaut" je met en "public" dans ce cas là. Mais bon j'ai fais peu de Java :p.
zhouyu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 11h18   #4
Fr@ncky
Membre du Club
 
Inscription : juin 2004
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 64
Points : 55
Points : 55
Citation:
Envoyé par zhouyu Voir le message
- "protected" même package PLUS les classes enfants, même les enfants d'un autre package
Ben mon problème c'est que justement ça ne compile pas !

L'exemple suivant le montre:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package p;
public class Parent {
	int xDefaut = 11;
	protected int xProtected = 9;
	public int xPublic = 10;	
}

package other;
import p.*;
public class Enfant extends Parent {
	public static void main(String[] args) {
		p.Parent p = new p.Parent();
		System.out.println("Public" + p.xPublic);
		// ne compile pas pourquoi ??
		 System.out.println("xProtected" + p.xProtected);
		 //ne compile pas, c'est normal !
		 System.out.println("xDefault" + p.xDefaut);
	}
}
Qui m'explique ? merci
Fr@ncky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 11h35   #5
kinaesthesia
Membre éclairé
 
Homme Anthony
Java Analyst Developer
Inscription : mai 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Anthony
Âge : 23
Localisation : Belgique

Informations professionnelles :
Activité : Java Analyst Developer
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 128
Points : 344
Points : 344
Envoyer un message via Skype™ à kinaesthesia
Ton context est totalement différent ;-)
kinaesthesia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 11h41   #6
Fr@ncky
Membre du Club
 
Inscription : juin 2004
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 64
Points : 55
Points : 55
Citation:
Envoyé par kinaesthesia Voir le message
Ton context est totalement différent ;-)
Je ne comprends pas l'explication.
Fr@ncky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 12h28   #7
kinaesthesia
Membre éclairé
 
Homme Anthony
Java Analyst Developer
Inscription : mai 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Anthony
Âge : 23
Localisation : Belgique

Informations professionnelles :
Activité : Java Analyst Developer
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 128
Points : 344
Points : 344
Envoyer un message via Skype™ à kinaesthesia
Ta méthode main est static ce qui signifie qu'elle n'est pas dans le même contexte que ta classe Enfant ni même celle de Parent que tu la déclares dans ton fichier Enfant.java ou Parent.java.

De plus tu déclares un objet Parent et tu essayes d'accéder à une de ses variables protected. Ce n'est pas parce que ton objet est instancié dans une classe fille que tu vas avoir accès à ses variables protégées.

Si tu veux une explication plus banale, tu peux te dire que cette méthode n'a pas de classe etpeux être déclarée n'importe tout.

Si tu veux accéder à ta variable protected, il te faudra créer une méthode qui n'est pas static dans ta classe Enfant et l'utilisé directement et non pas instancié un objet Parent puisque par héritage ton objet Enfant est automatiquement un objet parent.
kinaesthesia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 13h56   #8
zhouyu
Membre habitué
 
Avatar de zhouyu
 
Homme Loïc
Étudiant
Inscription : octobre 2009
Messages : 83
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 83
Points : 129
Points : 129
En effet dans les méthodes static tu ne peux pas accéder à ta classe direction vu qu'on peu utiliser ces méthodes sans instancier d'objet de cette classe.
De ce fait "this" n'existe pas dans une méthode static.

Et puis initialiser tes variables de la sorte me semble un peu bizarre. Je ferai un constructeur par défaut à ta place .
zhouyu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/12/2012, 01h10   #9
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 087
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 087
Points : 10 315
Points : 10 315
Envoyer un message via Skype™ à thelvin
Citation:
Envoyé par kinaesthesia Voir le message
Ta méthode main est static ce qui signifie qu'elle n'est pas dans le même contexte que ta classe Enfant ni même celle de Parent [blah blah blah]
Non. C'est bien une histoire de contexte, et on ne peut en effet pas atteindre une variable protected non-static dans un contexte static. Mais l'explication ne tient pas debout.

Une variable private et une variable default non-static peuvent très bien être accédées dans un contexte static. Le problème exposé ici ne se pose qu'avec protected, et avec aucune autre visibilité.

protected, dans le cas non-static, a une particularité. Il a la même visibilité que default, mais une classe fille peut également voir les propriétés protected des classes mères sur l'instance en cours. Et sur l'instance en cours seulement.

En contexte static il n'y a pas d'instance en cours, donc pas d'accès. Mais même en contexte non-static, on ne peut pas accéder aux variables protected des autres instances. Alors que la visibilité de private et default ne s'intéresse pas du tout à s'il y a une instance en cours.

Citation:
Envoyé par zhouyu Voir le message
En effet dans les méthodes static tu ne peux pas accéder à ta classe direction vu qu'on peu utiliser ces méthodes sans instancier d'objet de cette classe.
De ce fait "this" n'existe pas dans une méthode static.
Et alors ? C'est pas la question.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/12/2012, 09h37   #10
Fr@ncky
Membre du Club
 
Inscription : juin 2004
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 64
Points : 55
Points : 55
Citation:
Envoyé par zhouyu Voir le message
Et puis initialiser tes variables de la sorte me semble un peu bizarre. Je ferai un constructeur par défaut à ta place .
Il ne s'agit que d'un exemple pas d'un exercice de style ! Mais merci quand même.

Citation:
Envoyé par thelvin Voir le message
protected, dans le cas non-static, a une particularité. Il a la même visibilité que default, mais une classe fille peut également voir les propriétés protected des classes mères sur l'instance en cours. Et sur l'instance en cours seulement
.
Auriez-vous un exemple pour me l'expliquer ? C'est un peu abstrait pour moi.

Je pose cette question de protected et de visibilité car c'est exactement le style de questions que l'on trouve dans l'examen pour l'obtention du SCJP Oracle.
Fr@ncky est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/12/2012, 09h59   #11
Fr@ncky
Membre du Club
 
Inscription : juin 2004
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 64
Points : 55
Points : 55
J'ai parcouru le site et trouvé cette page:
http://armel-ndjobo.developpez.com/t...ontrole-acces/

L'auteur dit au chapitre VII:
Protected : il est presque identique au modificateur par défaut. Cependant, en plus des classes du même package, les classes dérivées peuvent accéder aux elements protected d'une classe.

Et dans le tableau qui suit on voit qu'au sein d'une sous-classe dans un package différent protected permet d'accéder par héritage.
J'aurais simplement voulu un exemple. Merci
Fr@ncky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 12h06   #12
zhouyu
Membre habitué
 
Avatar de zhouyu
 
Homme Loïc
Étudiant
Inscription : octobre 2009
Messages : 83
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 83
Points : 129
Points : 129
Re. Désolé pour mon hors sujet alors...
Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
public class A{
  protected int var1;
 
  public A(){var1 = 0;}
}
 
public class B : A{
  public B(){this.var1 = 1;}//autorisé car c'est ton instance de B qui va mettre à jour var1, c'est la variable de cette instance que tu mets à jour
 
  public void methode()
  {
    A myA = new A();
    myA.var1 = 2;//ne fonctionne pas car myA n'est pas l'instance en cour si j'ai bien compris, pour ce cas var1 doit etre public ou defaut si dans le meme package
  }
}
zhouyu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/12/2012, 12h39   #13
Fr@ncky
Membre du Club
 
Inscription : juin 2004
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 64
Points : 55
Points : 55
Merci pour les explications. C'est nettement plus clair !
Fr@ncky est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h16.


 
 
 
 
Partenaires

Hébergement Web