Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
1

Доступ к переменной через конструктор при перегрузке конструктора

31.08.2018, 17:37. Показов 4630. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую ребята.
Изучаю Java.
Наткнулся на такую штуку.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class test {
    public static void main(String[] args) {
        Yes yes = new Yes("Филя", 12);
        Yes yes1 = new Yes("Петр");
    }
}
class Yes {
    private String name;
    private int age;
    private String name2;
 
    public Yes(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println(this.name + " " + this.age);
    }
 
    public Yes(String name2) {
        this.name2 = name2;
        System.out.println(this.name2 + " " + this.age);
    }
}
Возвращает в ответ:

Филя 12
Петр 0

У меня вопрос, почему "Петр 0" а не "Петр 12" ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2018, 17:37
Ответы с готовыми решениями:

Получить доступ к переменной из конструктора самой формы для функции
Привет всем! У меня проблема, не могу получить доступ к переменной "port_p" из конструктора самой...

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

Ошибка в перегрузке конструктора копирования
// strimem.cpp // Класс String с экономией памяти // Перегружаемая операция присваивания и...

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую...

45
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
31.08.2018, 17:42 2
Цитата Сообщение от Favorskij Посмотреть сообщение
У меня вопрос, почему "Петр 0" а не "Петр 12" ?
а откуда там 12 возьмется и почему не 120?
Петя от фили данные не забирает, это отдельное существо, при его создании ты возраст не указал
1
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
31.08.2018, 17:46  [ТС] 3
Цитата Сообщение от Welemir1 Посмотреть сообщение
а откуда там 12 возьмется и почему не 120?
Петя от фили данные не забирает, это отдельное существо, при его создании ты возраст не указал
Java
1
2
3
4
public Yes(String name2) {
        this.name2 = name2;
        System.out.println(this.name2 + " " + this.age);
    }
Ведь вот эту this.age обращается к переменной класса private int age;
0
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
31.08.2018, 17:49 4
Favorskij, да, обращается, но ты ее для второго объекта не задал, потому берется значение по умолчанию: для примитивов это 0, для объектов нулл. Внимание! важно! yes и yes1 это разные объекты, их поле возраст не общее, то есть у каждого свое. то что ты Филе дал 12 лет еще не значит что и пете столько же.
1
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
31.08.2018, 17:50  [ТС] 5
Если построить похожую конструкцию с методами, то такого явления не не наблюдается. А вот тут, почему то вот такая штуку, вот я и не могу понять почему.
0
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
31.08.2018, 17:51 6
Лучший ответ Сообщение было отмечено Favorskij как решение

Решение

Favorskij, ваше предположение станет действительным, если объявить age статическим:
Java
1
private static int age;
1
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17573 / 10326 / 2820
Регистрация: 21.10.2017
Сообщений: 22,388
31.08.2018, 17:52 7
Цитата Сообщение от Favorskij Посмотреть сообщение
Изучаю Java.
Обрати пристальное внимание на главу про классы и объекты.
Класс - это, по сути, шаблон, по которому ты создаешь объекты.
Т.е. каждый раз, когда ты используешь new - ты создаешь новый объект, который отличается от предыдущего, даже если ты передал в конструктор те же самые параметры.
1
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
31.08.2018, 17:52  [ТС] 8
Цитата Сообщение от Welemir1 Посмотреть сообщение
Favorskij, да, обращается, но ты ее для второго объекта не задал, потому берется значение по умолчанию: для примитивов это 0, для объектов нулл. Внимание! важно! yes и yes1 это разные объекты, их поле возраст не общее, то есть у каждого свое. то что ты Филе дал 12 лет еще не значит что и пете столько же.

Хорошо. Если я ниже создам метод, и сделаю в этом методе System.out.println(this.age); и вызову его, то будет нуль. Почему? Ведь там есть параметры, а именно 12. Но он все ровно дает 0
0
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
31.08.2018, 17:54 9
Лучший ответ Сообщение было отмечено Favorskij как решение

Решение

если сделаешь поле общим private static int age; то тогда и пете станет 12, но тогда это будет возраст для всех объектов твоего класса, ты не сможешь разные возрасты делать им, только 1 на всех.
1
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
31.08.2018, 17:54 10
Favorskij, new Yes - вы создаете НОВЫЙ объект, у которого все переменные будут иметь DEFAULT значения.
1
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
31.08.2018, 17:55 11
Цитата Сообщение от Favorskij Посмотреть сообщение
Ведь там есть параметры, а именно 12.
еще раз прочти что я написал, там не много текста! нет там 12, так как это ДРУГОЙ объект
1
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
31.08.2018, 17:58  [ТС] 12
Цитата Сообщение от sdasdaw Посмотреть сообщение
ваше предположение станет действительным, если объявить age статическим:
Вот оно где рыба зарыта. Спасибо. Буду изучать.
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17573 / 10326 / 2820
Регистрация: 21.10.2017
Сообщений: 22,388
31.08.2018, 17:59 13
Favorskij,
Цитата Сообщение от Favorskij Посмотреть сообщение
объявить age статическим
только вот так не нужно делать...
1
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
31.08.2018, 18:03  [ТС] 14
Цитата Сообщение от Welemir1 Посмотреть сообщение
если сделаешь поле общим private static int age; то тогда и пете станет 12, но тогда это будет возраст для всех объектов твоего класса, ты не сможешь разные возрасты делать им, только 1 на всех.
Да, спасибо, начинаю понимать.

Добавлено через 54 секунды
Цитата Сообщение от Welemir1 Посмотреть сообщение
еще раз прочти что я написал, там не много текста! нет там 12, так как это ДРУГОЙ объект
Уяснил. Спасибо.

Добавлено через 47 секунд
Цитата Сообщение от iSmokeJC Посмотреть сообщение
только вот так не нужно делать...
Да, я понял. Оно будет для всех одно. Спасибо.
1
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
31.08.2018, 18:43 15
Лучший ответ Сообщение было отмечено Favorskij как решение

Решение

Цитата Сообщение от Favorskij Посмотреть сообщение
начинаю понимать.
https://www.cyberforum.ru/java/thread2250765.html - дебагер применяй и будешь видеть все в динамике))
1
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
01.09.2018, 10:19  [ТС] 16
Цитата Сообщение от Aviz__ Посмотреть сообщение
Про отладку программ - дебагер применяй и будешь видеть все в динамике))
Очень нужное. Спасибо. Уже отлаживаю и смотрю, очень прикольно и понятно.
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
01.09.2018, 10:45 17
Favorskij, я тож не понимаю, почему каждая книга не начинается с описания дебагинга
0
-19 / 23 / 8
Регистрация: 27.07.2010
Сообщений: 496
01.09.2018, 10:48  [ТС] 18
Цитата Сообщение от Aviz__ Посмотреть сообщение
Про отладку программ - дебагер применяй и будешь видеть все в динамике))
Спасибо за отладку. Очень хорошо дает понимание механизма Java

Добавлено через 47 секунд
Цитата Сообщение от Aviz__ Посмотреть сообщение
я тож не понимаю, почему каждая книга не начинается с описания дебагинга
Ага, неговори.
0
2677 / 1995 / 496
Регистрация: 17.02.2014
Сообщений: 9,357
01.09.2018, 10:52 19
С днём знаний!
0
-11 / 4 / 0
Регистрация: 26.01.2018
Сообщений: 199
01.09.2018, 12:39 20
Favorskij, Конструктор инициализирует объект. Фактические параметры объекта и формальные конструктора должны совпадать по типу и длине, иначе будет ошибка компиляции вида: actual and formal argument lists differ in length.
0
01.09.2018, 12:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2018, 12:39
Помогаю со студенческими работами здесь

Как конструктор копий получает доступ к private переменной CopySource.Buffer в этом коде?
#include <iostream> using namespace std; class MyString { private: char* Buffer; ...

Прохождение переменной JSON через конструктор
Всем привет. Может, вы увидите, где ошибка? Нужно создать вызвать через класс в конструкторе...

Присвоение значения переменной класса через конструктор
#include <iostream> using namespace std; class Help { int userID; public: Help(int id)...

Ошибка "Доступ только для чтения" при перегрузке оператора
Выскакивает такая вот ошибка. В чем может быть дело?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru