#13 Конструкторы, ключевое слово this, инициализаторы | Java для начинающих

  Рет қаралды 11,878

selfedu

selfedu

3 жыл бұрын

Что такое конструктор класса и как он задается в Java. Перегрузка конструкторов. Блок инициализации полей класса при создании его экземпляров. Ключевое слово this. Обращение к полям через ссылку this и вызов конструкторов.
Инфо-сайт: proproprogs.ru

Пікірлер: 42
@natalyamurashko125
@natalyamurashko125 3 жыл бұрын
Большое Вам спасибо за объяснение! Очень жаль, что уроки по Java недостаточно популярны и Вы перестали их дальше выпускать. Люди не понимают, что теряют!!!!
@dirider
@dirider 3 жыл бұрын
Красавец! Хорошее объяснение, грамотная речь, красивый голос! :)
@user-xs5cb1dc6s
@user-xs5cb1dc6s 8 ай бұрын
Прекрасные задания. Спасибо. Уверена, что дальше по курсу будет понятнее, как лучше написать код для задачи 3, но я попробовала. Повторов много, но и часть кода постаралась вынести в функции. Попотела. Немного потестила, ошибки не выскочили, но не поручусь. Уж больно дальше интересно. Прям как в старом фильме про инопланетянина: "Еще информации.." public class Main{ public static void main(String[] args){ Line l1 = new Line(3, 5, 3, 3); Line l2 = new Line(); // Хочу старт отрезков по абсциссе сделать левее конца. Если Х1=Х2, то старт ниже конца по ординате double [] line = new double[4]; line = orderCoord(l1.x1, l1.y1, l1.x2, l1.y2); l1.x1 = line[0]; l1.y1 = line[1]; l1.x2 = line[2]; l1.y2 = line[3]; line = orderCoord(l2.x1, l2.y1, l2.x2, l2.y2); l2.x1 = line[0]; l2.y1 = line[1]; l2.x2 = line[2]; l2.y2 = line[3]; //Частичное наложение отрезков тоже буду считать пересечением // Обе линии вертикальные? if(l1.x1 == l1.x2 && l2.x1 == l2.x2) { // на одной абсциссе? if(l1.x1 == l2.x1){ if (coordBelongsToSet(l1.y1, l2.y1, l2.y2) || coordBelongsToSet(l1.y2, l2.y1, l2.y2)) System.out.println("111 отрезки пересекаются накладыванием или соприкосновением"); else System.out.println("222 отрезки не пересекаются"); } else System.out.println("333 отрезки не пересекаются"); } // Обе линии горизонтальные? else if(l1.y1 == l1.y2 && l2.y1 == l2.y2){ // на одной ординате? if(l1.y1 == l2.y1){ if (coordBelongsToSet(l1.x1, l2.x1, l2.x2) || coordBelongsToSet(l1.x2, l2.x1, l2.x2)) System.out.println("444 отрезки пересекаются накладыванием или соприкосновением"); else System.out.println("555 отрезки не пересекаются"); } else System.out.println("666 отрезки не пересекаются"); } //Если одна из линий вертикальная, то именно ее делаю l1, наклонную l2 else if(l1.x1 == l1.x2 || l2.x1 == l2.x2) { if(l2.x1 == l2.x2) { double tempX1 = l1.x1; double tempY1 = l1.y1; double tempX2 = l1.x2; double tempY2 = l1.y2; l1.x1 = l2.x1; l1.y1 = l2.y1; l1.x2 = l2.x2; l1.y2 = l2.y2; l2.x1 = tempX1; l2.y1 = tempY1; l2.x2 = tempX2; l2.y2 = tempY2; } // Представляю отрезки линиями и определяю, чему равен y во второй линии при значении l1.x1 // y= k*x+b Для l2 определяю k и b double k2, b2, y; k2 = fundK(l2.x1, l2.y1, l2.x2, l2.y2); b2 = fundB(l2.x1, l2.y1, k2); y = k2*l1.x1 + b2; // принадлежит ли этот y отрезку l2 if(coordBelongsToSet(y, l2.y1, l2.y2)){ System.out.println("777 отрезки пересекаются"); } else {System.out.println("888 отрезки не пересекаются");} } //Если одна из линий горизонтальная, то именно ее делаю l1, наклонную l2 else if(l1.y1 == l1.y2 || l2.y1 == l2.y2) { if(l2.y1 == l2.y2) { double tempX1 = l1.x1; double tempY1 = l1.y1; double tempX2 = l1.x2; double tempY2 = l1.y2; l1.x1 = l2.x1; l1.y1 = l2.y1; l1.x2 = l2.x2; l1.y2 = l2.y2; l2.x1 = tempX1; l2.y1 = tempY1; l2.x2 = tempX2; l2.y2 = tempY2; } // Представляю отрезки линиями и определяю, чему равен x во второй линии при значении l1.y1 // y= k*x+b Для l2 определяю k и b double k2, b2, x; k2 = fundK(l2.x1, l2.y1, l2.x2, l2.y2); b2 = fundB(l2.x1, l2.y1, k2); x = (l1.y1- b2)/k2; // принадлежит ли этот x отрезку l2 if(coordBelongsToSet(x, l2.x1, l2.x2)){ System.out.println("999 отрезки пересекаются"); } System.out.println("101010 отрезки не пересекаются"); } // Обе линии наклонные. Нахожу их k, если равны, то отрезки лежат на параллельных прямых else { double k1, k2; k1 = fundK(l1.x1, l1.y1, l1.x2, l1.y2); k2 = fundK(l2.x1, l2.y1, l2.x2, l2.y2); if(k1 == k2) System.out.println("111111 отрезки не пересекаются"); else{ double b1, b2; b1 = fundB(l1.x1, l1.y1, k1); b2 = fundB(l2.x1, l2.y1, k2); // xx, yy - координаты точки пересечения линий. Сначала ищу эту точку, потом проверяю в пределах ли она отрезков на этих линиях double xx, yy; xx = (b2 - b1)/(k1 - k2); yy = k1 * xx + b1; boolean xx_l1, yy_l1, xx_l2, yy_l2; xx_l1 = coordBelongsToSet(xx, l1.x1, l1.x2); yy_l1 = coordBelongsToSet(yy, l1.y1, l1.y2); xx_l2 = coordBelongsToSet(xx, l2.x1, l2.x2); yy_l2 = coordBelongsToSet(yy, l2.y1, l2.y2); if(xx_l1 && yy_l1 && xx_l2 && yy_l2) System.out.println("121212 Эти отрезки пересекаются"); else System.out.println("131313 Эти отрезки не пересекаются"); } } } static double [] orderCoord(double x1, double y1, double x2, double y2){ if (x1>x2){ double tempX1 = x1; double tempY1 = y1; x1 = x2; y1 = y2; x2 = tempX1; y2 = tempY1; } else if (x1 == x2){ if (y1>y2){ double tempY1 = y1; y1 = y2; y2 = tempY1; } } double [] coord = new double[]{x1, y1, x2, y2}; return coord; } static boolean coordBelongsToSet(double coord, double start, double end){ if (start>end){ double temp = start; start = end; end = temp; } return (coord>=start && coord
@FerrasRX
@FerrasRX 3 жыл бұрын
Классно объясняешь, спасибо!
@gscdcd8302
@gscdcd8302 2 жыл бұрын
После второй задачи еще куча вопрос осталось, а вот третья вообще жара. Спасибо, задачи интересные, так легко копипастом не бьются в гугле, приходится напрягать мозги
@anjelomanoranjan
@anjelomanoranjan Жыл бұрын
Спасибо Вам огромное! Вы большой молодец)
@user-gm9mg3lj2c
@user-gm9mg3lj2c Жыл бұрын
Очень помог. Спасибо
@andrewpozdnyak
@andrewpozdnyak Жыл бұрын
Если во второй задаче представить координаты в виде ссылок на объекты без их объявления, то вылезет NPE public static void main(String[] args) { Triangle one = new Triangle(1, 3, 5, 4, 8, 9); System.out.println("Координаты точки A " + "(" + one.a.x + ";" + one.a.y + ")" + ", координаты точки B " + "(" + one.b.x + ";" + one.b.y + ")" + ", координаты точки C " + "(" + one.c.x + ";" + one.c.y + ")"); } } class Point { int x, y; Point() { x = 0; y = 0; } Point(int x, int y) { this.x = x; this.y = y; } } class Triangle { Point a = new Point(); Point b = new Point(); Point c = new Point(); Triangle() { } Triangle(int x1, int y1, int x2, int y2, int x3, int y3) { a.x = x1; a.y = y1; b.x = x2; b.y = y2; c.x = x3; c.y = y3; } } Координаты точки A (1;3), координаты точки B (5;4), координаты точки C (8;9)
@daven3766
@daven3766 Жыл бұрын
спасибо за решение, научился чему-то
@user-yi9zy5rw6k
@user-yi9zy5rw6k 9 ай бұрын
Увидел в первом д/з интересную мысль: как различить два конструктора с тем же количеством аргуметов. Круто наталкивать людей на такие рассуждения, хороший материал.
@user-yi9zy5rw6k
@user-yi9zy5rw6k 9 ай бұрын
Мне вот видится что никак, в одном из случаев массивом передал.
@alinakopus
@alinakopus 6 ай бұрын
5:11 - что такое this и как это работает
@user-li7ov7vc1q
@user-li7ov7vc1q 2 жыл бұрын
Здравствуйте, спасибо большое за уроки! У меня есть вопрос по второй задаче, могли бы Вы выложить решение? я представил координаты в виде ссылок на класс Point в методе main (который создал в классе Triangle) путём создания объектов класса Point, содержащих в себе координаты - поля класса Point.
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
спасибо за домашнее задание
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
Задача 1, класс рект. public class Rect { int x1,y1,x2,y2; float width; float hight; { x1 = 0; x2 = 0; y1 = 0; y2 = 0; width = 0; hight = 0; } Rect(){}; Rect(int x1, int y1, int x2, int y2){ this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; } Rect(int x1, int y1, float width, float hight){ this.x1=x1; this.y1=y1; this.width = width; this.hight = hight; } public void show(){ if(width==0) System.out.println("X1= "+x1+" Y1= "+y1+ " X2= "+x2+ " Y2= " +y2 +" "+"Width= "+(x2-x1)+" Hight= "+(y2-y1)); if(width>0) System.out.println("X1= "+x1+" Y1= "+y1+ " "+"Width= "+width+" Hight= "+hight+ " X2= "+(x1+width)+ " Y2= " +(y1+hight)); } }
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
по треугольнику у меня так: public class Rectangle { Point one; Point two; Point three; { one = new Point(0,0); two = new Point(0,0); three = new Point(0,0); } Rectangle(){}; Rectangle(int x, int x2, int x3, int y, int y2, int y3) { one.x = x; one.y = y; two.x = x2; two.y = y2; three.x= x3; three.y = y3; } public void show(){ System.out.println("Ваш треугольник представлен тремя вершинами ("+one.x+","+one.y+"),("+two.x+","+two.y+"),("+three.x+","+three.y+")"); } }
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
в майне значит: Rectangle rectangle =new Rectangle(); rectangle.show(); результат: Ваш треугольник представлен тремя вершинами (0,0),(0,0),(0,0)
@zamestaimja
@zamestaimja 3 жыл бұрын
А я не понял с первой задачей. Если второй и третий конструкторы имеют по 4 аргумента, как указать, к какому из них должен обращаться объект. Вот если разное сделать, тогда понятно.
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
используй разные примитивные аргументы
@nouchance
@nouchance 3 жыл бұрын
Спасибо большое! Хотел бы спросить какие книги посоветуйте читать? Чтобы освоить глубже.Удачи вам
@selfedu_rus
@selfedu_rus 3 жыл бұрын
На мой взгляд хорошая книга: Java. Полное руководство, 10-е изд. Шилдт, Герберт.
@kurum9164
@kurum9164 3 жыл бұрын
Помогите понять, я только изучаю Используя функцию const greeter = (name) Передай в функцию дополнительный параметр partOfTheDay. Верни из функции новую строку, используя новый параметр. Пример: greeter ( 'Paul', 'night ") //" Good night, Paul! " А за видео спасибо, с меня лайк!! А то я уже запутался!!!!
@gscdcd8302
@gscdcd8302 2 жыл бұрын
В первой задаче не могу понять, как создать 2 разных конструктора принимающих на вход по 4 разных аргумента. Как понять что имеется ввиду координата x1, y1 или высота и ширина? Можно, конечно, задать высоту ширину другим примитивным типом, но что-то мне подсказывает что это не то что подразумевалось
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
используй float на одном из аргументов вместо int, float width; float hight; тогда среда увидит что реально чтото другое
@no_name64811
@no_name64811 Жыл бұрын
только начинаю вникать что такое парадигма ООП. (Сергей Балакирев is Алекс Глозман)
@karakyro
@karakyro 10 ай бұрын
посмотрите следующий урок и сделаете 3 задачу)
@sergeitsaryov451
@sergeitsaryov451 2 жыл бұрын
Всё было понятно, а в конце появились такие вопросы: 1. Если всё равно создается дефолтный конструктор без параметров и без тела, то зачем писать его (23, 24 строки) еще раз? Видно, что программа не работает как надо без него, но дефолтный разве не работает в данном случае? 2. Непонятна роль инициализатора. Ведь можно сразу задавать значения этим переменным (на 14 и 15 строках) безо всяких фигурных скобок.
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Это просто учебный пример. И если мы прописываем сами конструктор без параметров, то это уже не дефолтный конструктор. В результате у нас два конструктора и мы можем обоими пользоваться. Про инициализатор. Мы в нем можем задавать начальные значения для всех переменных. А в конструкторе только некоторым. Получается, благодаря инициализатору можно легко избавиться от дублирования кода, когда одна и та же переменная в разных конструкторах задается одним значением.
@sergeitsaryov451
@sergeitsaryov451 2 жыл бұрын
​@@selfedu_rus Спасибо за разъяснения. Я на самом деле просто не учел того, что там еще один конструктор есть с параметрами. И дефолтный уже не появится. Сглупил, пардон.... Про инициализатор. Я говорил не о значениях, которые в конструкторе, а о значениях, которые сразу после объявления класса. Можно же инициализировать все переменные на строках 14, 15. Ведь то же самое сделано на строках 19, 20, только в фигурных скобках. То есть, в видео мы сначала объявляем переменные, а потом их инициализируем. А если сразу? Меньше же телодвижений будет. int x = -1 и всё. Или есть все же какой-то сакральный смысл в инициализаторе?
@no_name64811
@no_name64811 Жыл бұрын
public class Test{ public static void main(String [] args) { //Point pt = new Point(); Point a = new Point(4, 3); Point b = new Point(5, -3); Point c = new Point(-2, 7); Triangle tri_none = new Triangle(); Triangle tri_arg = new Triangle(a, b, c); System.out.println(tri_none.a.x + " " + tri_none.a.x + " " + tri_none.a.x); System.out.println(tri_arg.a.x + " " + tri_arg.b.x + " " + tri_arg.c.x); } } class Triangle { Point a, b, c; public Triangle(){ a = new Point(); b = new Point(); c = new Point(); } Triangle(Point a, Point b, Point c) { this.a = a; this.b = b; this.c = c; } } class Point{ int x; int y; Point(){ x = 0; y = 0; } Point(int x, int y){ this.x = x; this.y = y; } }
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 жыл бұрын
По поводу ваших заданий. Можно в место конструкторов использовать метод для нахождения периметра используя формулу по заданным точкам кординат и вернуть return (double)
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 жыл бұрын
Не судите строго за мое мнение уважаемый!
@dfhnn
@dfhnn 2 жыл бұрын
Задача с подвохом. Нельзя создать два конструктора с одинаковыми типами аргументов. Не может быть два конструктора где (int, int, int, int).
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
😁он специально так сделал, используй не int, а float на одной из переменных
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 жыл бұрын
В первую очередь нужно понять "Предметную область"
@kazariaF
@kazariaF Жыл бұрын
Непонятно как пустой конструктор определился , не смысл , а сам процесс public class ClassandObject { public static void main(String[] args) { Triangle first=new Triangle(); Triangle second=new Triangle(45,70,80,150,100,130); first.print(); second.print(); } } class Triangle { Point one=new Point(10,10); Point two=new Point(15,49); Point three=new Point(12,30); Triangle(){ } Triangle(int a, int b, int c, int d, int e, int f){ one.a=a; one.b=b; two.a=c; two.b=d; three.a=e; three.b=f; } void print(){ System.out.println(one.a+" "+ one.b+" "+ two.a+" "+ two.b+" "+ three.a+" "+ three.b); } } class Point{ int a, b; Point(int a,int b){ this.a=a; this.b=b; } }
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
3ю, самую сложную задачу делал 2 часа)) забыл уже алгебру и поиск и построение формул по прямым линиям. Если на первую задачу потратил 5 минут, на вторую 10, на третью ушло 2 часа))) и так ниже вот что прописано в майн ***Выводит 3 вида результатов: - наложение линий - линии не пересеклись (параллельны) - линии пересеклись, держи координаты Line line1 = new Line(1,2,1,2); Line line2 = new Line(1,2,2,3); float x = (-line1.getB()+line2.getB())/(line1.getK()-line2.getK()); float y =line1.getK()*x+line1.getB(); if(line1.x == line2.x && line1.y == line2.y && line1.x1 == line2.x1 && line1.y1 == line2.y1 ) System.out.println("Наложение линий"); else if (Float.isInfinite(x) || Float.isInfinite(y)) System.out.println("Линии не пересеклись!"); else{ System.out.println("Координата точки пересечения Х= "+x); System.out.println("Координата точки пересечения Y= "+y); }
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
и вот класс Line --- public class Line { float x,x1,y,y1; float k, b; Line one; public float getX() { return x; } public float getX1() { return x1; } public float getY() { return y; } public float getY1() { return y1; } public float getK() { k=(y-y1)/(x-x1); return k; } public float getB() { k=(y-y1)/(x-x1); b=y1-k*x1; return b; } //конструктор класса public Line(float x, float x1, float y, float y1) { this.x = x; this.x1 = x1; this.y = y; this.y1 = y1; } //покажет формулу линии public void showK(){ k=(y-y1)/(x-x1); b=y1-k*x1; System.out.println("k =" + k +", b =" + b ); System.out.println("y="+k+"x"+b); } }
@daven3766
@daven3766 Жыл бұрын
график функции y = kx + b бесконечен в обе стороны по условию там отрезок
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
@@daven3766 как рассчитать пересечение отрезков и координату их пересечения?
@daven3766
@daven3766 Жыл бұрын
@@user-gc4nx8tm2u я честно сам не знаю, спросил у чела одного он там сказал про ccw что-то погугли на английском, там всегда инфы больше
@user-gc4nx8tm2u
@user-gc4nx8tm2u Жыл бұрын
Знаешь, я вот решаю задачи по джаве, там и задания бывают абстрактные и решений куча, и все типа правильные )) Главное чтобы решение было, это и есть учение.
Java Lessons. How to Use a Constructor in Java
21:31
Айтигенио: международная онлайн-школа
Рет қаралды 3,1 М.
路飞太过分了,自己游泳。#海贼王#路飞
00:28
路飞与唐舞桐
Рет қаралды 29 МЛН
Уроки по Java. Разбираем Классы на джаве. Что такое класс?
13:30
Айтигенио: международная онлайн-школа
Рет қаралды 10 М.
Java SE. Урок 20. Перечисления enum
13:27
Follow the white rabbit
Рет қаралды 38 М.