аргумента метода и т.п.
class Test { public void process() { } public static void main(String s[]) { // process(); - ошибка! // у какого объекта его вызывать? Test test = new Test(); test.process(); // так правильно } }
Ключевые слова this и super
Эти ключевые слова уже упоминались, рассматривались и некоторые случаи их применения. Здесь они будут описаны более подробно.
Если выполнение кода происходит в динамическом контексте, то должен быть объект, ассоциированный с ним. В этом случае ключевое слово this возвращает ссылку на данный объект:
class Test { public Object getThis() { return this; // Проверим, куда указывает эта ссылка } public static void main(String s[]) { Test t = new Test(); System.out.println(t.getThis()==t); // Сравнение } }
Результатом работы программы будет:
true
То есть внутри методов слово this возвращает ссылку на объект, у которого этот метод вызван. Оно необходимо, если нужно передать аргумент, равный ссылке на данный объект, в какой-нибудь метод.
class Human { public static void register(Human h) { System.out.println(h.name+ ' is registered.'); } private String name; public Human (String s) { name = s; register(this); // саморегистрация } public static void main(String s[]) { new Human('John'); } }
Результатом будет:
John is registered.
Другое применение this рассматривалось в случае 'затеняющих' объявлений:
class Human { private String name; public void setName(String name) { this.name=name; } }
Слово this можно использовать для обращения к полям, которые объявляются ниже:
class Test { // int b=a; нельзя обращаться к // необъявленному полю! int b=this.a; int a=5; { System.out.println('a='+a+', b='+b); } public static void main(String s[]) { new Test(); } }
Результатом работы программы будет:
a=5, b=0
Все происходит так же, как и для статических полей – b получает значение по умолчанию для a, т.е. ноль, а затем a инициализируется значением 5.
Наконец, слово this применяется в конструкторах для явного вызова в первой строке другого конструктора этого же класса. Там же может применяться и слово super, только уже для обращения к конструктору родительского класса.
Другие применения слова super также связаны с обращением к родительскому классу объекта. Например, оно может потребоваться в случае переопределения (overriding) родительского метода.
Переопределением называют объявление метода, сигнатура которого совпадает с одним из методов родительского класса.
class Parent { public int getValue() { return 5; }