Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Результатом будет:
true true
To есть в случае, когда строка конструируется из констант, известных уже на момент компиляции, оптимизатор также подставляет один и тот Же объект.
Если же строка создается выражением, которое может быть вычислено только во время исполнения программы, то оно будет порождать новый объект:
String s1="abc"; String s2="ab"; print(s1==(s2+"c"));
Результатом будет false, так как компилятор не может предсказать результат сложения значения переменной с константой.
В классе String определен метод intern(), который возвращает один и тот же объект-строку для всех экземпляров, равных по значению. То есть если для ссылок s1 и s2 верно выражение s1 .equals(s2), то верно и Sl.intern()==s2. intern().
Разумеется, в классе переопределены методы equals() и hashCode(). Метод toStringO также переопределен и возвращает он сам объект-строку, 10 есть для любой ссылки s типа String, не равной null, верно выражение s~=s.toString().
Класс Class
Наконец, последний класс, который будет рассмотрен в этой лекции.
Класс Class является метаклассом для всех классов Java. Когда JVM загружает файл .class, который описывает некоторый тип, в памяти создается объект класса Class, который будет хранить это описание.
Например, если в программе есть строка
Point p=new Point(1,2);
то это означает, что в системе созданы следующие объекты:
1. объект типа Point, описывающий точку (1,2);
2. объект класса Class, описывающий класс Point;
3. объект класса Class, описывающий класс Object. Поскольку класс Point наследуется от Object, его описание также необходимо;
4. объект класса Class, описывающий класс Class. Это обычный Java-класс, который должен быть загружен по общим правилам.
Одно из применений класса Class уже было рассмотрено — использование метода getClass() класса Object. Если продолжить последний пример с точкой:
Class cl=p.getClass(); // это объект №2 из списка Class cl2=cl.getClass(); // это объект №4 из списка Class cl3=cl2.getClass(); // опять объект №4
Выражение cl2==cl3 верно.
Другое применение класса Class также приводилось в примере применения технологии reflection.
Кроме прямого использования метакласса для хранения в памяти описания классов, Java использует эти объекты и для других целей, которые будут рассмотрены ниже (статические переменные, синхронизация статических методов и т.д.).
Заключение
Типы данных - одна из ключевых тем курса. Невозможно написать ни одной программы, не используя их. Вот список некоторых операций, где применяются типы:
• объявление типов;
• создание объектов;
• при объявлении полей — тип поля;
• при объявлении методов — входные параметры, возвращаемое значение;
• при объявлении конструкторов — входные параметры;
• оператор приведения типов;
• оператор instanceof;
• объявление локальных переменных;
• многие другие — обработка ошибок, import-выражения и т.д. Принципиальные различия между примитивными и ссылочными
типами данных будут рассматриваться и дальше по ходу курса. Изучение объектной модели Java даст основу для более подробного изложения объектных типов — обычных и абстрактных классов, интерфейсов и массивов. После приведения типов будут описаны связи между типом переменной и типом ее значения.
В обсуждении будущей версии Java 1.5 упоминаются темплейты (templates), которые существенно расширят понятия типа данных, если действительно войдут в стандарт языка.
В лекции было рассказано о том, что Java является строго типизированным языком, то есть тип всех переменных и выражений определяется уже компилятором. Это позволяет существенно повысить надежность и качество кода, а также делает необходимым понимание программистами объектной модели.
Все типы в Java делятся на две группы — фиксированные простые, или примитивные, типы (8 типов) и многочисленная группа объектных типов (классов). Примитивные типы действительно являются хранилищами данных своего типа. Ссылочные переменные хранят ссылку на некоторый объект совместимого типа. Они также могут принимать значение null, не указывая ни на какой объект. JVM подсчитывает количество ссылок на каждый объект и активизирует механизм автоматической сборки мусора для удаления неиспользуемых объектов.
Были рассмотрены переменные. Они характеризуются тремя основными параметрами - имя, тип и значение. Любая переменная должна быть объявлена и при этом может быть инициализирована. Возможно использование модификатора final.
Примитивные типы состоят из пяти целочисленных, включая символьный тип, двух дробных и одного булевского. Целочисленные литералы имеют ограничения, связанные с типами данных. Были рассмотрены все операторы над примитивными типами, тип возвращаемого значения и тонкости их использования.
Затем изучались объекты, способы их создания и операторы, выполняющие над ними различные действия, в частности принцип работы оператора instanceof. Далее были рассмотрены самые главные классы в Java -Object, Class, String.
Вариант 1
1. Каков будет результат следующего примера? byte b=3; int c=b; С++;
print(++b==c);
□ true
□ false
2. Каким будет результат следующих действий? 1/2 1./2 1/2. 1./2.
□ все операции дадут 0.5
□ все операции дадут 0
□ 0,0.5,0,0.5
□ 0,0.5,0.5,0.5
3. Эквивалентны ли две приведенные ниже операции над ссылочными переменными х1 и х2 (5отеС1азз2 - тип переменной х2)?
х1 тз1апсео!8отеС1азз2
х1.деГС1а88().дет.№те().еяиа18(х2.деГС1а88().дет.№те())
□ да
□ нет
Курс
Программирование на Java
Вариант 2
Вариант 3
1. Каков будет результат следующего примера? Point р = new Point(1, 2);
int а=р.х;
р = new Point(3, 4); print(a);
□ 1
□ 2
□ 3
□ 4
2. Каков будет результат следующих действий? double х=2./0;
double у=-1/0.; print(x+y);
□ POSITIVEJNFINITY
□ о
□ NaN
3. Могут ли следующие выражения вернуть значения false?
a) x.toString() instanceof String
b) (x+"") instanceof String
□ оба выражения возвращают только true
Г"! первое выражение вернет false, если х равен null, второе возвращает только true
Г~| оба выражения вернут false, если х равен null
□ первое выражение вернет null, если х ссылается на объект, порожденный от класса с переопределенным методом toStringt), который возвращает null, второе выражение возвращает только true
1. Каков будет результат следующего примера? Point р1 = new Point(3, 4); Point р2 = р1; р1.х=5;
р1 = new Point(4, 4); print(p2.x-p1 .х);
□ -1
□ о
□ 1
2. Каким будет результат следующей строки (код символа восклицательного знака 33)? print("Hello"+'!');
□ "Hello!"
□ "НеІІоЗЗ"
Щ. Каков будет результат следующих действий? Point р1 = new Point(2, 3); Point р2 = new Point(2, 3); print(p1==p2); p2=p1; p1.x=3; print(p1==p2);
□ true; true
□ true; false
□ false; true
□ false; false