Прежде всего Что подразумевается под методом Hiding?
blockquote>Метод скрытия означает, что подкласс задает метод класса с той же сигнатурой, что и метод класса в суперклассе. В этом случае метод суперкласса скрыт подклассом. Это означает, что: версия метода, который будет выполнена, будет NOT определяться объектом, который используется для его вызова. Фактически это будет определяться ссылочной переменной типа, используемой для вызова метода .
Что подразумевается под переопределением метода?
blockquote>Подкласс класса переопределения метода определил метод экземпляра с тем же типом сигнатуры и возвращаемого типа (включая ковариантный тип) в качестве метода экземпляра в суперклассе. В этом случае метод суперкласса переопределяется (заменяется) подклассом. Это означает, что: версия метода, который выполняется , будет , определяемой объектом, который используется для его вызова. Он не будет определяться типом ссылочной переменной, используемой для вызова метода .
Почему статические методы нельзя переопределять?
blockquote >Поскольку статические методы разрешаются статически (т. е. во время компиляции) на основе класса, на который они вызывают, а не динамически, как в случае с методами экземпляра, которые разрешены полиморфно на основе типа среды выполнения объекта.
Как обращаться к статическим методам?
blockquote>Статические методы должны быть доступны статическим способом. т.е. по имени самого класса, а не с помощью экземпляра.
Вот краткий демонстрационный метод для переопределения и скрытия метода:
class Super { public static void foo(){System.out.println("I am foo in Super");} public void bar(){System.out.println("I am bar in Super");} } class Child extends Super { public static void foo(){System.out.println("I am foo in Child");}//Hiding public void bar(){System.out.println("I am bar in Child");}//Overriding public static void main(String[] args) { Super sup = new Child();//Child object is reference by the variable of type Super Child child = new Child();//Child object is referenced by the variable of type Child sup.foo();//It will call the method of Super. child.foo();//It will call the method of Child. sup.bar();//It will call the method of Child. child.bar();//It will call the method of Child again. } }
Выходной файл
I am foo in Super I am foo in Child I am bar in Child I am bar in Child
Очевидно, как указано, так как
foo
- это метод класса, поэтому вызванная версияfoo
будет определяться типом ссылочной переменной (например, Super или Child), ссылающейся на объектChild
. Если на него ссылается переменнаяSuper
, то вызываетсяfoo
изSuper
. И если на него ссылается переменнаяChild
, то вызываетсяfoo
изChild
. В то время как , так какbar
- это метод экземпляра, поэтому вызываемая версияbar
определяется только объектом (например,Child
), который используется для его вызова. Независимо от того, через какую ссылочную переменную (Super
илиChild
) она вызывается, метод, который будет вызываться, всегда имеет значениеChild
.
Это - известная проблема: Инициатива С открытым исходным кодом имеет Комитет по Быстрому увеличению Лицензии, который рекомендует использование одной из восьми лицензий, которые "популярны и широко используемые или с сильными сообществами".
Другие лицензии классифицированы как: "избыточный" (например, лицензия NCSA избыточна с BSD), "специальное использование" или "одноразового использования" (например, лицензия НАСА, Исходная Лицензия Общественности Apple), "замененный" (например, MPL v1.0), и так далее.
Наличие Вашей собственной лицензии (обычно вариант на одном из существующих) позволяет Вам полный контроль над ним. Я подозреваю, что вещи как огромное изменение между GPL2 и GPL3 (особенно, если Вы имеете дело с веб-сервисами) делают людей подозрительным лицензированием с соглашением за пределами управления.
Я также думаю, что некоторые лицензии тесно связываются с определенными идеологиями. У многих пользователей лицензии Creative Commons есть то же отношение к законодательству авторского права. GPL, с другой стороны, имеет долгую историю с разработкой Linux. Человек или организация, которая не соглашается с основными положениями обычно, присоединяли определенную лицензию, может принять решение искать альтернативу.
Наличие Вашей собственной лицензии (обычно вариант на одном из существующих) позволяет Вам полный контроль над ним. Я подозреваю, что вещи как огромное изменение между GPL2 и GPL3 (особенно, если Вы имеете дело с веб-сервисами) делают людей подозрительным лицензированием с соглашением за пределами управления.
Я думаю, что это верно в некоторой степени. Однако, когда Вы лицензируете под GPL, у Вас есть опция сказать, "Версия 2", "Версия 2 или позже". Если Вы хитры о том, как лицензия может измениться в будущем, Вы свободны просто сказать, что это лицензируется под той определенной версией.
Является быстрое увеличение лицензий Open Source просто другим примером программистов, живущих NYI (Не Изобретенный Здесь) синдром?
По моему скромному мнению, да, абсолютно. Возьмите лицензию Microsoft PL в качестве примера. Это абсолютно избыточно. Однако, мне нравится этот много, потому что он очень ясно сформулирован, намного короче, чем большинство других лицензий и обеспечивает хорошую сумму свободы.
С другой стороны, обработка новой лицензии чревата рисками потому что, пока это не доказало свою ценность перед фактическим судом, это не стоит бумаги, которая она записана на (если таковые имеются).
По моему скромному мнению, существует очень немного лицензий, которые стоит знать и использовать среди них GPL (который я лично не люблю), LGPL, BSD и МН г-жой, и конечно лицензии Creative Commons, но они не подходят для программного обеспечения.
Я думаю, что это верно в некоторой степени. Однако, когда Вы лицензируете под GPL, у Вас есть опция сказать, "Версия 2", "Версия 2 или позже". Если Вы хитры о том, как лицензия может измениться в будущем, Вы свободны просто сказать, что это лицензируется под той определенной версией.
Это открывает другую кучу проблем, все же.
Если Вы выпустили под GPL2 только, и GPL3 выходит, и Вам нравятся изменения, которые он вносит, Вы теоретически оказываетесь перед необходимостью бродить вокруг всем своим участникам и получать их единодушное одобрение изменить лицензию, под которой выпущен их код. Все он, взятия являются одним из них для высказывания "нет, я только, лицензировал мои вклады под GPL2, и откажитесь разрешать GPL3" - или они не могут просто ответить - для ухода в подпрограмму предложенного изменения лицензии.
Если Вы выпустили под GPL2 только, и GPL3 выходит, и Вам нравятся изменения, которые он вносит, Вы теоретически оказываетесь перед необходимостью бродить вокруг всем своим участникам и получать их единодушное одобрение изменить лицензию, под которой выпущен их код. Все он, взятия являются одним из них для высказывания "нет, я только, лицензировал мои вклады под GPL2, и откажитесь разрешать GPL3" - или они не могут просто ответить - для ухода в подпрограмму предложенного изменения лицензии.
Который поднимает некоторые другие вопросы. Вы планируете принять патчи от внешних разработчиков? То, когда Вы действительно признаете, что патчи делают Вас, требует, чтобы патч submitters передал авторское право также? Если они не передают авторское право, как это позволяет Вам изменять свою собственную лицензию на будущие соображения. Если был проект с их собственной лицензией, и я собирался выпустить набор кода к нему, это указало, что лицензировалось под версией N XYX или какой-либо будущей версией, то, что должно сказать, что люди, управляющие той лицензией, не сделают полных 180 на будущей версии и сделают ее абсолютно закрытым исходным кодом?
Я не думаю, что люди понимают, что вы часто не можете связать код с разными лицензии, тогда как, например, вы можете комбинировать любой код GPLv2 с любым другим кодом GPLv2.