Java видимость переменных this

Область видимости переменных в Java

В Java, как и в любом языке программирования, каждая переменная имеет область видимости. Это сегмент программы, где переменная может использоваться и является действительной.

В этом руководстве мы познакомим вас с доступными областями действия в Java и обсудим различия между ними.

2. Область действия класса​

Каждая переменная, объявленная внутри квадратных скобок класса ( <> ) с модификатором доступа private , но вне любого метода, имеет область действия класса. В результате эти переменные можно использовать везде в классе, но не вне его :

 public class ClassScopeExample    private Integer amount = 0;   public void exampleMethod()    amount++;   >   public void anotherExampleMethod()    Integer anotherAmount = amount + 4;   >   > 

Мы видим, что ClassScopeExample имеет переменную класса amount , доступ к которой можно получить в методах класса.

Если мы не используем private , он будет доступен из всего пакета. Прочтите статью о модификаторах доступа для получения дополнительной информации.

3. Область применения метода​

Когда переменная объявлена внутри метода, она имеет область действия метода и будет действительна только внутри того же метода:

 public class MethodScopeExample    public void methodA()    Integer area = 2;   >   public void methodB()    // compiler error, area cannot be resolved to a variable   area = area + 2;   >   > 

В методе A мы создали переменную метода с именем area . По этой причине мы можем использовать область внутри метода A , но не можем использовать ее где-либо еще.

4. Объем цикла​

Если мы объявим переменную внутри цикла, она будет иметь область действия цикла и будет доступна только внутри цикла:

 public class LoopScopeExample    ListString> listOfNames = Arrays.asList("Joe", "Susan", "Pattrick");   public void iterationOfNames()    String allNames = "";   for (String name : listOfNames)    allNames = allNames + " " + name;   >   // compiler error, name cannot be resolved to a variable   String lastNameUsed = name;   >   > 

Мы видим, что метод iterationOfNames имеет переменную метода с именем name . Эта переменная может использоваться только внутри цикла и недействительна вне его.

5. Область применения кронштейна​

Мы можем определить дополнительные области в любом месте, используя скобки ( <> ):

 public class BracketScopeExample    public void mathOperationExample()    Integer sum = 0;      Integer number = 2;   sum = sum + number;   >   // compiler error, number cannot be solved as a variable   number++;   >   > 

Номер переменной действителен только в квадратных скобках.

6. Область видимости и затенение переменных​

Представьте, что у нас есть переменная класса, и мы хотим объявить переменную метода с таким же именем:

 public class NestedScopesExample    String title = "ForEach";   public void printTitle()    System.out.println(title);   String title = "John Doe";   System.out.println(title);   >   > 

В первый раз, когда мы печатаем title , будет напечатано «ForEach». После этого объявите одноименную переменную метода и присвойте ей значение «John Doe ».

Переменная метода title отменяет возможность повторного доступа к переменной title класса . Вот почему во второй раз он напечатает «John Doe » .

Сбивает с толку, верно? Это называется затенением переменных и не является хорошей практикой. Лучше использовать префикс this для доступа к переменной класса title , например this.title .

7. Заключение​

Мы изучили различные области видимости, существующие в Java.

Как всегда, код доступен на GitHub .

Источник

Ключевое слово this

Java-университет

Ключевое слово this <в примерах data-lazy-src=

Таким образом, здесь this позволяет не вводить новые переменные для обозначения одного и того же, что позволяет сделать код менее «перегруженным» дополнительными переменными.

Пример второй — Применение this для явного вызова конструктора

Вызов одного конструктора из другого может пригодиться тогда, когда у вас (как ни странно) несколько конструкторов и вам не хочется в новом конструкторе переписывать код инициализации, приведенный в конструкторе ранее. Запутал? Все не так страшно как кажется. Посмотрите на код ниже, в нем два конструктора класса Human :

 class Human < int age; int weight; int height; Human(int age, int weight)< this.age = age; this.weight = weight; >Human(int age, int weight, int height) < //вы вызываете конструктор с двумя параметрами this(age, weight); //и добавляете недостающую переменную this.height = height; >> 

Здесь у нас сначала приводится конструктор с двумя параметрами, который принимает int age и int weight . Допустим, мы написали в нем две строчки кода:

 this.age = age; this.weight = weight; 

а потом решили добавить еще один конструктор, с тремя параметрами, который помимо возраста и веса принимает еще и рост. В новом конструкторе вы бы могли написать так:

 this.age = age; this.weight = weight; this.height = height; 

Но вместо того, чтобы повторять уже написанный ранее код в этом конструкторе, вы можете с помощью ключевого слова this явно вызвать конструктор с двумя параметрами:

 this(age, weight); // и дописываете недостающую переменную: this.height = height; 
  • вызови this (этот) конструктор, который имеет два параметра.
  • и добавить недостающую переменную.

Ключевое слово this <в примерах data-lazy-src=

Кофе-брейк #236. Ключевое слово this в Java: способы и примеры использования

Java-университет

Кофе-брейк #236. Ключевое слово this в Java: способы и примеры использования - 1

Источник: Medium Благодаря этому руководству вы узнаете о предназначении ключевого слова this в Java, как и где его использовать на основе практических примеров. В Java ключевое слово this используется для ссылки на текущий объект внутри метода или конструктора. Например:

 class Main < int instVar; Main(int instVar)< this.instVar = instVar; System.out.println("this reference = " + this); >public static void main(String[] args) < Main obj = new Main(8); System.out.println("object reference terminal">this reference = Main@23fc625e object reference = Main@23fc625e
В приведенном выше примере мы создали объект с именем obj класса Main. Затем мы печатаем ссылку на объект obj и ключевое слово this класса. Как мы видим, ссылка на obj и на this одинаковая. Это означает, что this является ссылкой на текущий объект.

Использование ключевого слова this

Существуют несколько ситуаций, в которых используется ключевое слово this.

1. Использование this для различия наименований переменных

В Java не разрешается объявлять две или более переменных с одинаковым именем внутри области видимости (области действия класса или области действия метода). Однако переменные и параметры экземпляра могут иметь одно и то же имя. Вот пример:
 class MyClass < // переменная экземпляра int age; // параметр MyClass(int age)< age = age; >> 

В этой программе переменная экземпляра и параметр имеют одно и то же имя: age . Поэтому компилятор Java сбит с толку. Чтобы решить проблему мы используем ключевое слово this . Но сначала давайте взглянем на пример, где this не используется:

 class Main < int age; Main(int age)< age = age; >public static void main(String[] args) < Main obj = new Main(8); System.out.println("obj.age terminal">obj.age = 0
В приведенном выше примере мы передали конструктору значение 8. Тем не менее, на выходе мы получаем 0. Это связано с тем, что компилятор Java запутался из-за неоднозначности имен между экземпляром переменной и параметром. Теперь давайте перепишем этот код, используя ключевое слово this.
 class Main < int age; Main(int age)< this.age = age; >public static void main(String[] args) < Main obj = new Main(8); System.out.println("obj.age terminal">obj.age = 8
Теперь мы получили вполне ожидаемый результат. Это связано с тем, что при вызове конструктора this внутри него заменяется объектом obj, который вызывает конструктор. Следовательно, переменной age присваивается значение 8. Кроме того, если имя параметра и переменной экземпляра различаются, компилятор автоматически добавляет ключевое слово this. Перед вами пример кода:
 class Main < int age; Main(int i) < age = i; >> 

2. Ключевое слово this с геттерами и сеттерами

Еще одно распространенное использование ключевого слова this — в методах классов setter и getter . Например:

 class Main < String name; // метод setter void setName( String name ) < this.name = name; >// метод getter String getName() < return this.name; >public static void main( String[] args ) < Main obj = new Main(); // вызов метода setter и getter obj.setName("Toshiba"); System.out.println("obj.name: "+obj.getName()); >> 
  • чтобы присвоить значение внутри метода setter
  • для доступа к значению внутри метода getter

3. Использование this в перегрузке конструктора

При работе с перегрузкой конструктора нам может потребоваться вызвать один конструктор из другого конструктора. В данном случае мы не можем вызвать конструктор явно. Вместо этого мы должны использовать this в виде другой формы ключевого слова, то есть this() . Рассмотрим пример кода:

 class Complex < private int a, b; // конструктор с двумя параметрами private Complex( int i, int j )< this.a = i; this.b = j; >// конструктор с одним параметром private Complex(int i) < // вызывает конструктор с двумя параметрами this(i, i); >// конструктор без параметров private Complex() < // вызывает конструктор с одним параметром this(0); >@Override public String toString() < return this.a + " + " + this.b + "i"; >public static void main( String[] args ) < // создание объекта класса Complex // вызов конструктора с двумя параметрами Complex c1 = new Complex(2, 3); // вызывает конструктор с одним параметром Complex c2 = new Complex(3); // вызывает конструктор без параметров Complex c3 = new Complex(); // выводим объекты System.out.println(c1); System.out.println(c2); System.out.println(c3); >> 
  • вызова конструктора Complex(int i, int j) из конструктора Complex(int i)
  • вызова конструктора Complex(int i) из конструктора Complex()

Здесь, когда мы печатаем объект c1 , то объект преобразуется в строку. В этом процессе вызывается toString() . Поскольку мы переопределяем метод toString() внутри нашего класса, то мы получаем вывод в соответствии с этим методом. Одним из огромных преимуществ this() является уменьшение количества дублирующегося кода. Тем не менее, мы всегда должны быть осторожны, если решаем использовать this() . Это связано с тем, что вызов конструктора из другого конструктора добавляет сложность и сам по себе является довольно медленным процессом. Примечание. Вызов одного конструктора из другого конструктора называется явным вызовом конструктора.

4. Передача this в качестве аргумента

Мы также можем использовать ключевое слово this для передачи текущего объекта в качестве аргумента метода. Перед вами пример кода:

 class ThisExample < // объявление переменных int x; int y; ThisExample(int x, int y) < // присваиваем значения переменных внутри конструктора this.x = x; this.y = y; // значение x и y перед вызовом add() System.out.println("Before passing this to addTwo() method:"); System.out.println("x = " + this.x + ", y = " + this.y); // вызываем метод add(), передав this в качестве аргумента add(this); // значение x и y после вызова add() System.out.println("After passing this to addTwo() method:"); System.out.println("x = " + this.x + ", y terminal">Перед передачей this методу addTwo(): x = 1, y = -2 После передачи this методу addTwo(): x = 3, y = 0
В этом примере обратите внимание на строку внутри конструктора ThisExample():
 add(this); 

В ней мы вызываем метод add() , передавая this в качестве аргумента. Поскольку это ключевое слово содержит ссылку на объект класса obj , мы можем изменить значение x и y внутри метода add() .

Источник

Читайте также:  Смена версии php vestacp
Оцените статью