2010-09-01 4 views
7

Только что начал использовать Java. Я нахожу много общего с .NET, но я вижу, что все методы в Java виртуальны по умолчанию. Итак, вопрос в том, что я могу сделать, чтобы сделать их не виртуальными? Является ли ключевое слово final одним и правым решением?Не виртуальные методы в Java

+0

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

+5

Угадайте, что я нашел в 'C# .NET' много общего с' JAVA' ... как ia have некоторые сходства с моим отцом ... –

+5

@Garis Не может понять ваш вопрос ... Как это связано с вопросом? – NixDev

ответ

8

Да, или частный

+5

Но 'private' - как и в .net - делает метод недоступным для других классов для вызова, а также для предотвращения переопределения. –

+2

Но что я могу сделать, когда мне нужно иметь метод в дочернем классе с тем же именем, что и в родительском классе. В C# есть ключевое слово new для таких случаев ... есть ли что-то подобное в Java. – NixDev

+1

nope, ничего вообще –

2

Вместо того, чтобы определить все методы, как окончательные, вы можете также определить весь класс как окончательные. Я не говорю, этот хороший или плохой стиль.

6

Если вы намерены сделать метод не виртуальным для производительности, пусть JIT справится с этим, пока не появится доказательство того, что он не делает.

Если причина, по которой метод не виртуальный, должен иметь возможность определять его в подклассе, но не включать в себя полиморфизм, вы, вероятно, подклассифицируете по какой-либо причине (напишите больше кода, если вы хотите оспаривать это).

Если это для дизайна, я бы предложил сделать классный final вместо индивидуальных методов, если это возможно. У IDEA есть хорошие проверки для дизайна классов. Старайтесь не слишком внимательно слушать тех, кто хочет, чтобы вы оставили все открытыми, чтобы они могли подклассировать, чтобы взломать ошибки или ограничения; они будут кричать на вас еще громче, когда вы случайно сломаете свой подкласс.

Предоставьте клиентам возможность добавлять свои собственные типы, а не подклассы, и они, вероятно, даже не заметят, что ваши классы являются окончательными.

1

Сделать статическим.

Если вы вызываете не виртуальный метод, то вы хотите узнать из своего кода, какой метод класса вы вызываете. Недостатком .net является то, что вы не можете знать это из своего кода.

Пример

В Java, если вы определяете ClassB, как

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

и объект

ClassA obj=new ClassB(); 

Если вы звоните obj.run(), как вы знаете, если этот код следуя правилам полиморфного принципа open/close или он будет кодировать метод, относящийся к ClassA? В Java вы будете знать, что всегда существует полиморфизм. Легче сделать издевки, и легче расширить классы и следовать принципу замещения Лискова.

С другой стороны статические методы ограничены в классе, так что если вы хотите, чтобы вызвать метод, который связан с ClassA вы можете определить этот метод так:

public static run(ClassA obj) 

и вы можете назвать его

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

и из кода вы узнаете, что метод, который вы вызываете, определяется в ClassA, а не в ClassB.

+2

Нет. Не ставьте метод, когда он принадлежит объекту. Это очень плохой дизайн. – Cephalopod