• ,

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

План уровня:
  • final и другие ключевые слова java
  • Внутренние классы
  • Внутренние статические классы
  • Внутренние анонимные класса, примеры

Курс Java

Что еще можно посмотреть на досуге:
Ответы на вопросы к собеседованию по теме уровня.

Всё про final читаем в 7 главе Философии Java

Внутренние классы подробно описаны в 10 главе Философии Java

www.ibm.com/developerworks/ru/library/j-jtp1029/
www.quizful.net/post/inner-classes-java
easy-code.ru/lesson/java-nested-classes



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

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

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

33 комментария

Bessus
Для знающих английский — довольно наглядные видео:
— анонимные классы: www.youtube.com/watch?v=ihAzMaUFjgY
— внутренние классы: www.youtube.com/watch?v=DZWlO1jCVas
panser
  • panser
  • 0
  • Комментарий отредактирован 2014-02-10 14:06:15 пользователем panser
ошибся
Romanfox
Неплохая статья на тему вложенных и внутренних классов www.quizful.net/post/inner-classes-java
Kverde
Полезная статья про final.
Ruzveld
На Easy-code (2 части) написано про внутренние классы с учетом нововведений в Java 8.
MindIbniM
Очень понравилось у Хорстманна на тему анонимных классов: «Идея ввести в язык безымянные внутренние классы оказалась удачной, или это только великолепное средство создавать никому не понятные программы?»
Byshevsky
Согласен с Хорстманом ))
Не ну реально этот идиотизм с внутренними классами только для того чтобы писать никому не понятные программы. Вот в лекционном примере, на кой хрен вводить класс Дор, а не написать поле дор к классу Кар?
Чем этот код
public class Car
{
 int height = 160;
 ArrayList<Door> doors = new ArrayList<Door>();

 public Car
 {
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
 }

class Door()
 {
  public int getDoorHeight()
  {
   return (int)(height * 0.80);
  }
 }
}


лучше этого:
public class Car
{
    int height = 160;
    ArrayList<Double> doors = new ArrayList<Double>();

    public Car()
    {
        doors.add(height*0.8);
        doors.add(height*0.8);
        doors.add(height*0.8);
        doors.add(height*0.8);
    }
}


кроме лишних строчек кода, и лишних минут того кто будет разбираться с этой писаниной?
ab_random
Тем, например, что ваши двери имеют только высоту, в лекционном же примере, без особых изменений в остальном коде, им можно задать дополнительно ширину, цвет, материал и еще кучу других полезных фишек.
Кроме того, если хотите более реальный пример, на внутренних классах LinkedList реализован.
new-Object
Когда добавится материал как на лекциях 1-21? Через основной курс очень не удобно смотреть.
nanoezhik
Вопрос по разделу «Учимся гуглить»:
Для чего "?" в коде ArrayList<?>. Я так и не нагуглил… может кто подскажет ответ?
INSIDIUS
Загугли generics java
shcho_isle
  • shcho_isle
  • 0
  • Комментарий отредактирован 2015-08-06 12:08:28 пользователем shcho_isle
Как я понял, суть в том, что
List<object>
не покроет все списки. Например, если нам нужно передать в метод такой параметр:
List<все что угодно>
— то
List<object>
для этого не подойдет.

Для этого и нужен
List<?>
Willstealer
как я понял? это что то типа родителя всех типов
хотя совсем не уверен
Amado
Хороший ответ про ArrayList<?>:
The is a wildcard character for a generic type. Normally you declare an array list like:

ArrayList<String>
Where the type is specified exactly. The list will contain Strings. But sometimes you want to make a method or a class that takes an ArrayList of any type, or you want a field that points an ArrayList of any type

public void removeFirstItem(ArrayList<?> target) { 
...
}
Now this method can take an ArrayList<String>, or an ArrayList<Long>, etc, and do some operation on it.

Similiary you can have a local variable:

ArrayList<?> someList;
someList = new ArrayList<String>();
someList = new ArrayList<Long>);
This works, whereas:

ArrayList<String> someList = new ArrayList<String>();
someList = new ArrayList<Long>(); 
Will not, since someList is specified as an ArrayList<String>, so only ArrayList<String> can be assigned to it.
lexel
Ошибка в коде
Должно быть
public Car () со скобками
class Door без скобок
lexel
Не хватает закрывающей фигурной скобки
remain4life
Народ, немного не разберусь в терминологии, у Эккеля написано, что
… Определение класса может размещаться внутри определения другого класса. Такие классы называются внутренними (inner class)…
… Если связь между объектом внутреннего класса и объектом внешнего класса не нужна, можно сделать внутренний класс статическим (объявить его как static). Часто такой класс называют вложенным (nested)...


Однако в рекомендованной статье www.quizful.net/post/inner-classes-java пишется, что
… вложенный класс — это класс, который объявлен внутри объявления другого класса…
… Вложенные классы делятся на статические (в примере выше StaticNestedClass — это именно он) и нестатические (non-static). Собственно нестатические вложенные классы имеют и другое название — внутренние классы (inner classes). Внешний класс (outer class) мы иногда будем называть еще обрамляющим классом…

Также лекция 3 почему-то называется "Вложенные классы", хотя там присутствует только определение "внутренний".

Просьба знающих разъяснить как классы правильно называть.
Joysi
Как я думаю, тут добавляются проблемы перевода. Идем к первоисточнику (Oracle документация):
docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Определение nested(вложенного) класса.
The Java programming language allows you to define a class within another class. Such a class is called a nested class

Terminology: Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes
То есть вложенные бывают статические и не-статические, не-статические вложенные также называют внутренними(inner).

+ в догонку…
There are two special kinds of inner classes: local classes and anonymous classes.
Joysi
Если есть время — очень хорошо описано тут — pr0java.blogspot.ru/2015/08/1.html
remain4life
Спасибо, кажется, что ключевой всё же стала фраза: "… Программисты, пишущие на Java, не пришли к единому мнению по поводу именования различных типов внутренних классов. Поэтому вы можете обнаружить, что в разных ситуациях их называют по-разному..." :)
DmitrySD
присоединяюсь к вопросу nanoezhik про ArrayList<?>… ничего толкового не нагуглил.
как использовать не понял… при попытке написать что то типа:

        ArrayList<?> dro =new ArrayList<>();
        dro.add("String_Value");


IDEA ругается:
ошибка!!!
misha_skafenko
оставлю здесь может мой пример поможет кому-то с дженериками и?

public class Test<T> {
    private T t;

    public Test(T t) {
        this.t = t;
    }

    public void printAnotherAnyClass(Test<?> instanse) {
        System.out.println(instanse.t);
    }

    public void printJustThisClass(Test<T> instanse) {
        System.out.println(instanse.t);
    }

    public void printJustObject(Test<Object> instanse) {
        System.out.println(instanse.t);
    }



    public static void main(String[] args) {
        Test<String> stringTest = new Test<>("string");
        Test<Integer> integerTest = new Test<>(1);
        Test<Object> objectTest = new Test<>(new Object());

        stringTest.printJustThisClass(stringTest);
//        stringTest.printJustThisClass(integerTest);            //wrong
//        stringTest.printJustThisClass(objectTest);       //wrong

        stringTest.printJustObject(objectTest);
//        stringTest.printJustObject(stringTest);                   //wrong
//        stringTest.printJustObject(integerTest);               //wrong

        stringTest.printAnotherAnyClass(integerTest);
        stringTest.printAnotherAnyClass(stringTest);
        stringTest.printAnotherAnyClass(objectTest);

        
    }
}
Nicson777
Что подразумевается под «учиться гуглить»?
Немного поставил в тупик вопрос про «отправка email из java программы».
Нашёл документацию об этом, но чтобы протестировать это, нужно разобраться с библиотекой javax…
Или суть в том, чтобы научится находить нужный ответ в google в необходимой ситуации?
Если кто смог отправить email таким образом, отпишитесь)
imp
javax это явно не самый простой способ отправки
самый простой имхо через сокеты ( то есть общение напрямую с смтп сервером )

public class MailTest {
static PrintStream ps = null; // посылка сообщений
static DataInputStream dis = null; // получение сообщений
public static void send(String str) throws IOException
{
ps.println(str); // посылка строки на SMTP
ps.flush(); // очистка буфера
System.out.println(«Java sent: » + str);
}
public static void receive() throws IOException
{
String readstr = dis.readLine(); // получение ответа от SMTP
System.out.println(«SMTP respons: » + readstr);
}
public static void main (String args[]) throws IOException, InterruptedException {
String HELO = «HELO gazprom.ru»;
String MAIL_FROM = «MAIL FROM: user@gazprom.ru »;
String RCPT_TO = «RCPT TO: pikselnsk@yandex.ru »;
String DATA = «DATA»; // начало сообщения
String FROM = «from: user@gazprom.ru»;
String SUBJECT = «subject: tema »;
String BODY = «Hello my friend! Java sent this!»;
String END = ".";
Socket smtp = null; // сокет SMTP
try { // заметка: 25 — это стандартный номер порта SMTP
smtp = new Socket(«mx.yandex.ru», 25);
OutputStream os = smtp.getOutputStream();
ps = new PrintStream(os);
InputStream is = smtp.getInputStream();
dis = new DataInputStream(is);
}
catch (IOException e)
{
System.out.println(«Error connection: » + e);
}
try { // скажем SMTP helo
receive(); // получение ответа SMTP
send(HELO);
receive(); // получение ответа SMTP
send(MAIL_FROM); // посылка на SMTP
receive(); // получение ответа SMTP
send(RCPT_TO); // посылка адресату SMTP
receive();
send(DATA); // начинается посылка на SMTP
receive(); // получение ответа SMTP
send(FROM);
send(SUBJECT);
send(BODY); // посылка тела сообщения
send(END);
receive();
smtp.close();
}
catch (IOException e)
{
System.out.println(«Error sending: » + e);
}
System.out.println(«Mail sent!»);
}
}
Nicson777
Достаточно наглядно: TreeMap vs HashMap
www.youtube.com/watch?v=85a-sHg5otU
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.