• ,

Уровень 5: план уровня и доп. материалы

План уровня:
  • Знакомство с классами: написание своих классов, конструкторы
  • Пакеты
  • Импорт классов
  • Создание классов, геттеров и сеттеров
  • Инициализация объектов
  • Конструкторы

Курс Java

Что еще можно посмотреть на досуге:
Трудности при изучении Java
Лекция на Интуит
Геттеры и сеттеры в Java
Getter/Setter
Конструкторы
Ошибки начинающих java-программистов
Тернарный оператор if?then:else

Почитать про видимость переменных
Почитать про классы



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

Вернуться к плану обучения

Вернуться к обучению java онлайн на JavaRush

58 комментариев

Serbul
Инициализация объектов:

В коде
class MyFile
{
    private String filename = null;
    public void initialize(String name)
    {
        this.filename = name;
    }

    public void initialize(String folder, String name)
    {
        this.filename = folder + name;

    }
    public void initialize(MyFile file, String name)
    {
        this.filename = file.getFolder()  +  name;

    }

и
MyFile file = new MyFile();
file.initialize("c:\\data\\a.txt");

MyFile file2 = new MyFile();
file2.initialize(file, "a.txt");
String text = file2.readText();


непонятно, можно ли объявлять одноимённые методы (initialize), и как компилятор будет разбираться, какой из них использовать?

И второе.
Почему file2 получает имя «a.txt». Это же копия оригинального файла, создаваемая в той же директории. Она не может иметь такое же имя. file2 должен получать имя типа «a-tempcopy.txt»
iCubeDm
компилятор смотрит на количество и типизацию входных параметров. Это вроде называется перегрузкой. И в зависимости от того, какие параметры ты передал в конструктор (метод инициализации), компилятор выберет нужный из присутствующих.
velobaduk
да, это называется перегрузкой метода.
akaelwins
1. Объявлять одноимённые методы можно, компилятор будет в таком случае смотреть на типы и количество параметров, которые у таких методов должны быть различны.

2. file2 получает имя «a.txt» только в качестве параметра. Затем этот параметр используется как составная часть для инициализации поля filename объекта file2. На выходе file2 будет иметь filename «c:\\data\\a.txt»
Serbul
Понял. Большое спасибо за объяснение, akaelwins :-)
serfer
Ну это же значит что в двух созданных объектах класса «MyFile» поле «filename» получит то же самое значение. А грубо говоря объекты просто будут ссылаться на тот же самый файл. Я верно понимаю? Никакого же копирования не производилось.? И если бы производилось то в случаи того же самого имени в созданном новой файле выпал эксепшен?
stepands
а в чем смысл данной страницы переходиш написано Лекция, План лекции: а где сама лекция?
hubert
А почитать выше не? Какой блог, зачем он и тд
serfer
+1 кстати. Можно было тут все собрать уже в одном месте здесь. А не давать ссылки на посторонние ресурсы которые иногда и не работают. (((((((((((
Turch
Я прочитал по вашей ссылке www.sql.ru/faq/faq_topic.aspx?fid=566

Еще одно возможное место появления этой ошибки — задание имени параметра
метода таким же, как и имя поля класса. Это хорошо выглядит в конструкторах,
но для обычных методов не подходит.

public class Test {
private int param = 0;

public Test(int param) {
this.param = param;
}
}

то есть в конструкторе все смотрится красиво, но для обычных методов
применять это не следует.

Вопрос:
1. я так понял, что причина в том, что есть вероятность запутаться и ошибиться при данном использовании. или есть другая причина?
2. Почему в уроке используется в конструкторах такое объявление, если это не рекомендуется делать?
3. Почему не сказали, что для других методов это не стоит делать?
Lenchik854
Не работает ссылка про сборщик мусора: www.ibm.com/developerworks/ru/edu/j-scjp/section4.html
Georgyg
Коллеги, а где сама «лекция»? Вижу только план и комментарии.
Vakatsiienko
Это план лекции, которую ты прошел в джавараше.
joomlacoder
можно ссылку? а то про даты не видел, что то
mrserfr
ссылку на что ?? и про какую дату ?)
vovan9870
И что же — за план лекции сняло 5 баллов, как за целую лекцию???
Vakatsiienko
Насколько я понял, горючее снимается для переходов на следующий урок и х2 горючего для перехода на следующий уровень. Как то так.
Ibeskov
  • Ibeskov
  • 0
  • Комментарий отредактирован 2014-07-17 13:34:53 пользователем Ibeskov
удалено
Kolobok
Подскажите как развернуть мультик на весь экран?)
Blaze
Дайте кто нибудь информацию как правильно пользоваться инициализацией, вроде понял что она делает, но синтаксис понять не могу. Или совсем не понял (( если есть попроще с примерами буду благодарен :)
dimaMJ
так почитай просто про конструкторы в Java, что тебе не понятно там?
Blaze
Спасибо разобрался уже :)
AES
  • AES
  • 0
«Почитать про видимость переменных» и «Лекция на Интуит» ссылаются на один материал. Лучше убрать дубль, а то после такого обширного чтения возврат к унылой лекции уважаемого Интуита хуже тоски.
Rim-777
Объясните пожалуйста, где находится сама лекция, не План лекции, а именно лекция?
Спасибо заранее.
hubert
javarush.ru
Rim-777
Благодарю, только я оттуда по ссылке и перешел) вроде как лекция — это дополнительный материал
IvanRychkov
Какое же удовлетворение, когда получается!
wilson
Одно замечание, может, конечно, не всё понимаю: в лекции по конструкторам от Лилы приводится пример
MyFile file = new MyFile("c:\\data\\a.txt");

MyFile file2 = new MyFile(file, "a.txt");
String text = file2.readText();

Т.е.вроде бы по контексту — создаётся файл с путём от другого файла, в той же папке, но название у второго файла такое-же, поэтому будет ошибка при попытке создать два файла с одинаковым именем в одной папке. Хотя, формально говоря, мы не знаем, что делает конструктор класса в данном случае, этот код ведь может не быть продолжением предыдущих кусков.
arhipovevgeny
Да, если можно, то поподробнее бы это место. Или хотя бы ссыль толковую.
serfer
Я тут тоже ничего не понимаю. Выход что-то типу «На городі бузина, а в Києві дядько»
Javastik
(если не ошибаюсь)Создается не файл, а инстанс (объект) класса MyFile по имени file, который неизвестно вообще, чем занимается, но в качестве параметров для этих занятий принимает перед этим созданный объект file, который собственно, тоже неизвестно, что делает, но для этого пользуется другим набором параметров. Метод readText, судя по документации, возвращает значение знака в юникоде…
Суть примера в том, что в одном классе реализовано два РАЗНЫХ конструктора, создающих РАЗНЫЕ объекты в которых и методы могут быть РАЗНЫМИ (реализованы в самом конструкторе )
pres1000
Тот же вопрос, что и выше. Кроме того:
— что за команда readText()?
— почему нельзя создавать инициализаторы с одинаковыми типами данных?
public void initialize(String name, int growth, String color)
public void initialize(String secondcolor, int growth, String lastname)
Rimlin
Чет я не понял, тут что должно быть?
Ссылки активны должны быть или что?

План лекции:
Знакомство с классами: написание своих классов, конструкторы
Пакеты
Импорт классов
Создание классов, геттеров и сеттеров
Инициализация объектов
Конструкторы
CoDSP
Просто резюме лекции.
Javastik
уперся в «простые» вещи: конструктор и статику. В статике плутаю по правилам доступа к нестатическим полям статических классов и наеборот, но это, скорее, дело техники (привычки => времени). А вот в конструкторах встрял нешутя: пример с изменением параметров, передаваемых конструктору (http://www.strongexperts.narod.ru/ru/articles/archive..) просто вынес мозг. Пусть даже «конструктору Salary2(Salary x) передастся значение ссылки на объект переменной s1», но ведь в этой s1 значение value = 1000, а действие над ним производится в s2. Почему же тогда значение s1.value меняется, а s2.value остается =1000??? или оно берется из поля класса? тогда инстанс s2 ЕГО НЕ УМНОЖАЕТ НА 3 :(
Javastik
а чисто конкретный вопрос: зачем в lesson12\ home03 в конструкторе вот это
this.name = name;
this.height = height;
this.tail = tail;
ведь ему на вход даются параметры и он работает с ними, а не с полями класса, зачем тогда их переопределять?
DenisDN
Здравствуйте. Застрял на 6 — м разделе «Инициализация объектов, метод Initialize». Не совсем понятен один момент в этом фрагменте кода. Вопрос задал в комментариях к коду.
class MyFile
{
    private String filename = null;// не понятно из каких соображений возникло  имя filename(значит ли
                                   //  это, что название может быть любым и влияет ли название на что либо в коде)
    public void initialize(String name)
    {
        this.filename = name;
    }
…
}


Иными словам — есть ли какая нибудь строгая закономерность в присвоении имен в таких случаях. (То есть если мне необходимо создать класс «В» с некоторым количеством инициализаторов, обязательно ли я должен создать переменную bname или название переменной может быть любое.)
borisbot
Вы можете задавать абсолютно любые имена классов, переменных и методов. Как вашей душе угодно :)
DenisDN
Спасибо
DenisDN
Прошу модераторов оценить полезность и информативность статьи по теме Запись методов toString, с последующим переносом на верх для просмотра на досуге.
Вот ссылка:Запись методов toString
snuk
  • snuk
  • 0
Если по конструктору пройдя лекцию и уровень остались вопросы у кого, рекомендую ознакомиться Конструкторы. Там еще много интересных статей. Это конечно по кодингу на андроиде, но то тоже java. По крайней мере перешерстив весь инет, я нашел внятный ответ по инициализаторам и конструкторам именно там.
blgnt
  • blgnt
  • 0
  • Комментарий отредактирован 2016-01-21 20:35:14 пользователем blgnt
Перелопатил кучу материала, но так и не понял смысл в геттерах и сеттерах. Зачем, для чего. Как это описано в лекциях — представления вообще никакого не даёт. Надо ли его использовать для каждой переменной класса и метода. Это получается все прошлые задачи мы делали неправильно, если их не использовали. Значит надо было начинать тупо с того, что надо обязательно было их писать.
Переменные делаем private, сеттеры и геттеры публичные. От кого мы прячем переменные. Что они принимают и кому отдают, для чего они это делают. Каша как в голове, так и в материале, который я читал. Доступного объяснения нигде не нашёл.
Заранее благодарю за помощь.
DenisDN
Смотри. Есть моменты которые надо просто принять на веру, даже если что — то неясно (даже если эта «неясность» раздражает), со временем все встанет на свои места. От себя могу порекомендовать 4-ую главу Хортсмана «HeadFirst».
Yuri_0504
В третьей лекции есть ссылка на Интуит, где все подробно разжевано.
old.intuit.ru/department/pl/javapl/6/
maximuswork
Это основа ООП и защита переменных. Т.е для того чтобы не поменялось значение какого-нибудь параметра из внешнего класса, его делают private.
например: private int age;
Так вот чтобы получить это значение в другом месте и применяют метод getAge либо установить setAge.
petruxa
В статье «Ошибки начинающих программистов» есть пункт 10 — «Использование объектов класса String как параметров метода». Там приводится следующий пример, который является ошибочным:

public static void main(String args[]) {
String test1 = «Today is »;
appendTodaysDate(test1);
System.out.println(test1);
}

public static void appendTodaysDate(String line) {
line = line + (new Date()).toString();
}

Далее, написано следующее:

«В примере выше студент хочет изменить значение локальной переменной test1,
присваивая новое значение параметру line в методе appendTodaysDate.
Естественно это не сработает. Значение line изменится, но значение test1
останется прежним.
Эта ошибка возникает из-за непонимания того, что (1) java объекты всегда
передаются по ссылке и (2) строки в Java неизменяемы.

Чтобы исправить ошибку в примере выше, нужно или возвращать строку из
метода, или передавать объект StringBuffer как параметр методу вместо String.»

И приводится 2 правильных варианта, в одном из которых в качестве строки выступает объект StringBuffer, а в другом строка возвращается из метода и присваивается переменной test1.

В конце добавлено примечание переводчика:

«вообще-то понять в чем ошибка не так просто.
так как объекты передаются по ссылке, то значит line ссылается туда же,
куда и test1. А значит создавая новый line, мы создаем новый test1.
в неправильном примере все выглядит так, как будто передача String идет
по значению, а не по ссылке.»

Проблема в том, что данное примечание так и не помогает понять: а в чем, собственно, была ОШИБОЧНОСТЬ изначального варианта? Дело в том, что там всё действительно выглядит так, будто бы строка передается по значению. Например, в варианте со StringBuffer всё понятно: в метод передается ссылка на объект, для которого по ссылке вызывается функция append. Но почему в том случае если передается объект String, который тоже вроде как передается по ссылке, изменения значения ссылки не происходит? Почему, если мы явно присваиваем ссылке test1 новое значение, она меняется, а в методе — нет?

Буду очень признателен за разъяснение, потому что на этом моменте сильно затупил.
pligosv
Там же ниже написано:
Эта ошибка возникает из-за непонимания того, что (1) java объекты всегда
передаются по ссылке и (2) строки в Java неизменяемы. Нужно осмыслить, что
объекты-строки никогда не изменяют своего значения, а все операции над
строками создают новый объект.
То есть ты не изменяешь текущую строку, а создаешь новую, работаешь с ней, а потом она удаляется после завершения метода.
Ну и как написано, способы решения проблемы: присваивание или использование StringBuffer
petruxa
Спасибо за ответ, но я уже давно разобрался во всём сам:) На самом деле там что в самом тексте, что в пояснении написано очень путано. А хорошо и понятно написано вот тут www.javable.com/columns/robinson/letters/01/

Идея в том, что в Java всё и всегда передается ПО ЗНАЧЕНИЮ. Разница только в том, что в случае примитивных типов значением является содержимое переменной, а в случае объектов — сама ссылка.
pligosv
Об этом говорилось в доп. материалах, которые даны в предыдущих лекциях)
petruxa
может быть, но видимо как-то хреново, раз мне пришлось пол-интернета облазить)
Demet
зачем отдельно инициализаторы если есть конструкторы?
maximuswork
Это всего лишь для того, чтобы пояснить как все происходит. Не более того (мое мнение).
dskozin
Коллеги!
Я что-то неправильно понял и не нашел ответа в приложенных материалах.
Модификатор static для переменных — делает переменную общей для всего класса (не для объектов класса), метод static соответственно так же относится к работе с классом (статическими переменными, например), а что делает модификатор static при объявлении КЛАССА? Встретился с этим на ур5, лек12, зад1. Там объявляется
public static class Duck
    {
        public String toString() {
            return "Duck";
        }
    }


Вот сижу думаю.
Кто-нибудь просветит на эту тему?
dskozin
Нашел! Оказывается дальше по курсу про статические классы…
AlexPerry
  • AlexPerry
  • 0
  • Комментарий отредактирован 2016-09-18 21:40:05 пользователем AlexPerry
Пока перечитал все материалы-аж пар с ушей идет
Некоторые пункты(напр. об ошибках начинающих) еще не были пройдены, сложновато для понимания.
maximuswork
Параллельно нужно почитывать книжки. Тогда все становится более очевидно.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.