<< >>
Ооп в java
Классы
Создадим новый класс, не изменяя ничего в настройках. Мой называется Tuto.
Создадим в новом классе метод:
public class Tuto {
public void writeMessage(){
System.out.println(«Hello, SG!»);
}
}
В основном классе напишем вот такой код:
public class Tutorial {
public static void main(String[] args) {
Tuto writer = new Tuto();
}
}
Мы создали объект writer с типом Tuto и присвоили ей копию нашего второго класса. Через этот объект мы имеем доступ ко всем методам класса Tuto. Попробуем!
writer.writeMessage();
Немного усложним программу, добавив аргумент в функцию writeMessage:
public class Tuto {
public void writeMessage(String s){
System.out.println(s);
}
}
И вызовем ее — writer.writeMessage(«Hi, blogs!»);
Хоть мы работаем с объектами, но пока еще мы не видели всего кайфа ооп. Начнем!
Конструктор
При обращении к классу(Tuto writer = new Tuto();) java автоматически запускает конструктор, если находит такой. Конструктор — метод с тем-же именем, что и класс но без типа возвращаемого значения, в моем случае:
public class Tuto {
public Tuto(){
}
}
Все аргументы конструктора должны быть определены во время инициализации объекта. Создадим программку, которая говорит строку1, адресуя ее строке2:
public class Tutorial {
public static void main(String[] args) {
Tuto hello = new Tuto(«Hello»); //Объект выводит hello + то, что кинули в метод Say
Tuto hi = new Tuto(«Hi»); //Объект выводит hi + то, что кинули в метод Say
hello.say(«stopgame»); //Выводим Hello, stopgame!
hi.say(«blogs»); //Выводим Hi, blogs!
}
}
public class Tuto {
String what;
public Tuto(String s){ //в конструкторе присваиваем переменной(которая объявлена в этом классе) то, что в класс кинули.
what = s;
}
public void say(String who){ //выводим строку при вызове.
System.out.println(what+", "+who+"!");
}
}
Данная программа показывает, что не смотря на то, что обращаемся мы к одному классу, его объекты независимы друг от друга (выводят разное)
<©Linreal>
тут стоит в целом упомянуть о том, что все созданные пользователем классы относятся к ссылочным типам, а не типам значений(таких как int, double etc)
то есть, переменная
Tuto ob1 = new Tuto(«this is ob1»);
будет ссылаться на объект. Следовательно, переменная ob2
Tuto ob2 = ob1;
будет ссылаться на тот же объект, что и ob1 и при изменении одной из переменных, изменятся все остальные, ссылающиеся на тот же объект. Но!
int i1 = 2;int i2 = i1;int i1 += 3;
в этом случае значение i2 не изменится.
</©Linreal>
Лучшие комментарии
И сразу вопросы:
1) имеется ли в java аналог параметров по умолчанию для методов/конструкторов?
Что то вроде
}
дабы избежать кучи перегрузок.
2)
Тут, ИМХО, можно рассказать о внезапностях, когда мы делаем так:
Tuto ob2 = ob1;
ob1.what = "Still ob1;";
//и внезапно, угадайте, что выведется
System.out.print(ob2.what);
ну, это просто к вопросу о независимости объектов друг от друга.
Больше pro-туториалов!!! =)
2) Это конечно прикольно, но как-то криво. Распишешь? (Только хотел сделать ее private:) )
Я имел ввиду создание различных объектов одного класса
for(<Тип><Имя пер-нной>:<Имя массива>){
}
Данные из ячейки массива перекидываются в переменную, поэтому если переменной присвоить что-то, то с массивом ничего не случится (по мне так грустно)
2) ну тут стоит в целом упомянуть о том, что все созданные пользователем классы относятся к ссылочным типам, а не типам значений(таких как int, double etc)
то есть, переменная
Tuto ob1 = new Tuto("this is ob1");
будет ссылаться на объект. Следовательно, переменная ob2
Tuto ob2 = ob1;
будет ссылаться на тот же объект, что и ob1 и при изменении одной из переменных, изменятся все остальные, ссылающиеся на тот же объект. Но!
int i1 = 2;int i2 = i1;int i1 += 3;
в этом случае значение i2 не изменится.
Ну а так все верно, +.
А вот с помощью стандартного javac все гораздо веселее… Хотя мб я один такой извращенец))
Да, действительно… В шарпе, имхо, лучше реализован этот моментю
int[] arr = new int[3];
arr[] = 2;
arr[1] = 3;
arr[2] = 4;
for(int i:arr)
{
System.out.println(""+i);
}
для аналогии на шарпе придётся достатчно много доп.материала обьяснять.
из чего следует:
arr[] = 2;
arr[1] = 3;
arr[2] = 4;
for(int t:arr)
{
t+=3;
}
for(int i:arr)
{
System.out.println(""+i);
}
Вывод будет таким же(2,3,4). А это действительно грустно.
и по коллекциям можно пройтись с помощью анонимных типов с linqи изменять можно массово. Но в общем то для некоторых случаев и так пойдёт, да.