9
votes

Méthodes non virtuelles en Java

Commencez simplement à utiliser Java. Je trouve beaucoup de similitudes avec .net, mais je vois que toutes les méthodes de Java sont virtuelles par défaut. Alors la question est de savoir ce que je peux faire pour les rendre non virtuels? Est le mot-clé final la solution unique et la bonne solution?


9 commentaires

télécharger.oracle.com/javase/taturial/java/iandi/final. HTML


Devinez quoi, j'ai trouvé dans C # .NET Beaucoup de similitudes avec Java ... comme je ai une similitupe avec mon père ...


@Garis ne peut pas obtenir votre point ... comment il est connecté à la question?


Il serait plus correct de dire que .NET a beaucoup de similitudes avec Java, car Java était là en premier. Microsoft a essayé de jouer leur jeu d'étreinte et d'étendue avec Java mais a échoué, ils ont donc introduit leur propre langue avec les mêmes idées de base que Java.


@StarBlue dans Java 5 et 6 Vous pouvez voir les caractéristiques prises de C #. Mais de toute façon, ce n'est pas le point. Personnellement, je m'en fous, ce qui est le premier qui est le meilleur et le meilleur type de choses ... Pour moi, le meilleur est celui avec lequel je vais faire le travail ... alors reformez-le comme vous le souhaitez.


Pourquoi ne modifiez-vous pas la question pour sortir la référence à .net? Il suffit de supprimer le "Je trouve beaucoup de similitudes avec .NET, mais" partie. La question est toujours la même, mais sans la partie qui causerait des guerres religieuses. Je ferais cela moi-même si j'avais le représentant.


Cela dépend de la raison pour laquelle vous faites cela. Si vous faites cela pour l'efficacité, vous n'avez pas besoin de le faire, le JVM peut résoudre ce problème.


Je ne dis pas que .Net est tout mal, au moins, il réveilla les gars Java. Une grande partie des bonnes choses dans Java 5 et 6 sont le résultat de cela.


Son plus comme j'ai des similitudes avec mon père, mais il a appris une chose ou deux de moi trop plus tard sur: p.


4 Réponses :


9
votes

oui ou privé


4 commentaires

Mais privé - tout comme dans .net - rend la méthode indisponible pour d'autres classes à appeler, ainsi que de prévenir le dépassement.


Mais que puis-je faire lorsque j'ai besoin d'avoir une méthode en classe enfant avec le même nom que dans la classe mère. En C # Il y a un mot clé neuf pour de tels cas ... y a-t-il quelque chose de similaire à Java.


Ce n'est pas vrai - final dans Java empêche le priorité, il ne fait pas de prouver le dépassement non virtuel.


@Janmares d'accord alors: disons simplement que cela empêche le remplacement.



2
votes

Au lieu de définir toutes les méthodes en finale, vous pouvez également définir la classe entière en finale. Je ne dis pas si ce bon ou un bon style.


0 commentaires

8
votes

Si vous visez à faire la méthode non virtuelle de la performance, laissez le JIT sur cela jusqu'à ce que vous ayez une preuve que cela ne fait pas.

Si la raison de faire de la méthode non virtuelle est de pouvoir le définir dans une sous-classe mais pas impliquer un polymorphisme, vous ne sousclenant probablement pas de raison réelle (publier plus de code si vous souhaitez contester cela) .

Si c'est pour la conception, je suggérerais de faire la finale de la classe au lieu de méthodes individuelles si possible. L'idée a de bonnes inspections pour la conception de classe. Essayez de ne pas écouter de trop près ceux qui veulent que vous laissiez tout ouverture afin qu'ils puissent sous-classer pour pirater des bugs ou des limites; Ils vous crieront encore plus fort lorsque vous cassez accidentellement leur sous-classe.

Fournir un moyen pour les clients d'ajouter leurs propres types plutôt que de sous-classes les vôtres et ils ne remarqueront probablement pas que vos classes sont finales.


0 commentaires

1
votes

Rendez-le statique.

Si vous appelez une méthode non virtuelle, vous souhaitez connaître à votre code quelle méthode de classe vous appelez. La faille de .NET est que vous ne pouvez pas le savoir de votre code. P>

Exemple fort> p>

en Java si vous définissez Classb comme P>

ClassB obj=new ClassB();
ClassA.run(obj);


2 commentaires

Non, ne faites pas une méthode statique quand elle appartient à l'objet. C'est vraiment mauvais design.


Je ne pense pas que la création de méthodes statiques est une bonne approche ici.