J'ai un petit problème que je ne comprend pas. Pourquoi ce petit programme ... :
public class Test {
public static void main (String[] args)
{
Test ref = new Test2();
ref.f();
}
private void f() { System.out.println ("f() de base"); }
}
class Test2 extends Test {
public void f() { System.out.println ("f() redéfini"); }
}
... retourne 'f() de base' quand on l'exécute, et pas 'f() redéfini' ? Le polymorphisme devrait faire utiliser f() redéfini, et c'est bizarre qu'on ait accès à une méthode privée.
Ben, je dirais que la solution est de ne pas surcharger une méthode privée par une méthode publique. Le compilateur ne devrait pas accepter à mon avis. Mais j'ai essayé avec le JDK 1.3.1 et avec "gcj.exe (GCC) 3.2 (mingw special 20020817-1)" et les deux acceptent et font la même chose (afficher "f() de base").
Pour le fait que tu as accès à la méthode privée, c'est normal, parce que tu es dans la classe à laquelle appartient la méthode! Et je pense aussi que c'est ce qui donne le comportement bizarre du lookup de la fonction. Vu que la fonction est privée, le compilateur ne cherche pas à savoir si elle est surchargée quelque part.
A propos de GCJ : quand j'essaie de générer un .exe à partir de la version MinGW avec gcj --main=Test Test.java, j'obtiens :
ld: cannot open crt2.o: No such file or directory
Qu'est-ce qui ne va pas ?
Mauvaise version du runtime. Il faut un runtime MSVCRT pour utiliser GCJ, pas CRTDLL.
En effet l'exécutable fonctionne sur Windows XP.
Pourtant j'utilise la même version de gcj que toi. Le programme compilé est celui du topic.
J'ai vérifié, et je vois que la kernel32.dll de Windows Me exporte cette fonction en non-documentée. Bref, ce problème doit se manifester sous Windows 95 et éventuellement 98 seulement.
Ceci est à reporter comme bogue contre libjava, et aussi contre w32api qui déclare cette fonction sans le #if _WIN32_WINNT || (_WIN32_WINDOWS >= 0x0490) (avec éventuellement 0x0410 au lieu de 0x0490, je ne sais pas si Windows 98 comporte cette fonction vu qu'elle n'est pas documentée pour 9x/Me) qu'il faut apparemment.