2010-09-01 5 views
7

Commençons à utiliser Java. Je trouve beaucoup de similitudes avec .NET, mais je vois que toutes les méthodes en Java sont virtuelles par défaut. Donc la question est ce que je peux faire pour les rendre non virtuel? Le mot-clé final est-il la bonne solution?Méthodes non virtuelles en Java

+0

http://download.oracle.com/javase/tutorial/java/IandI/final.html –

+5

Devinez quoi, j'ai trouvé dans 'C# .NET' beaucoup de similitudes avec' JAVA' ... comme je l'ai quelques similitudes avec mon père ... –

+5

@Garis Ne peut pas obtenir votre point ... Comment il est connecté à la question? – NixDev

Répondre

8

Oui, ou privé

+5

Mais 'private' - tout comme dans .net - rend la méthode indisponible pour les autres classes à appeler, tout en empêchant le dépassement. –

+2

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

+1

non, rien du tout –

2

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

6

Si vous souhaitez que la méthode ne soit pas virtuelle pour les performances, laissez le JIT s'occuper de cela jusqu'à ce que vous ayez la preuve qu'il ne fonctionne pas. Si la raison de rendre la méthode non-virtuelle est de pouvoir la définir dans une sous-classe mais pas de polymorphisme, vous êtes probablement en train de sous-classer sans raison réelle (postez plus de code si vous souhaitez la contester).). Si c'est pour le design, je suggère de faire la classe finale plutôt que des méthodes individuelles si possible. IDEA a de bonnes inspections pour la conception de classe. Essayez de ne pas trop écouter ceux qui veulent que vous laissiez tout ouvert afin qu'ils puissent sous-classer les bogues ou les limitations; ils vous crient encore plus fort quand vous cassez accidentellement leur sous-classe.

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

1

Rendre statique.

Si vous appelez une méthode non virtuelle, vous voulez savoir à partir de votre code quelle méthode de classe vous appelez. La faille de .net est que vous ne pouvez pas le savoir à partir de votre code.

Exemple

En Java si vous définissez ClassB comme

public class ClassB extends ClassA { 
    @Override 
    public void run() { 
    } 
} 

et l'objet

ClassA obj=new ClassB(); 

Si vous appelez obj.run() comment saurez-vous si ce code est suivant les règles de principe ouvert/fermé polymorphe ou codera-t-il la méthode liée à ClassA? En Java, vous saurez qu'il y a toujours du polymorphisme. Il est plus facile de faire des simulacres et il est plus facile d'étendre les classes et de suivre le principe de substitution de Liskov.

sur les autres méthodes statiques de main sont bornés à une classe, donc si vous voulez appeler une méthode qui est liée à ClassA vous pouvez définir cette méthode comme ceci:

public static run(ClassA obj) 

et vous pouvez l'appeler avec

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

et du code que vous saurez que la méthode que vous appelez est défini dans ClassA et non ClassB.

+2

Non. Ne pas rendre une méthode statique lorsqu'elle appartient à l'objet. C'est vraiment un mauvais design. – Cephalopod

Questions connexes