Статические методы и полиморфизм классов Java

Переопределение статических методов класса не имеет практического смысла, так как обращение к статическому атрибуту или методу осуществляется посредством задания имени класса, которому они принадлежат. К статическим методам принципы «позднего связывания» неприменимы. При использовании ссылки для доступа к статическому члену компилятор при выборе метода или поля учитывает тип ссылки, а не тип объекта, ей присвоенного.

/* пример # 6 : поведение статического метода при «переопределении»: Runner.java */

package chapt04;

class Base {

public static void assign() {

System.out.println(

"метод assign() из Base");

}

}

class Sub extends Base {

public static void assign() {

System.out.println(

"метод assign() из Sub");

}

}

public class Runner {

public static void main(String[] args) {

Base ob1 = new Base();

Base ob2 = new Sub();

Sub ob3 = new Sub();

ob1.assign();//некорректный вызов статичесого метода

ob2.assign();//следует вызывать Base.assign();

ob3.assign();

}

}

В результате выполнения данного кода будет выведено:

метод assign() из Base

метод assign() из Base

метод assign() из Sub

При таком способе инициализации объектов ob1 и ob2, метод assign() будет вызван из класса Base. Для объекта ob3 будет вызван собственный метод assign(), что следует из способа объявления объекта. Если же спецификатор static убрать из объявления методов, то вызовы методов будут осуществляться в соответствии с принципами полиморфизма.

Статические методы всегда следует вызывать через имя класса, в котором они объявлены, а именно:

Base.assign();

Sub.assign();

Вызов статических методов через объект считается нетипичным и нарушающим смысл статического определения.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100