OVH Cloud OVH Cloud

[Debutante] donnée protected

6 réponses
Avatar
Lea
Bonjour,

Une donnée protected n'est pas accessible depuis une classe externe ou
un programme main(). Est-ce que la compilation de la classe doit
provoquer une erreur? Pourquoi je continue à y avoir accès lorsque je
lance le programme?

Merci. Léa

import java.lang.*;

class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}

public class Prob1 {
public static void main (String[] args) {
A o1 = new A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}

6 réponses

Avatar
Didier Fradet
Bonjour,
Bonjour,


Une donnée protected n'est pas accessible depuis une classe externe ou
un programme main(). Est-ce que la compilation de la classe doit
provoquer une erreur? Pourquoi je continue à y avoir accès lorsque je
lance le programme?

Un attribut déclaré protected est accessible par les classes filles

(héritage) et par les classes du même package. Comme tu n'as pas précisé
de package dans ta classe, la JVM considère qu'elle est dans un package
par défaut, celui de ton répertoire. Par conséquent, si ta classe Prob1
est dans le même répertoire, elle est dans le même package (même raison)
et il est donc normal que tu accèdes à l'attribut déclaré protected.

Didier
Merci. Léa

import java.lang.*;

class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}

public class Prob1 {
public static void main (String[] args) {
A o1 = new A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}


Avatar
Lea
Merci Didier.

Une donnée protected n'est pas accessible depuis une classe externe ou
un programme main(). Est-ce que la compilation de la classe doit
provoquer une erreur? Pourquoi je continue à y avoir accès lorsque je
lance le programme?

Un attribut déclaré protected est accessible par les classes filles

(héritage) et par les classes du même package. Comme tu n'as pas précisé
de package dans ta classe, la JVM considère qu'elle est dans un package
par défaut, celui de ton répertoire. Par conséquent, si ta classe Prob1
est dans le même répertoire, elle est dans le même package (même raison)
et il est donc normal que tu accèdes à l'attribut déclaré protected.



En fait qu'aurait-il fallu que je rajoute dans mes deux fichiers (A et
Prob1) pour qu'il n'y ait pas d'accès possible à la donnée protected
(comme cela devrait être le cas normalement, non?)

Léa
Didier

Merci. Léa

import java.lang.*;

class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}

public class Prob1 {
public static void main (String[] args) {
A o1 = new A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}




Avatar
Didier Fradet
Merci Didier.

Une donnée protected n'est pas accessible depuis une classe externe
ou un programme main(). Est-ce que la compilation de la classe doit
provoquer une erreur? Pourquoi je continue à y avoir accès lorsque je
lance le programme?

Un attribut déclaré protected est accessible par les classes filles

(héritage) et par les classes du même package. Comme tu n'as pas
précisé de package dans ta classe, la JVM considère qu'elle est dans
un package par défaut, celui de ton répertoire. Par conséquent, si ta
classe Prob1 est dans le même répertoire, elle est dans le même
package (même raison) et il est donc normal que tu accèdes à
l'attribut déclaré protected.



En fait qu'aurait-il fallu que je rajoute dans mes deux fichiers (A et
Prob1) pour qu'il n'y ait pas d'accès possible à la donnée protected
(comme cela devrait être le cas normalement, non?)


Par exemple tu crées un sous-répertoire essai sans lequel tu places ton
fichier A.java :

package essai;

public class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}
}

Dans le répertoire parent de essai, tu places ta classe Prob1 :

public class Prob1 {
public static void main (String[] args) {
essai.A o1 = new essai.A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}

et tu compiles (javac Prob1.java). Tu aurasl'erreur :

Prob1.java:5: x has private access in essai.A
System.out.println(o1.x);
^
Prob1.java:7: z has protected access in essai.A
System.out.println(o1.z);
^
2 errors

Voilà,

Didier



Léa

Didier

Merci. Léa

import java.lang.*;

class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}

public class Prob1 {
public static void main (String[] args) {
A o1 = new A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}






Avatar
Lea
Merci Didier.

Une donnée protected n'est pas accessible depuis une classe externe
ou un programme main(). Est-ce que la compilation de la classe doit
provoquer une erreur? Pourquoi je continue à y avoir accès lorsque
je lance le programme?

Un attribut déclaré protected est accessible par les classes filles

(héritage) et par les classes du même package. Comme tu n'as pas
précisé de package dans ta classe, la JVM considère qu'elle est dans
un package par défaut, celui de ton répertoire. Par conséquent, si ta
classe Prob1 est dans le même répertoire, elle est dans le même
package (même raison) et il est donc normal que tu accèdes à
l'attribut déclaré protected.



En fait qu'aurait-il fallu que je rajoute dans mes deux fichiers (A et
Prob1) pour qu'il n'y ait pas d'accès possible à la donnée protected
(comme cela devrait être le cas normalement, non?)



Par exemple tu crées un sous-répertoire essai sans lequel tu places ton
fichier A.java :

package essai;

public class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}
}

Dans le répertoire parent de essai, tu places ta classe Prob1 :

public class Prob1 {
public static void main (String[] args) {
essai.A o1 = new essai.A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}

et tu compiles (javac Prob1.java). Tu aurasl'erreur :

Prob1.java:5: x has private access in essai.A
System.out.println(o1.x);
^
Prob1.java:7: z has protected access in essai.A
System.out.println(o1.z);
^
2 errors

Voilà,

Didier


Je vais essayer ta solution. Tes explications me semblent très claires
:) ...
Dans le cas où j'avais laissé mes fichiers dans le même répertoire, en
précisant seulement en début de chacun "import java.lang.*;), la JVM
aurait considéré mes classes comme faisant parties du même package?
Donc en ce qui concerne l'accès, j'aurais eu accès à partir de Prob1 aux
données protected, public sauf private, c'est bien ça?

Merci Léa




Léa

Didier

Merci. Léa

import java.lang.*;

class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}

public class Prob1 {
public static void main (String[] args) {
A o1 = new A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}








Avatar
Didier Fradet
Merci Didier.


Une donnée protected n'est pas accessible depuis une classe externe
ou un programme main(). Est-ce que la compilation de la classe doit
provoquer une erreur? Pourquoi je continue à y avoir accès lorsque
je lance le programme?

Un attribut déclaré protected est accessible par les classes filles

(héritage) et par les classes du même package. Comme tu n'as pas
précisé de package dans ta classe, la JVM considère qu'elle est dans
un package par défaut, celui de ton répertoire. Par conséquent, si
ta classe Prob1 est dans le même répertoire, elle est dans le même
package (même raison) et il est donc normal que tu accèdes à
l'attribut déclaré protected.



En fait qu'aurait-il fallu que je rajoute dans mes deux fichiers (A
et Prob1) pour qu'il n'y ait pas d'accès possible à la donnée
protected (comme cela devrait être le cas normalement, non?)




Par exemple tu crées un sous-répertoire essai sans lequel tu places
ton fichier A.java :

package essai;

public class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}
}

Dans le répertoire parent de essai, tu places ta classe Prob1 :

public class Prob1 {
public static void main (String[] args) {
essai.A o1 = new essai.A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}

et tu compiles (javac Prob1.java). Tu aurasl'erreur :

Prob1.java:5: x has private access in essai.A
System.out.println(o1.x);
^
Prob1.java:7: z has protected access in essai.A
System.out.println(o1.z);
^
2 errors

Voilà,

Didier



Je vais essayer ta solution. Tes explications me semblent très claires
:) ...
Dans le cas où j'avais laissé mes fichiers dans le même répertoire, en
précisant seulement en début de chacun "import java.lang.*;), la JVM
aurait considéré mes classes comme faisant parties du même package?
Donc en ce qui concerne l'accès, j'aurais eu accès à partir de Prob1 aux
données protected, public sauf private, c'est bien ça?
C'est exactement ça !


Bonne continuation,

Didier


Merci Léa




Léa

Didier

Merci. Léa

import java.lang.*;

class A{
private int x;
public int y;
protected int z;

public A(){
x=1;
y=2;
z=3;
}

public class Prob1 {
public static void main (String[] args) {
A o1 = new A();
System.out.println(o1.x);
System.out.println(o1.y);
System.out.println(o1.z);
}
}










Avatar
euler
Didier Fradet wrote:

Bonjour,
Bonjour,

[...]


Un attribut déclaré protected est accessible par les classes filles

(héritage) et par les classes du même package. Comme tu n'as pas précisé
de package dans ta classe, la JVM considère qu'elle est dans un package
par défaut, celui de ton répertoire. Par conséquent, si ta classe Prob1
est dans le même répertoire, elle est dans le même package (même raison)
et il est donc normal que tu accèdes à l'attribut déclaré protected.



euh presque... je veux dire que c'est le class loader employé qui définit le
package par défaut. Donc deux classes sans déclaration de package seront
dans le même package par défaut ssi elle sont chargées par le même class
loader. En l'occurence, comme la question a été posée par une dame qui se
qualifie elle-même de débutante, il est fort probable qu'elle utilise le
class loader qui s'occupe normalement du classpath...


[...]

}



--
add @hotmail.com to my name