Можно ли использовать this в конструкторе
Содержание статьи
Ключевое слово this в Java
На JavaRush студентов буквально с первых лекций знакомят с ключевым словом this. И со временем становится понятно, что все же оно означает. Но многие, обернувшись назад, наверное, честно себе скажут, что долго не могли осознать дзен этого ключевого слова. В статье приоткрываем завесу тайн применения ключевика this для тех, кто до сих пор в него не может… Welcome!
Если вы возьмете справочник Шилдта по Java, то на 171 странице вы прочитаете о том, что ключевое слово this требуется для того, чтобы метод мог сослаться на вызвавший его объект. На этом, собственно можно было бы и закончить. Но нам нужна конкретика.
Как правило, применять this нужно в двух случаях:
- Когда у переменной экземпляра класса и переменной метода/конструктора одинаковые имена;
- Когда нужно вызвать конструктор одного типа (например, конструктор по умолчанию или параметризированный) из другого. Это еще называется явным вызовом конструктора.
Вот и все, на самом деле не так много, — всего два случая, когда применяется это страшное ключевое слово. Теперь давайте рассмотрим эти две ситуации на примерах.
Пример первый — у переменной экземпляра и метода одинаковые имена
Допустим, у нас есть класс Human, для которого определено поле «имя»:
Давайте для переменной name создадим сеттер (setter вполне рабочий и никакого подвоха здесь нет):
Обратите внимание, что в метод (сеттер) setName мы передаем переменную String newName. Мы ввели новую переменную и (в общем-то) могли назвать ее как угодно ведь она будет видна только в пределах {фигурных скобок} метода setName. Обратите внимание, что в сеттере есть одна строка:
name = newName;
То есть по факту мы ввели новую переменную newName и присвоили ее уже существующей в классе переменной name. Многим программистом казалось это странным, — вводить переменную с новым именем, если в итоге речь идет об одном и том же. Об имени в классе Human. Поэтому, разработчики языка задумались о том, чтобы удобно сделать использование одного имени переменной. Другими словами, зачем иметь два имени для переменной, обозначающей одно и то же. То есть хотелось бы сделать как-то так:
Но в этом случае
возникает проблема
. У нас теперь две переменные, которые называются одинаково. Один String name принадлежит классу Human, а другой String name его методу setName. Поэтому Java – машина не знает, какую переменную вы имеете ввиду, когда пишете строку в сеттере:
name = name;
Java берет самую близкую – name из метода setName:
и получается, что вы просто присваиваете значение переменной name из этого метода, ей же. Что конечно не имеет никакого смысла. Поэтому нужен был какой-то способ, чтобы отличить переменную name из класса Human, от переменной name из метода setName.Для решения этой проблемы и было введено ключевое слово this, которое в данном случае укажет, что нужно вызывать переменную не метода, а класса Human:
То есть this сошлется на вызвавший объект, как было сказано в начале статьи. В результате чего имя человека через сеттер setName будет установлено создаваемому объекту. Ниже приведен программный код без использования ключевого слова this. В коде создается объект класса Human и присваивается ему имя:
А ниже программный код с ключевым словом this:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName(«Volodya»);
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
Таким образом, здесь 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 в Java используется только в составе методов либо конструкторов экземпляра класса. Но неявно ключевое слово this передается во все методы, кроме статических (поэтому this часто называют неявным параметром) и может быть использовано для обращения к объекту, вызвавшему метод. Бояться этого ключевого слова не нужно, потому что This не страшно.
Источник
C#. Ключевое слово this. Назначение. Примеры | BestProg
Содержание
- 1. Определение ключевого слова this. Что означает ключевое слово this в классе?
- 2. Случаи применения ключевого слова this в программах на C#
- 3. Пример использования this для доступа к полям класса из тела метода
- 4. Пример применения this для вызова конструкторов класса
- 5. Передача методу ссылки на текущий объект. Пример
- 6. Пример использования ключевого слова this для объявления индексатора
- 7. В каких случаях в классе нельзя применять ключевое слово this?
- Связанные темы
Поиск на других ресурсах:
1. Определение ключевого слова this. Что означает ключевое слово this в классе?
В методах класса может быть использовано ключевое слово this. По определению this – это неявно присутствующая ссылка на текущий экземпляр класса, которая в классе имеет несколько полезных применений.
⇑
2. Случаи применения ключевого слова this в программах на C#
Ключевое слово this применяется в следующих случаях.
- Когда в методе класса существует имя, совпадающее с именем поля класса.
- Если в классе есть несколько конструкторов, то this применяется для вызова главного конструктора из других (перенаправление на главный конструктор). Это осуществляется с целью избежания дублирования кода.
- Когда в метод нужно передать ссылку на текущий объект. В этом случае, при вызове метода, указывается ключевое слово this.
- Если в классе объявлен индексатор.
⇑
3. Пример использования this для доступа к полям класса из тела метода
В примере, в классе Program объявляются два метода и два конструктора:
- конструктор Program() без параметров;
- конструктор Program() с одним параметром. В этом конструкторе продемонстрировано использование this для инициализации поля класса;
- метод PrintInt() – демонстрирует доступ к полю класса, имя которого перекрывается именем параметра метода;
- метод Print() – демонстрирует доступ к полю класса, имя которого перекрывается именем внутренней переменной, объявленной в методе.
Текст программы следующий
using System;
using static System.Console; // Подключить статический класс System.Console
namespace ConsoleApp2
{
// Тема: Ключевое слово this. Доступ к полям класса из метода.
class Program
{
int d = 25; // поле класса с именем d
// Конструктор без параметров
Program()
{
}
// Конструктор с 1 параметром, имя параметра d
Program(int d)
{
this.d = d; // использование this для доступа к полю d
}
// Функция, которая выводит значение параметра и поля d
public void PrintInt(int d) // имя параметра d совпадает с именем поля d
{
// Доступ к параметру d
WriteLine(«Parameter d = {0}», d);
// Доступ к полю d с помощью обращения this.d
WriteLine(«Field d = {0}», this.d); // Field d = 25
}
// Функция, в которой объявлена внутренняя переменная с именем d
public void Print()
{
// Внутренняя переменная d — имя этой переменной совпадает с именем поля d
int d = 77;
// Вывести значение внутренней переменной d
WriteLine(«Internal d = {0}», d);
// Доступ к полю d реализуется как this.d
WriteLine(«Field d = {0}», this.d); // Field d = 25
}
static void Main(string[] args)
{
// Демонстрация использования ключевого слова this
// 1. Объявить экземпляр класса Program
Program pr = new Program(30); // вызов конструктора с 1 параметром
// 2. Вызвать метод PrintInt()
pr.PrintInt(50);
// 3. Вызвать метод Print()
pr.PrintD();
}
}
}
Результат работы программы
Parameter d = 50
Field d = 30
Internal d = 77
Field d = 30
⇑
4. Пример применения this для вызова конструкторов класса
Ключевое слово this может быть применено для вызова одного конструктора из другого конструктора. Для класса, который содержит несколько конструкторов, выбирается главный конструктор. Это конструктор с наибольшим количеством параметров. Другие конструкторы обращаются к этому главному конструктору с помощью вызова this.
Задан класс Line, определяющий линию заданную координатами двух крайних точек (x1; y1), (x2; y2). В классе продемонстрирован вызов конструкторов с помощью ключевого слова this.
В нашем случае главный конструктор – это конструктор с 4 параметрами.
Текст программы демонстрации класса Line следующий:
using System;
using static System.Console; // Подключить статический класс System.Console
namespace ConsoleApp2
{
// Тема: Ключевое слово this. Вызов конструктора класса
class Line
{
private int x1, y1, x2, y2;
// Главный конструктор, имеет 4 параметра
public Line(int x1, int y1, int x2, int y2)
{
// Использование this для доступа к полям
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
WriteLine(«Line(int, int, int, int)»);
}
// Конструктор с 2 параметрами,
// реализует линию, которая начинается от начала координат.
// В конструкторе используется ключевое слово this
// для перенаправления на конструктор с 4 параметрами.
public Line(int x, int y) : this(0, 0, x, y)
{
WriteLine(«Line(int, int)»);
}
// Конструктор без параметров, реализует линию с координатами (0;0),(1;1)
public Line() : this(1, 1) // перенаправление на конструктор с 2 параметрами
{
WriteLine(«Line()»);
}
// Метод, который выводит поля x1, y1, x2, y2 на экран
public void Print()
{
WriteLine(«Fields values: «);
WriteLine($»x1 = {x1}, y1 = {y1}, x2 = {x2}, y2 = {y2}»);
}
}
class Program
{
static void Main(string[] args)
{
// Продемонстрировать вызовы конструкторов с помощью this
WriteLine(«Object l1:»);
Line l1 = new Line(1, 3, 5, 6);
l1.Print();
WriteLine(«nObject l2:»);
Line l2 = new Line(3, 4);
l2.Print();
WriteLine(«nObject l3:»);
Line l3 = new Line();
l3.Print();
}
}
}
Результат работы программы
Object l1:
Line(int, int, int, int)
Fields values:
x1 = 1, y1 = 3, x2 = 5, y2 = 6
Object l2:
Line(int, int, int, int)
Line(int, int)
Fields values:
x1 = 0, y1 = 0, x2 = 3, y2 = 4
Object l3:
Line(int, int, int, int)
Line(int, int)
Line()
Fields values:
x1 = 0, y1 = 0, x2 = 1, y2 = 1
⇑
5. Передача методу ссылки на текущий объект. Пример
Если в метод класса нужно передать текущий экземпляр этого класса, то используется ключевое слово this. В приведенном ниже примере ключевое слово this применяется в методе DisplayLengthOrigin() класса Point при вызове метода LengthOrigin() этого же класса.
Демонстрационный текст приложения типа Console Application следующий:
using System;
using static System.Console; // Подключить статический класс System.Console
namespace ConsoleApp2
{
// Тема: Ключевое слово this. Передача в метод ссылки на текущий объект
class Point
{
int x, y;
// Конструктор с двумя параметрами
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
// Методы доступа
double GetX() { return x; }
double GetY() { return y; }
void Set(int x) { this.x = x; }
void Set(int y) { this.y = y; }
// Метод, который вычисляет расстояние от точки pt до начала координат
public double LengthOrigin(Point pt)
{
return Math.Sqrt(pt.GetX() * pt.GetX() + pt.GetY() * pt.GetY());
}
// В этом методе применяется this для передачи текущего экземпляра
// в метод LengthOrigin,
// метод выводит на экран расстояние от точки до начала координат
public void DisplayLenthOrigin()
{
double len;
// передача текущего экземпляра в LengthOrigin()
len = LengthOrigin(this);
WriteLine(«The distance to the origin = {0:f3}», len);
}
}
class Program
{
static void Main(string[] args)
{
Point pt = new Point(2, 5);
pt.DisplayLenthOrigin();
}
}
}
Результат работы программы:
The distance to the origin = 5.385
⇑
6. Пример использования ключевого слова this для объявления индексатора
В примере реализован класс ArrayIntegers, который реализует массив целых чисел. Для доступа к элементу массива используется механизм индексаторов. В индексаторе используется ключевое слово this, которое символизирует обращение к текущему экземпляру класса. Более подробно об особенностях использования индексаторов в классах можно прочитать здесь.
Демонстрационный текст программы, созданной по шаблону Console Application приведен ниже.
using System;
using static System.Console; // Подключить статический класс System.Console
namespace ConsoleApp2
{
// Тема: Ключевое слово this. Объявление индексатора.
class ArrayIntegers
{
private int[] Array; // ссылка на массив
// Конструктор с 1 параметром — главный конструктор
// — size — размер массива;
// — defaultValue — аргумент по умолчанию
public ArrayIntegers(int size, int defaultValue = 0)
{
// 1. Проверка на корректность ввода
if (size <= 0)
size = 1; // в массиве как минимум 1 элемент
// 2. Выделить память для массива
Array = new int[size];
// 3. Заполнить массив значениями по умолчанию
for (int i = 0; i < Array.Length; i++)
Array[i] = defaultValue;
}
// Конструктор без параметров,
// вызвать конструктор с 2 параметрами с помощью this
public ArrayIntegers() : this(10, 0) // по умолчанию — 10 элементов
{
}
// Индексатор — доступ к элементу массива по индексу,
// здесь используется ключевое слово this
public int this[int index]
{
// аксессоры
get
{
return Array[index];
}
set
{
Array[index] = value;
}
}
// Метод вывода массива на экран
public void Print()
{
WriteLine(«Array of integers:»);
for (int i = 0; i < Array.Length; i++)
Write($»{Array[i]}t»);
WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
// 1. Объявить экземпляр типа ArrayIntegers
ArrayIntegers AI = new ArrayIntegers(5);
// 2. Инициализировать экземпляр AI значениями
for (int i = 0; i < 5; i++)
AI[i] = i * i;
// 3. Вывести значения элементов массива AI на экран
AI.Print();
}
}
}
Результат работы программы
Array of integers:
0 1 4 9 16
⇑
7. В каких случаях в классе нельзя применять ключевое слово this?
Ключевое слово this нельзя применять:
- в статических методах класса;
- в статических классах.
Это связано с тем, что статические методы существуют только на уровне класса и не связаны с экземплярами класса (объектами класса).
⇑
Связанные темы
- Понятие класса. Общая форма объявления класса. Объект класса. Поля класса. Примеры. Ключевое слово this
⇑
Источник
Смысл использования this в конструкторе — C#
dan24 162 / 101 / 30 Регистрация: 19.01.2013 Сообщений: 820 | ||||||
19.04.2013, 08:58 | 2 | |||||
Незнаю что это Сообщение от fghjru myClass(int _x) Но если у тебя функция static, то ненадо использовать this статик говорит что твоя функция будет работать везде и видится везде. например если приписат static к Сообщение от fghjru int x = 6; то любая функция этого класса будет понимать о чём речь; будет видеть твою переменную. дакстати удобно если переменная обновляймая и нужна во многих функциях Сообщение от fghjru this.x = x; , а в функциях где ненодо , чтобы они видели эту переменную ничего не пишешь. так для разбора пока ещё не готовый код.
https://msdn.microsoft.com/ru-r… 63137.aspx |
Источник