<<Предыдущий урок Список уроков Следующий урок>>
Объекты
Почти весь код, написанный на языке Java — это классы и объекты, т.к. java — объектно ориентированный язык. Java-объекты хранят свое состояние в переменных, эти переменные еще называют полями или членами экземпляра класса. Больше об объектах читайте по ссылке: Создание собственных классов в Java (продолжение), класс Object
Давайте начнем с примера:
class Point {
int x;
int y;
}
Этот класс определяет точку с координатами X и Y.
Для того, чтобы создать экземпляр этого класса, мы должны использовать ключевое слово new.
Point p = new Point();
При этом используется так называемый конструктор по умолчанию (или конструктор без параметров) — это специальный метод класса, мы его не определяли явно, но даже если его не определить, он создаётся автоматически, выполняется при создании каждого нового объекта и присваивает первоначальные значения его свойствам (инициализирует их).
От методов в java конструктор отличается тем, что имеет то же самое имя, что и класс, в котором он определен, а также не имеет типа возвращаемого значения. Конструктор в java возвращает новый объект — экземпляр родительского класса). Больше о конструкторах читайте по ссылке: Создание собственных классов в Java: свойства, методы, конструкторы
Мы можем определить наш собственный конструктор. Поскольку методы можно перегружать, а конструктор является методом, то с помощью перегрузки можно создать дополнительные варианты конструкторов. Например, удобно иметь конструктор, который позволит при создании объекта Point явно указывать его координаты:
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Это означает, что мы не можем больше использовать конструктор по умолчанию new Point()
. Теперь мы можем пользоваться только перегруженным конструктором с указанием начальных значений new Point(4, 1)
.
Мы можете определить более чем один конструктор, так что объект класса Point
может быть создан несколькими способами. Давайте создадим еще один перегруженный конструктор:
class Point {
int x;
int y;
Point() {
this(0, 0);
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Обратите внимание на ключевое слово this
. Мы можем использовать его внутри конструктора для вызова другого конструктора (для того, чтобы избежать дублирования кода).
Мы также используем ключевое слово this
в качестве ссылки на текущий объект.
После того, как мы определили объект р мы можем получить доступ к X и Y.
p.x = 3;
p.y = 6;
Методы
Теперь мы можем определить методы класса Point
.
class Point {
... // Наш код ранее
void printPoint() {
System.out.println("(" + x + "," + y + ")");
}
Point center(Point other) {
// Возвращает центр между этой и другой точками
// Заметьте, мы используем целое число, поэтому не получим точное значение
return new Point((x + other.x) / 2, (y + other.y) / 2);
}
}
Public и Private
На прошлом уроке мы уже рассматривали модификаторы доступа. Ключевое слово private
перед переменной или методом означает, что только сам класс может получить доступ к переменной или методу, а когда мы используем public
это значит, что любой объект может получить к нему доступ. Конструкторы обычно определяют как public, переменные определяют как private, а методы разделяются, некоторые public, а некоторые private, в зависимости от задач. Подробнее о модификаторах доступа читайте по ссылке: Создание собственных классов в Java (продолжение), инкапсуляция, полиморфизм, модификаторы доступа
Упражнение
Напишите новый метод класса Point
с названием scale
, который сделает точку наполовину ближе к началу координат (0,0). Например, точка с координатами (8, 4) после выполнения метода scale
будет иметь координаты (4, 2).
Дополнительное чтение:
- Конструкторы и блоки инициализации
- Наследование в Java
- Создание собственных классов в Java: свойства, методы, конструкторы
- Создание собственных классов в Java (продолжение), класс Object
- Создание собственных классов в Java (продолжение), инкапсуляция, полиморфизм, модификаторы доступа
public class Point {
public static void scale(int x, int y) {
x = x/2;
y = y/2;
System.out.println(«x=»+x+»; y=»+y+»;»);
}
}
В Main классе делаем вызов:
Point.scale(8,4);
Я сделал вот так:
public class Student{
public String name, soname, family;
public String printFullName(){
return "Фамилия Имя Отчество: " + (family + " " + name +" "+ soname);
}
}
public class Main {
public static void main(String[] args) {
Student a = new Student();
a.name = "Имя";
a.soname = "Отчество";
a.family = "Фамилия";
System.out.println(a.printFullName());
}
}
public class Point {
private int x;
private int y;
public Point (int x, int y) {
this.x=x;
this.y=y;
}
public void Scale (){
this.x=x/2;
this.y=y/2;
System.out.println(«(«+x+» , «+y+»)»);
}
}
public class Main {
public static void main(String[] args) {
Point p= new Point(4,6);
p.Scale();
}
}
//Point.java
public class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public void printCoordinates() {
//метод выводит координаты точки
System.out.println((this.x) + » » + (this.y));
}
public void scale() {
//метод уменьшает каждую координату точки в два раза
this.x = this.x / 2;
this.y = this.y / 2;
}
}
//Main.java
public class Main {
public static void main(String[] args) {
Point firstPoint = new Point(24.2, 48.6);
//строка создаёт новую точку firstPoint
firstPoint.scale();
//делаем точку наполовину ближе к началу координат»
firstPoint.printCoordinates();
//выводим результат
}
}
public class Point {
int x; //Начальная координата Х (если начальная координата не (0;0);
int y; //Начальная координата У (если начальная координата не (0;0);
int x1; //Конечная координата Х;
int y1; //Конечная координата У;
public String Scale(){
String s = «;»;
String Scale = ((x1 + x)/2+s+(y1 + y)/2);
return Scale;
}
public void nachaloScale (int x, int y) {
this.x = x;
this.y = y;
}
public void konesScale (int x1, int y1){
this.x1 = x1;
this.y1 = y1;
}
}
——————————-
public class Main {
public static void main(String[] args) {
Point p = new Point();
p.nachaloScale(0,0);
p.konesScale (8,4);
String KOO = p.Scale();
System.out.println(«Seredina: » + KOO);
}
}
При всём уважении, делаете доброе дело, но всё есть моменты не совсем положительные… К выше написанномуБ о том что вы многие моменты не объяснете а просто проговоариваете или молча пиште, хотелось бы что б вы комментировали сложные места или вообще не известные и показывали результат (выведенный итог) который у вас получился и результат (итоговый) заданий. Спасибо
Victor on 19.02.2016
Не понял реализацию метода
Point center(Point other) {
// Возвращает центр между этой и другой точками
// Заметьте, мы используем целое число, поэтому не получим точное значение
return new Point((x + other.x) / 2, (y + other.y) / 2);
}
что за «другая» точка, как изначально задать её координаты и как его проверить результат?
если попытаться написать все это на практике то станет понятнее. но тоже поломал голову оказывается все по хитрому (для новичка): при вызове метода center мы будем писать чтото вроде point1.center(point2) вот и две точки. результатом будет третья.
Не понял реализацию метода
Point center(Point other) {
// Возвращает центр между этой и другой точками
// Заметьте, мы используем целое число, поэтому не получим точное значение
return new Point((x + other.x) / 2, (y + other.y) / 2);
}
что за «другая» точка, как изначально задать её координаты и как его проверить результат?
Point p=new Point(4,1);
Point v=new Point(6,2);
p.center(v).printPoint();
и то строчку
private Point center(Point other) {
поменял на
public Point center(Point other) {
А там метод возвращает значение:
Point p=new Point(4,1);
Point v=new Point(6,2);
p.center(v).printPoint();
поэтому надо p = p.center(v); p.printPoint();
вроде бы переменные ввели
программа что то должна выдавать ?
Ваши уроки крайне не подробны и вызывают лишь недопонимание. Вы не объясняете то, что написано в вашем коде, вы просто это проговаривайте. Допустим про «new» вы не сказали совершенно ничего, зачем это нужно и для чего. Я советую вам ваши уроки переснять и большую часть перенести на текст. Люди, смотрящие эти уроки никогда не купят у вас ваши платные курсы.
Спасибо за критику. Обязательно учтем Ваши пожелания к урокам.
Вы помогаете нам становиться лучше)
Надеюсь правильно:
public class Point {
int x;
int y;
Point(int x, int y){
this.x=x;
this.y=y;
}
public void Scale() {
this.x=x/2;
this.y=y/2;
System.out.println(x+» «+y);
}
public static void main(String[] args) {
Point a = new Point(8,4);
a.Scale();
}
}
public void scale(int x, int y){
this.x=x/2;
this.y=y/2;
}
Константин Волегов on 06.07.2015, в каком месте там деление на ноль?
тип того вышло, но у меня работает:
public void scale (){
if (x != 0 && y != 0){
x = x/2;
y = y/2;
/*если ни одна из координат не 0 */
}
else if ( x == 0 ){
y = y / 2;
/* если х = 0, исключение деления на 0*/
}
else if ( y == 0){
x = x / 2;
/* если у = 0, исключение деления на 0*/
}
}
какая разница ноль/неноль переменная ? условия излишни, надо сразу делить
Мне кажется, вот так проще:
——————————-
файл Point.java:
public class Point{
private int x;
private int y;
public Point(int x,int y){
this.x = x;
this.y = y;
}
public void printPoint(){
System.out.println(«(» + x + «;» + y + «)»);
}
public static Point scale(Point nova){
return new Point (nova.x / 2, nova.y / 2);
}
}
————————————————
файл Main.java:
public class Main{
public static void main(String[] args){
Point Coord = new Point(8, 4);
//Coord.x = 8;
//Coord.y = 4;
Coord.printPoint();
Coord = Point.scale(Coord);
Coord.printPoint();
}
}
———————————————-
Скомпилировал в командной строке и выполнил Main.java.
Всё нормально выполняется.