Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2016, 02:21   #1
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию set-еры, get-еры. Простая задача, а сломал мозг.

Работаю в Android Studio, ЯП - Java

По обучающей видяхе создал два класса
1. Main.java
2. Student.java

В комментариях мои предполагаемые действия программы, причем я запутался в работе класса Student, в set-ерах и get-ерах.

PHP код:
public class Main {
    public static 
void main(String[] args) {
        
// тело класса
        
System.out.println(sum(3,5));
        
System.out.println(sum(1.51.3));

        
Student s = new Student(); // Создаем новый экземпляр(объект) класса Student, где в поле s(name) будет имя "Danielle"
        
s.setName("Danielle"); // процесс инкапсуляции, отправляем в класс public void setName в "name" "Danielle"
        
String name s.getName(); //процесс инкапсуляции, получаем из public string getName 
        
System.out.println(name); // тут все просто, выводим Danielle 
    
}
    public static 
void foo() {
        
// тело метода foo

    
}
    public static  
int sum(int aint b) {
        
// тело метода sum
        
int x;
        
b;
        return 
x;
    }
    public static  
double sum(double adouble b) {
        
// тело метода sum
        
double x;
        
b;
        return 
x;
    }

PHP код:
public class Student {
    private 
String name;
    public 
String getName() {
        return 
name;
    }
    public 
void setName (String name) { // получили "Danielle"
        
this.name name/* для класса setName, в поле name, присваеваем переменную name = "Danielle"
                             а как дальше работает программа я не понимаю*/
    
}

Выводит:

PHP код:
8
2.8
Danielle 
Проблема: НЕ МОГУ ПОНЯТЬ как работают эти сеттеры и геттеры. Будьте так добры, объясните как это работает. Часа 3 потратил читая все подряд в интернете, до конца так и не разобрался с этой информацией.

Как я понимаю, поля - это свойства у классов, но когда мы говорим о экземплярах класса, т.е. об конкретных объектах, то вместо полей уже переменные, а вместо классов - объекты. Правильно понимаю? На этом строятся мои рассуждения.
nevender вне форума Ответить с цитированием
Старый 10.01.2016, 10:49   #2
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

Сеттер - свойству Name присваивает значение "Danielle", т.е. у нас есть объект типа Student с именем Danielle. Поскольку, у этого поля стоит видимость private, то мы не можем к нему напрямую обратиться, чтобы, например, вывести на экран. В таком случае для доступа используется Геттер - метод, который возвращает значение этого name для конкретного объекта Strudent/
String name = s.getName(); - вот тут Вы вызываете этот метод и он возвращает имя, которое записывается в переменную name.

Если надо более подробно какие-то моменты - спрашивайте ))
yulia вне форума Ответить с цитированием
Старый 10.01.2016, 14:29   #3
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию set-еры, get-еры. Простая задача, а сломал мозг.

http://www.programmersforum.ru/showthread.php?t=288069

Объясните, пожалуйста, построчно(всего лишь 7 строк) как работает класс Student.

Откуда он начинается? С первой строчки, или с
PHP код:
public void setName (String name) { // получили "Danielle" 
Кучу времени вчера угрохал, прочитал все что нашел что хотя бы немного связано с этим, но так и не понял. Плюс сегодня повтыкал, все равно нет ясного понимания.
Объясните, пожалуйста, как работает этот класс построчно.

И скажите, пожалуйста, я правильно понимаю смысл работы нижеприведенных 4 строк в классе Main? В комментариях как я понимаю работу.

PHP код:
Student s = new Student(); // Создаем новый экземпляр(объект) класса Student, где в поле s(name) будет имя "Danielle"
        
s.setName("Danielle"); // процесс инкапсуляции, отправляем в класс public void setName в "name" "Danielle"
        
String name s.getName(); //процесс инкапсуляции, получаем из public string getName 
        
System.out.println(name); // тут все просто, выводим Danielle 
    
}
    public static 
void foo() { 

Последний раз редактировалось nevender; 10.01.2016 в 15:19.
nevender вне форума Ответить с цитированием
Старый 10.01.2016, 15:36   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Непонятный вопрос какой-то. getName это просто функция (или метод, так обычно называют функции в классе) возвращающая значение поля/переменной/как_угодно_называйте, а setName — функция устанавливающая это значение.

Это ж не вызывает вопросов?
Код:
    static int something;

    static int getSomething() {
        return something;
    }

    static void setSomething(int newVal) {
        something = newVal;
    }

    public static void main(String[] args) {
        setSomething(999);
        System.out.println(getSomething());
    }
В Student только это все не static и поэтому у каждого экземпляра свое значение.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.01.2016 в 15:39.
Alex11223 вне форума Ответить с цитированием
Старый 10.01.2016, 16:47   #5
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию Вопрос по пониманию класс-экземпляр класса, поле-переменная, название класса-название экземпляра класса

1. setName и getname - это методы. методы = функции = процедуры.
2. setName - мы запоминаем значение и отправляем на обработку в класс Student, в его метод setName, где для экземпляра класса(объекта) Student с названием "s".
Это наименование класса s? Я не знаю, есть ли у экземпляров класса наименования, причем я имею в виду не поля, и не переменные(это ведь свойства). А именно названия = наименования экземпляров класса.
Я пытаюсь ПОНЯТЬ взаимосвязь между этими параметрами, поэтому все расписываю с большОй точностью определений. Я правильно понимаю эти понятия?

ВОПРОС: получается, что у нас есть класс Student, очевидно что экземпляров класса может быть много. Эти экземпляры имеют своё НАИМЕНОВАНИЕ кроме поля name(в данном случае)?
Конкретно: допустим есть экземпляры класса с НАИМЕНОВАНИЕМ a, b, c, s. У класса Student есть только 1 ПОЛЕ --> name. Соответственно у экземпляров a,b,c,s есть только 1 ПЕРЕМЕННАЯ, и у s она равна "Danielle"

Всё вышеописанное верно?

Alex11223, я новичок в программировании, могу ошибаться, но по-моему нижеописанный код написан с ошибками, если это java. В комментариях почему я так считаю.

Код:
static int something;  // не понимаю, что это? это не метод, и не класс. что это? это ЯП java?

    static int getSomething() { // это метод, но по синтаксису сюда нужно добавить void и убрать int.  правильно?  
 //или это неправильно записанный метод в который нужно добавить формальные параметры, т.е. те которые мы указываем при объявлении метода?
        return something; // если у нас void, то мы просто пишем "return;" если же метод с формальными параметрами, то все хорошо.   
    }

    static void setSomething(int newVal) { // если void, то почему указаны формальные параметры? неправильный синтаксис. либо "void setSomething()", 
       //либо "int setSomething(int newVal)"
        something = newVal; // вроде правильно "this.something = newVal" ?
    }

    public static void main(String[] args) { // объявили класс, который должен быть вверху, и затем в его фигурных скобках идет тело класса, 
//Вы же указали его почти в самом низу.  Он должен стоять почти в самом вверху, ниже  пакета и ниже "public class main {"? 
        setSomething(999); // вроде нужен экземпляр класса, мы не можем напрямую использовать setSomething, нам выдаст ошибку.
        System.out.println(getSomething()); // а здесь мне просто непонятно. вроде выводим на экран, но что? 
    }
Ваш код вызывает много вопросов, но благодаря нему у меня укрепились мои знания. Вы это сделали намеренно? ))

Последний раз редактировалось Stilet; 11.01.2016 в 08:46.
nevender вне форума Ответить с цитированием
Старый 10.01.2016, 17:05   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну предполагалось, что это надо засунуть в любой класс, ибо в Java не бывает ничего без классов.
Код:
public class Main {
    static int something;

    static int getSomething() {
        return something;
    }

    static void setSomething(int newVal) {
        something = newVal;
    }

    public static void main(String[] args) {
        setSomething(999);
        System.out.println(getSomething());
    }
}
Цитата:
Это наименование класса s?
s это просто имя переменной, в ней ссылка на экземпляр класса.
Можно никуда не сохранять ссылку, а просто сразу выкинуть но смысла в этом обычно мало.
Код:
new Student();
Код:
System.out.println((new Student()).getName());
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.01.2016, 17:05   #7
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию

Синтаксис ЯП java для простых программ, как я понимаю. Прокомментируйте, пожалуйста. Но вначале с самого начала.

Вначале мы создаем проект, называем, пишем название для пакета, допустим com.company.
Получаем класс файл Main.java = класс.
Код:

package com.company // пакет com.company. это на ступень выше в иерархии чем классы. правильно понимаю?

PHP код:
public class Main {
     
// тело класса Main
     
public static void main (String[] args) {
           
// тело экземпляра класса Main 
           
system.out.println("Hello World!");
     }

Блин, и как этот код работает? Запихнул, программа спокойно запустила. У меня в голове противоречие. Я считаю, что код записан не по синтаксису, но он спокойно работает.
Где ошибка в моих рассуждениях? Где ошибка в моих комментариях к Вашему коду?

Код:
public class Main {
    static int something;

    static int getSomething() {
        return something;
    }

    static void setSomething(int newVal) {
        something = newVal;
    }

    public static void main(String[] args) {
        setSomething(999);
        System.out.println(getSomething());
    }
}

Последний раз редактировалось Stilet; 11.01.2016 в 08:47.
nevender вне форума Ответить с цитированием
Старый 10.01.2016, 17:23   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
ступень выше в иерархии чем классы
Что за ступень? Основное назначение пакетов (в других языках называются namespace) это просто чтоб например можно было создать класс Button (представляющий кнопку в библиотеке для создания GUI) и он не конфликтовал с классом с таким же именем из другой библиотеки (AWT, Swing, JavaFX, ...) и т.п.
Без этого пришлось бы называть их например MyButton, AwtButton, SwingButton, JavaFxButton и т.п.
Ну и чтоб было понятнее что к чему относится, для группировки.

Цитата:
но по синтаксису сюда нужно добавить void и убрать int
Почему? Функция может либо ничего не возвращать (тогда ее иногда называют процедурой), либо (как обычная функция в математике) что-то возвращать.

Цитата:
вроде правильно "this.something
this можно не писать. В первом коде просто одинаковое имя name и у поля класса, и у параметра метода, тогда надо чтоб обращаться к нему, а не параметру.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.01.2016 в 17:28.
Alex11223 вне форума Ответить с цитированием
Старый 10.01.2016, 17:24   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
ВОПРОС: получается, что у нас есть класс Student, очевидно что экземпляров класса может быть много. Эти экземпляры имеют своё НАИМЕНОВАНИЕ кроме поля name(в данном случае)?
Конкретно: допустим есть экземпляры класса с НАИМЕНОВАНИЕМ a, b, c, s. У класса Student есть только 1 ПОЛЕ --> name. Соответственно у экземпляров a,b,c,s есть только 1 ПЕРЕМЕННАЯ, и у s она равна "Danielle"

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

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

То что вы описали, называется присвоением. Создали класс в переменной A, присвоили эту переменную A, переменной B, теперь через A и B вы ссылаетесь на один и тот же экземпляр класса и изменив свойство класса через B, изменение получите и в A. Потому что работа идет с один и тем же экземпляром.

Повторюсь, сначала основы ООП почитайте, потом уже классы пишите.

Последний раз редактировалось Человек_Борща; 10.01.2016 в 17:27.
Человек_Борща вне форума Ответить с цитированием
Старый 11.01.2016, 05:50   #10
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

nevender, ООП максимально приближено к реальному миру.

Вот например в университете учится 2-а студента.
Михаил и Александр... У них 2-а разных имени (name), так, но они оба студенты.
Мы общаемся с одним из студентов. Спрашиваем его имя.. И он нам его говорит (get- метод). При рождении этого студента (создании объекта), родители дали ему имя (инициализация имени в конструкторе). Но например ему захотелось изменить свое имя. (set - метод).
Подводя итог: методы - это какие либо действия производимые с объектом или внутри объекта, а поля - свойства (имя, рост, вес в данном примере). Но это написано в каждом учебнике, как вы этого не нашли
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 11.01.2016 в 05:55.
Bugrimov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вроде бы простая задачка, однако я башку сломал Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 4 19.11.2014 21:49
Простая задача Arsenx777 Помощь студентам 1 04.03.2012 11:18
Простая задача!? koralnik Microsoft Office Access 1 17.10.2010 11:02
Сломал мозг, скрытие метки деления оси. O_H Microsoft Office Excel 2 06.08.2010 19:57
Посмотрите что не так, я весь мозг сломал... Devil55 Помощь студентам 3 18.02.2009 18:31