В соотношении 4: 3 ширина / высота составляет 1,33, а в 16: 9 - 1,77 (16/9), поэтому в соотношении 16: 9 вы увеличиваете ширину окна и вам понадобится больше плиток.
Я надеюсь, что это имеет больше смысла для вас:
9 1.33
x 1.77
x = 1.77*9/1.33 = 12
Вместо этого используйте этот шаблон:
OutputStream os;
try {
os = ...
// do stuff
} finally {
try { os.close(); } catch (Exception e) { }
}
Вы закончите тем, что делали материал как этот много.
Лучшей книгой Java "глюки", которые я считал, являются Трудные вопросы Java: Прерывания, Ловушки и Угловые Случаи. Это конкретно не нацелено на разработчиков C++, но это полно примеров вещей, которые Вы хотите высматривать.
Все методы являются виртуальными.
Параметризованные типы (дженерики) на самом деле не создают код определенный для параметра код (т.е., List<String>
использует тот же байт-код как List<Object>;
компилятор является единственной вещью, которая жалуется, пытаетесь ли Вы поместить Integer
в первом).
Varargs легок.
Именно все небольшие крошечные различия в синтаксисе получили меня. Отсутствие деструкторов.
С другой стороны, способность записать основное для каждого класса (очень удобный или тестирующий) реальна хороший; после того, как Вы привыкнете к нему, структура и приемы, доступные с файлами банки, реальны хороший; то, что семантика полностью определяется (например, интервал является тем же везде) реально хороший.
Моя худшая проблема имела в виду владение памяти в любом случае. В C++ это - необходимая вещь сделать, и это создает некоторые шаблоны в уме разработчика, которые трудно преодолеть. В Java я могу забыть об этом (в очень высокой степени, так или иначе), и это включает некоторые алгоритмы и подходы, которые были бы чрезвычайно неловкими в C++.
Так как Вы упоминаете книжные рекомендации, определенно считайте Эффективный Java, 2-го редактора — он обращается к большинству ловушек, которые я видел перечисленный в ответах.
Дженерики (вместо шаблонов), конкретно путь они были реализованы с помощью стирания типа.
Привыкание к наличию сборщика "мусора". Не будучи способен полагаться на деструктор для чистки ресурсов, которые не обрабатывает GC.
Все передается значением, потому что ссылки передаются вместо объектов.
Никакой конструктор копии, если у Вас нет потребности клонироваться. Никакой оператор присваивания.
Все методы являются виртуальными по умолчанию, который является противоположностью C++.
Явная поддержка языка интерфейсов - чистые виртуальные классы в C++.
Мое самое большое препятствие, пересекающееся от C++ до Java, угробило процессуальный кодекс. Я очень привык к связыванию всех моих объектов в рамках процедур. Без процессуального кодекса в Java я сделал циклические ссылки везде. Я должен был изучить, как назвать объекты от объектов без них являющийся зависимыми друг друга. Это было Самое большое препятствие, но самое легкое для преодоления.
Номер 2 персональная проблема является документацией. JavaDoc полезен, но ко многому Java проекты являются объектом неправильного представления, что все, что необходимо, является JavaDoc. Я видел намного лучшую документацию в проектах C++. Это может просто быть персональным предпочтением документации за пределами кода.
Номер 3. Существуют на самом деле указатели в Java, просто никакая адресная арифметика с указателями. В Java их называют ссылками. Не думайте, что можно проигнорировать, где вещи указывают на, это возвратится с большим укусом.
== и .equals не равны.
== посмотрит на указатель (ссылка), в то время как .equals посмотрит на значение, на которое указывает ссылка.
В Java нет объектов, есть только ссылки на объекты. Например:
MyClass myClass; // no object is created unlike C++.
Но:
MyClass myClass = new MyClass(); // Now it is a valid java object reference.
Случайное создание ссылки, когда кто-то думал о конструкторе копирования:
myClass me = new myClass();
myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */
somebodyElse.setPhoneNumber(5551234);
/* Hey... how come my phone doesn't work anymore?!?!? */
Указание параметра метода как final не означает то, что вы сначала думаете
private void doSomething(final MyObject myObj){
...
myObj.setSomething("this will change the obj in the calling method too");
...
}
, потому что java передается по значению, он делает то, что вы ' re спрашивает, просто не сразу очевидно, если вы не понимаете, как java передает значение ссылки, а не объекта.