OVH Cloud OVH Cloud

Heritage et fonctions statiques

3 réponses
Avatar
Xavier Tarrago
Bonjour a tous,
Je me pose une question existentielle : Comment est résolue le lien vers
une fonction statique si deux classes dans un gaphe d'héritage ont une
fonction avec la signature qui va bien. Pareil pour les champs.
Exemple :

class A {
public static String fld = "A.fld";
static void print ( String s) { System.err;println( "A.print " + s) ;}
}
class B {
public static String fld = "B.fld";
static void print ( String s) { System.err;println( "B.print " + s) ;}
}
class Test {
public void main(String[] args) {
A.print ( A.fld); // -> A.print A.fld ca parait logique.
B.print ( B.fld); // -> A.print B.fld La, c'est bizarre.
}
}

On dirait que pour une fonction statique, la resolution est toujours faite
vers la classe ancetre du graphe d'heritage.
Ex B;print() appelle A.print
Pour les champs, c'est la classe par laquelle on accede au champ qui prime
Ex B.fld adresse B.fld

J'ai regardé la spec, mais je n'ai rien trouve la-dessus.

Cordialement,
Xavier tarrago

3 réponses

Avatar
Philippe C
Bonjour,
avec le code modifié suivant :

class A {
public static String fld = "A.fld";
static void print(String s) {
System.out.println("A.print " + s);
}
}
class B extends A {
public static String fld = "B.fld";
static void print(String s) {
System.out.println("B.print " + s);
}
}
public class Test {
public static void main(String[] args) {
A.print(A.fld);
B.print(B.fld);
}
}

je trouve tout naturellement :
A.print A.fld
B.print B.fld

--
PhilippeC
Avatar
Xavier Tarrago
Avec quelle version java ? moi, j'ai 1.4.2 et ça ne marche pas. Ca a l'air
d'un bug.

"Philippe C" a écrit dans le message de
news:bjsudn$3g8$
Bonjour,
avec le code modifié suivant :

class A {
public static String fld = "A.fld";
static void print(String s) {
System.out.println("A.print " + s);
}
}
class B extends A {
public static String fld = "B.fld";
static void print(String s) {
System.out.println("B.print " + s);
}
}
public class Test {
public static void main(String[] args) {
A.print(A.fld);
B.print(B.fld);
}
}

je trouve tout naturellement :
A.print A.fld
B.print B.fld

--
PhilippeC




Avatar
Xavier Tarrago
Oooops! Désolé pour le bruit de fond! Je me suis emmelé les pinceaux. En
fait, le comportement de du compilateur est bien celui décrit par Philippe
C. et aussi celui qui paraît le plus logique.
Merci...

"Xavier Tarrago" a écrit dans le message de
news:bk46co$kb1$
Avec quelle version java ? moi, j'ai 1.4.2 et ça ne marche pas. Ca a l'air
d'un bug.

"Philippe C" a écrit dans le message de
news:bjsudn$3g8$
Bonjour,
avec le code modifié suivant :