Il est plus orienté objet dans le sens où, étant donné une classe Scala, chaque appel de méthode est un appel de méthode sur cet objet. En Java, les méthodes static ne interagissent pas avec l'état de l'objet.
En fait, étant donné un objet a
d'une classe A
avec la méthode static m()
, il est considéré comme une mauvaise pratique d'appeler a.m()
. Il est recommandé d'appeler A.m()
à la place (Je crois qu'Eclipse vous donnera un avertissement). Les méthodes static Java ne peuvent pas être redéfinies, elles peuvent simplement être masquées par une autre méthode :
class A {
public static void m() {
System.out.println("m from A");
}
}
public class B extends A {
public static void m() {
System.out.println("m from B");
}
public static void main(String[] args) {
A a = new B();
a.m();
}
}
Qu'affichera a.m()
?
En Scala, vous mettriez les méthodes static dans les objets compagnons A et B et l'intention serait plus claire car vous vous référeriez explicitement au compagnon A ou B.
Ajoutant le même exemple en Scala :
class A
object A {
def m() = println("m from A")
}
class B extends A
object B {
def m() = println("m from B")
def main(args: Array[String]) {
val a = new B
A.m() // ne peut pas appeler a.m()
}
}