14 августа 2011 14.08.11 35 1984

Туториал по java (pro) №1

+10

<< >>

Ооп в 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>


Лучшие комментарии

Ещё pro-туториалов!!!
И сразу вопросы:
1) имеется ли в java аналог параметров по умолчанию для методов/конструкторов?
Что то вроде
public static void p(String s,int i, double df = 1.23, string d = "default") {
               
        }


дабы избежать кучи перегрузок.

2)
Данная программа показывает, что не смотря на то, что обращаемся мы к одному классу, его объекты независимы друг от друга Данная программа показывает, что не смотря на то, что обращаемся мы к одному классу, его объекты независимы друг от друга

Тут, ИМХО, можно рассказать о внезапностях, когда мы делаем так:

Tuto ob1 = new Tuto("this is ob1");
        Tuto ob2 = ob1;
        ob1.what = "Still ob1;";
        //и внезапно, угадайте, что выведется
        System.out.print(ob2.what);


ну, это просто к вопросу о независимости объектов друг от друга.

Больше pro-туториалов!!! =)
кстати, имхо, в про-туториалах отзывов будет ещё меньше. ибо тем, кто действительно разбирается, всё и так понятно, и использовать они эти туториалы будут как памятки, а людей пересевших с других языков я тут что то не особо наблюдаю.
1) параметры по умолчанию… хм… Не проще в главном классе создать переменные, присвоить им стд значения, реализовать ввод и вызвать вообще без перегрузок

2) Это конечно прикольно, но как-то криво. Распишешь? (Только хотел сделать ее private:) )
Я имел ввиду создание различных объектов одного класса
Там кто-то просил про foreach?

for(<Тип><Имя пер-нной>:<Имя массива>){

}

Данные из ячейки массива перекидываются в переменную, поэтому если переменной присвоить что-то, то с массивом ничего не случится (по мне так грустно)
ИМХО,(хотя нет, вполне объективно) это абсолютно не веселее. При анаписании более-менее серьёзного продукта ты javac пользоваться не будешь. И связано это не с самим процессом кодинга(хотя и с ним тоже), а с процесссом разработки ПО в целом, который несколько более сложен, чем
1 кнопка — 1 компил
1) да, согласен
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 не изменится.
Смеяться буду, только если с objective c. Ибо люди, всерьёз познавшие этот язык- слишком великие, и в переходе на java не нуждаются =)
Для 1 поста по яве лучше бы написал для народа как что устанавливать, ибо большинство народа даже если и поймут код, тупо не смогут его закомпилить через командную строку))

Ну а так все верно, +.
Зачем сразу помидорками?=) Ассемблерные вставки позволяют достичь нереальной скорости выполнения программы. Но именно что вставки, поэтому что то ещё изучить определённо стоит, имхо. И хотя при современной мощности вт это уже не так актуально, но в некоторых узких областях всё ещё востребовано.
если человек может понять код, но не может установить эклипс — программирование явно не его путь =)
Да эклипс/нетбинс развращают, 1 кнопка — 1 компил не ок)

А вот с помощью стандартного javac все гораздо веселее… Хотя мб я один такой извращенец))
по мне так грустно

Да, действительно… В шарпе, имхо, лучше реализован этот моментю
Так ведь и было дано обьяснение для java. В c# оно не совсем так.
Лови:
public static void main(String[] args) {

                int[] arr = new int[3];
                arr[] = 2;
                arr[1] = 3;
                arr[2] = 4;
                for(int i:arr)
                {
                        System.out.println(""+i);
                }


для аналогии на шарпе придётся достатчно много доп.материала обьяснять.
а, здорово =) с чего перешёл?
кстати, местный «подсветчик»синтаксиса кушает 0. там arr[0] =2;
Да, НО! Грустно это:
Данные из ячейки массива перекидываются в переменную, поэтому если переменной присвоить что-то, то с массивом ничего не случится

из чего следует:
int[] arr = new int[3];
                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 и изменять можно массово. Но в общем то для некоторых случаев и так пойдёт, да.
Читай также