-->

Попытка вызова new object clone не приведет к ошибке

When i try to clone a generic Object i get compile time error . why?

    Object obj=new Object();
    obj.clone();  // Here compile time error "The method clone() from the type Object is not visible"

Every class extends Object class and clone method is protected in Object class.

protected methods can be accessed in same package as well as by subclasses and all classes are child of java.lang.Object.

asked Jul 5, 2012 at 12:56

amicngh's user avatar

1

Because clone is protected in the Object class. It’s not public.

The only way to get access to an object’s clone() method is to know it has a compile-time type that has a public clone() method.

answered Jul 5, 2012 at 12:57

Louis Wasserman's user avatar

Louis WassermanLouis Wasserman

190k25 gold badges340 silver badges413 bronze badges

3

This will be the minimum to get clone working:

public class SubObj implements Cloneable {
  public Object clone() { return super.clone(); }
}

answered Jul 5, 2012 at 13:01

Marko Topolnik's user avatar

Marko TopolnikMarko Topolnik

195k28 gold badges317 silver badges433 bronze badges

Per the Java SE docs:

The class Object does not itself implement the interface Cloneable, so
calling the clone method on an object whose class is Object will
result in throwing an exception at run time.

answered Jul 5, 2012 at 12:59

Steve Townsend's user avatar

Steve TownsendSteve Townsend

53.4k9 gold badges91 silver badges140 bronze badges

4

protected fields can be accessed only from inside the same package, thus clone() method of Object class can be accessed only from any class that is located in java.lang package.

answered Jul 5, 2012 at 13:01

Eng.Fouad's user avatar

Eng.FouadEng.Fouad

115k70 gold badges312 silver badges416 bronze badges

You must explicitely implements Cloneable interface.
see this thread which give explanations.

answered Jul 5, 2012 at 12:58

Arcadien's user avatar

ArcadienArcadien

2,25816 silver badges26 bronze badges

If you use Groovy so that you can bypass the java compilation error, you get this:

Exception in thread "main" java.lang.CloneNotSupportedException: java.lang.Object
    at java.lang.Object.clone(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
    at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:766)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:754)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:198)
    at regexTests.main(regexTests.groovy:19)
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

If you read the clone API (I will link it) it says that if the Interface isn’t implemented, then calling *.clone() will throw a CloneNotSupportedException.

Link to the clone API for java.lang.Object
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29

[EDIT]
The Original Question™ asked for why this method is visible in the way it is. This is because it only accessible to methods within the java.lang package. It isn’t intended for a programmer to be able to clone an Object. Throwing a CloneNotSupportedException is exactly what you want to do if you don’t want your OWN object cloned.

answered Jul 5, 2012 at 13:08

avgvstvs's user avatar

avgvstvsavgvstvs

6,1766 gold badges43 silver badges74 bronze badges

 void method() {

    Object obj=new Object(); //Object is a parent class, it's not inherit from any other class...     
    obj.clone();        //  compile time error   

}

We can’t access the protected method of «Has A» relationship from different package, because your Class package is (com.xxx.yyy) and an Object class package is (java.lang) both the classes are in different package.

protected methods can be accessed in same package as well as by subclasses(IS A relationship)

BetaRide's user avatar

BetaRide

16.1k29 gold badges97 silver badges175 bronze badges

answered Aug 12, 2014 at 7:00

Ratheesh's user avatar

RatheeshRatheesh

6118 silver badges8 bronze badges

I tried this code :

public final class User {


    private String name;
    private boolean isActive;
    private String userId;
    private Address address;


    // can be constructed using this constructor ONLY !
    public User(String name, boolean isActive, String userId, Address address) {
        this.name = name;
        this.isActive = isActive;
        this.userId = userId;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public boolean isActive() {
        return isActive;
    }

    public String getUserId() {
        return userId;
    }

    public Address getAddress() {
        return address;
    }

    protected Object cloneMe() throws CloneNotSupportedException {
        return super.clone(); // throws CloneNotSupportedException
    }
}

public class CloneNotSupportedException
extends Exception

Thrown to indicate that the clone method in class Object has been
called to clone an object, but that the object’s class does not
implement the Cloneable interface. Applications that override the
clone method can also throw this exception to indicate that an object
could not or should not be cloned.

Object doesn’t implement any interface and to make my User class work it must implement Cloneable

answered Feb 17, 2016 at 14:00

Adelin's user avatar

AdelinAdelin

17.9k25 gold badges114 silver badges173 bronze badges

Object class clone() method has modified by protected access modifier in the API level. So we can’t access it anywhere without inheritance. So before we invoke object class clone() method you need to implements Cloneable interface. Then Code will run at runtime properly. Otherwise it will generate CloneNotSupportedException at runtime.

/*Subclass is my implementing class */

public class SubClass implements Cloneable {

    @Override
    public SubClass clone() throws CloneNotSupportedException {
        return (SubClass) super.clone();
    }
}

ChrisMM's user avatar

ChrisMM

8,44913 gold badges29 silver badges48 bronze badges

answered Dec 8, 2019 at 2:19

Manoj Ekanayaka's user avatar

import java.util.Scanner;
import java.util.jar.Attributes.Name;
import java.util.Arrays;
public class Main{
    public class man{
        protected void name() {
            System.out.println("hei");
        }
    }
    public class people extends man{
        public int age;

        public int getAge() {
            name();
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "people [age=" + age + "]";
        }
        
        public Object myclone() throws CloneNotSupportedException {
            return this.clone();
        }
    }
    
    public void test() throws CloneNotSupportedException {
        
        people p1 = new people();
        p1.setAge(10);
        System.out.println(p1);
//      NG:
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();
        p1.setAge(10);
        System.out.println(p1);
        System.out.println(p2);
    }
    public static void main(String args[]) throws CloneNotSupportedException{
        new Main().test();
        
    }
}

see the NG code and ok code.

//      NG for:The method clone() from the type Object is not visible
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();

why?
cause test() is not belong to the subclass.
so even though call clone() by peopel object p1,it is not the place of peopel object.
The myclone() is the exactly the place of people object.

Arghya Sadhu's user avatar

Arghya Sadhu

40.4k9 gold badges78 silver badges107 bronze badges

answered Aug 29, 2020 at 15:19

andrea wang's user avatar

Правильные ответы выделены зелёным цветом.
Все ответы: Курс лекций посвящен современному и мощному языку программирования Java. В его рамках дается вводное изложение принципов ООП, необходимое для разработки на Java, основы языка, библиотеки для работы с файлами, сетью, для построения оконного интерфейса пользователя (GUI) и др.

Отметьте верное утверждение относительно языков Java и JavaScript:

(1) оба языка кроссплатформенны

(2) их спецификации являются закрытыми

(3) JavaScript является синонимом Java

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
static int x = 5;
public static void main(String[] args) {
int x;
int y = 5;
if (y > 3) x = 1;
System.out.println(x);
}
}

(1) 1

(2) 3

(3) 5

(4) предупреждение о потенциальной ошибке

(5) сообщение об ошибке компиляции

Как получить объект класса Color из AWT, описывающий чистый синий цвет?

(1) new Color("blue")

(2) new Color(0, 0, 255)

(3) Color.getBlue()

(4) Color.blue

Каким образом на однопроцессорной машине исполняются многопоточные приложения?

(1) на однопроцессорном компьютере многопоточные приложения не исполняются

(2) количество процессоров для многопоточной архитектуры не имеет значения

(3) рабочее время процессора разбивается на небольшие интервалы, в течение
которых выполняется одна задача, после чего происходит переключение на следующую задачу

Какие методы есть в классе Object?

(1) public boolean equals(Object obj)

(2) public int notify()

(3) public int hashCode()

(4) protected Object clone()

(5) public boolean wait()

Какие классы из пакета java.util предназначены для работы с датами?

(1) java.util.Date

(2) java.util.Time

(3) java.util.Calendar

(4) java.util.DateTime

(5) java.util.GregorianCalendar

Какие источники могут использоваться классами стандартных входных потоков java в качестве
источника данных?

(1) файл – представляется объектом класса File

(2) массив – представляется массивом byte[] или char[]

(3) строка – представляется объектом byte[]

(4) строка – представляется объектом String

(5) таблица базы данных — представляется массивом Object[]

Назовите сете-зависимые уровни модели OSI

(1) уровень приложений

(2) представительский уровень

(3) сессионный уровень

(4) физический уровень

(5) сетевой уровень

Почему объектно-ориентированное программирование пришло на смену процедурному программированию?

(1) программы, написанные с использованием ООП, выполняются на компьютере быстрее

(2) использование ООП позволяет создавать не зависящие от платформы программы

(3) ООП позволяет уменьшить сложность создания ПО

(4) ООП позволяет увеличить надежность создаваемого ПО

Как записать в Java-программе символ с кодом546 (код символа десятичный)?

(1) '546'

(2) u0546

(3) u0222

(4) 222

(5) '222'

Какие варианты объявления целочисленной переменной верны (никакие переменные предварительно не объявлены)?

(1) int a = b;

(2) int a;

(3) int a = 5;

(4) int a = b = 5;

(5) int a = 5, b = a;

Какое из перечисленных ниже имен является простым?

MyClass
MyClass.name
MyClass.name.toString()
MyClass.name.toString().hashCode()

(1) MyClass

(2) MyClass.name

(3) MyClass.name.toString()

(4) MyClass.name.toString().hashCode()

(5) ни один из перечисленных

Какие модификаторы позволяют обращаться к элементу класса из классов-наследников того же пакета?

(1) public

(2) protected

(3) по умолчанию

(4) private

Укажите количество преобразований, которые будут сделаны в следующем коде:

long a = 3;
a = 5 + ‘A’ + a;

(1) 0

(2) 1

(3) 2

(4) 3

(5) 4

Предположим, вы моделируете автомобиль, описывая его свойства в формате Java-класса. Какие из
следующих полей нужно объявить динамическими?

(1) идентификационный номер (VIN)

(2) максимально допустимая масса для этого класса автомобилей

(3) дата начала выпуска автомобилей

(4) дата выпуска автомобиля

Сколько ошибок компиляции и ошибок времени выполнения в следующем примере?

int b[] = new int[5];
for (int i = 0; i <= b.length(); i++) {
b[i] = Math.sqrt(i);
}

(1) 1

(2) 2

(3) 3

(4) 4

(5) 5

Какое утверждение относительно языка Java верно?

(1) он является только компилируемым

(2) он является только интерпретируемым

(3) он является и компилируемым, и интерпретируемым

(4) ни одно из перечисленных

Приведенная ниже программа должна вывести на консоль Hello World! Выберите строки, которые нужно
модифицировать в вашей программе, чтобы получить правильный результат.

1 public class SomeClass {
2 public static void main(String[] args) {
3 String[] arr = {«H», «e», «l», «l», «o», » «, «W», «o», «r», «l», «d», «!»};
4 String result = «»;
5 int i = 0;
6 …
7 System.out.print(arr[i++]);
8 }
9 }

(1) заменить строку 6 на for(i = 0; i < arr.length;)

(2) заменить строку 6 на for(int i = 0; i < arr.length;)

(3) заменить строку 6 на for(i = 0; i < arr.length;i++)

(4) заменить строку 6 на for(i = 1; i <= arr.length;i++)

Какие утверждения относительно класса java.awt.Container верны?

(1) является наследником java.awt.Component

(2) добавляемые компоненты хранятся в упорядоченном списке

(3) для удаления всех компонентов из контейнера служит метод clearAll()

(4) контейнеры могут быть вложены друг в друга

Для чего служит в Java класс Thread?

(1) для запуска потоков

(2) для синхронизации потоков

(3) для изменения свойств (например, приоритета) потоков

(4) для прерывания потоков

Какие утверждения относительно метода equals верны?

(1) для любой объектной ссылки x, отличной от null, вызов x.equals(x) возвращает false

(2) реализация этого метода в классе Object вернет true только в случае равенства по ссылке

(3) метод equals может быть переопределен любым способом

(4) для любых объектных ссылок x и y многократные последовательные вызовы x.equals(y) возвращают одно и то же значение

(5) для любой не равной null объектной ссылки x вызов x.equals(null) должен вернуть значение true

Какие утверждения относительно класса TimeZone верны?

(1) можно создавать экземпляры этого класса

(2) чтобы получить настройки текущей временной зоны надо использовать метод getDefault()

(3) чтобы получить настройки текущей временной зоны надо использовать метод getTimezone()

(4) позволяет получить список всех доступных временных зон

Что произойдет при попытке к одному объекту PipedWriter несколько раз присоединять объектыPipedReader?

(1) при попытке присоединить более одного PipedReader
будет брошено исключение IOException, но только в том случае, если предпринята попытка
присоединить PipedReader, отличный от уже подключенного

(2) при попытке присоединить более одного PipedReader
будет брошено исключение IOException, даже в том случае, если производится попытка
несколько раз присоединить один и тот же объект PipedReader

(3) ничего не произойдет, так как это допустимая ситуация

(4) ничего из перечисленного

Какие утверждения относительно физического уровня OSI верны?

(1) OSI является самым первым в схеме расположения уровней

(2) OSI проверяет доступность среды передачи

(3) OSI описывает среду передачи данных

(4) OSI отвечает за преобразование сигналов между различными средами передачи данных

Какой из вариантов является строчным комментарием?

(1) // комментарий

(2) /* комментарий

(3) /* комментарий */

(4) /** комментарий */

(5) ни один из перечисленных

Укажите результат выполнения следующего фрагмента кода:

int a = 5, b = 6;
a = b++;
System.out.println(a);

(1) 5

(2) 6

(3) 7

(4) будет выдано сообщение об ошибке

(5) ничего из перечисленного

Какие утверждения относительно пакетов в Java верны?

(1) каждый пакет может включать вложенные пакеты

(2) пакет, содержащий вложенный пакет, не может содержать классы

(3) пакеты могут содержать классы и интерфейсы

(4) каждый пакет имеет свое пространство имен

(5) разные пакеты могут разделять одно пространство имен

Для каких элементов в Java можно указать модификатор доступа?

(1) для конструкторов класса

(2) для элементов ссылочных типов

(3) для пакетов

(4) для типов (классов и интерфейсов) объявления верхнего уровня

Какие утверждения относительно преобразования примитивных типов верны?

(1) расширение — это переход от менее емкого типа к более емкому

(2) расширение является небезопасным преобразованием

(3) тип boolean можно привести к типу byte

(4) тип byte можно привести к типу int без потери данных

(5) тип byte можно привести к типу char без потери данных

Какой из следующих вариантов кода выведет на экран "perform"?

(1)

public class SomeClass {
static void perform() {
System.out.println(«perform»);
}
private SomeClass c;
public static void main(String[] args) {
c.perform();
}
}

(2)

public class SomeClass {
static void perform() {
System.out.println(«perform»);
}
private static SomeClass c;
public static void main(String[] args) {
c.perform();
}
}

(3)

public class SomeClass {
void perform() {
System.out.println(«perform»);
}
private static SomeClass c;
public static void main(String[] args) {
c.perform();
}
}

(4)

public class SomeClass {
void perform() {
System.out.println(«perform»);
}
private SomeClass c;
public static void main(String[] args) {
c.perform();
}
}

(5) ни один из перечисленных

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?

public class SomeClass {
public static void main(String[] args) {
____
for (int i = 0; i < b.length; i++) {
System.out.print(b[i]);
}
}
}

(1) int b[] = new int[];

(2) int b[] = new int[3];

(3) int b[];

(4) int b[3];

(5) int b[] = new int[] {0};

Какие из следующих утверждений верны?

(1) в Java существует всего 8 типов данных, которые не являются объектами

(2) в Java все типы данных являются объектами

(3) простые типы могут быть объектами

(4) ссылочные типы могут быть объектами

(5) примитивные типы являются аналогом ссылочных типов

Есть следующий код:

public class SomeClass {
public static void main(String[] args) {
SomeClass t = new SomeClass();
____
}
private int check(String x, int n) {
if (n == 0) return n;
else if (n == 1) {
if (x != null) return 5;
} else if (n == 2 && x != null) {
if (x.equals(«YES»)) return 3;
else if (x.equals(«NO»)) return 4;
}
return -1;
}
}

Если вместо знаков подчеркивания поместить код вызова метода check, то какое из предложений будет верным?

(1) t.check("ANY",1), в этом случае функция вернет значение 14

(2) t.check("NO",2), в этом случае функция вернет значение 4

(3) t.check("YES",1), в этом случае функция вернет значение 3

(4) t.check("YES",2), в этом случае функция вернет значение 4

(5) t.check("ANY",6), в этом случае функция вернет значение -1

Какой метод нужно вызвать, чтобы инициировать перерисовку компонента?

(1) paint

(2) update

(3) repaint

(4) show

Поскольку интерфейс Runnable
представляет собой альтернативный способ программирования потоков исполнения, можно ли в такой программе
обойтись без класса Thread?

(1) да

(2) да, если не модифицировать свойства потока (приоритет и т.п.)

(3) да, если не прерывать поток

(4) да, если не требуется взаимодействие с другими потоками

(5) нет

В чем особенность класса-обертки для void?

(1) никаких отличительных особенностей нет

(2) этот класс, в отличие от остальных классов-оберток, не реализует интерфейс java.io.Serializable

(3) он не имеет открытого конструктора. Более того, экземпляр этого класса вообще не может быть получен

(4) в пакете java.lang отсутствует класс java.lang.Void

В JDK 1.2 введены новые классы и интерфейсы, которые позволяют работать с наборами объектов.
Отметьте те из них, которые являются интерфейсами.

(1) java.util.List

(2) java.util.TreeMap

(3) java.util.AbstractList

(4) java.util.SortedMap

(5) java.util.Iterator

Если вызвать write(0x01234567) у экземпляра OutputStream, то в каком порядке и какие байты будут записаны в выходной поток?

(1) 0x01,0x23,0x45,0x67

(2) 0x67,0x45,0x23,0x01

(3) только 0x01

(4) только 0x67

Какие утверждения относительно канального уровня OSI верны?

(1) описывает среду передачи данных

(2) проверяет доступность среды передачи

(3) отвечает за преобразование сигналов между различными средами передачи данных

(4) отвечает за доставку фреймов между источником и адресатом в пределах сети с одной топологией

Что такое класс?

(1) семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых объектом

(2) конструкция , позволяющая содержать в себе набор переменных различных типов

(3) некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением

(4) шаблон поведения объектов определенного типа с заданными параметрами, определяющими состояние

Сколько комментариев в следующем примере кода:

int x = 0; /* комментарий // комментарий /*
int y = 1; // комментарий */ // комментарий */

(1) 1 блочный, 0 строчных

(2) 1 блочный, 1 строчный

(3) 1 блочный, 2 строчных

(4) 2 блочных, 3 строчных

(5) 2 блочных, 1 строчный

Дан следующий класс:

class abcPoint {
abcPoint(int a, int b) {
x = a;
y = b;
}
int x, y;

}

Укажите результат выполнения следующего фрагмента кода:

abcPoint p = new abcPoint(5,3), p1 = p;
p.x = 4;
System.out.println(p1.x);

(1) 3

(2) 4

(3) 5

(4) будет выдано сообщение об ошибке

(5) ничего из перечисленного

Вы создали класс Animal в пакете ru.animal. Где будет хранится исходный код класса в файловой системе?

(1) ruanimalAnimal.java

(2) ruAnimal.java

(3) ruanimalAnimal.class

(4) ruAnimal.class

(5) ruanimalAnimal

Какие утверждения относительно заголовка класса верны?

(1) допустимые модификаторы доступа для класса — public или default

(2) класс может быть объявлен как final

(3) допустимо наследовать final-класс

(4) допустима следующая цепочка наследования: A наследует классу B, B наследует классу C, C наследует классу A

(5) если не указан класс-предок класса, то это означает, что класс наследует от java.lang.Object

Будет ли скомпилирован следующий пример:

byte b = 100 — 100;
b = 100 + 200;
b = 100 * 100;

(1) пример не будет скомпилирован, будет выдано сообщение об ошибках в 1-й и 2-й строках

(2) пример не будет скомпилирован, будет выдано сообщение об ошибках во 2-й и 3-й строках

(3) пример не будет скомпилирован, будет выдано сообщение об ошибках в 1-й и 3-й строках

(4) пример не будет скомпилирован, будет выдано сообщение об ошибках в 1-й, 2-й и 3-й строках

(5) пример будет скомпилирован

Какой из следующих вариантов кода будет скомпилирован без ошибок

(1)

public class SomeClass {
static int a = b;
static int b = 5;
}

(2)

public class SomeClass {
int a = b;
static int b = 5;
}

(3)

public class SomeClass {
static int a = SomeClass.b;
static int b = 5;
}

(4)

public class SomeClass {
static int a = SomeClass.b;
static int SomeClass.b = 5;
}

(5)

public class SomeClass {
int a = SomeClass.b;
static int b = 5;
}

Сколько объектов порождается при инициализации массива new int[3][4]?

(1) 1

(2) 2

(3) 3

(4) 4

(5) ни одного, так как код не будет скомпилирован

Какие утверждения относительно виртуальной машины Java (Java Virtual Machine) верны?

(1) позволяет отсекать опасный код на каждом этапе работы

(2) периодически запускает сборщик мусора

(3) для запуска приложения на языке Java на какой-либо операционной системе, для нее должна быть создана виртуальная машина

(4) поддерживает запуск приложений из файлов с расширением .java

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass t = new SomeClass();
t.say(1);
}
private void say(int digit) {
switch (digit) {
case 1:
System.out.print(«1»);
break;
case 2:
System.out.print(«2»);
case 3:
System.out.print(«3»);
default:
System.out.print(«Unknown»);
}
}
}

(1) 1

(2) 2

(3) 3

(4) Unknown

(5) ошибка времени выполнения

Сколько вложенных компонентов может быть у контейнера ScrollPane?

(1) 0

(2) 1 любую компоненту

(3) произвольное количество

(4) 1 любую компоненту и 1 контейнер ScrollPane

Для чего нужна синхронизация?

(1) для одновременного запуска нескольких потоков

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

(3) для того, чтобы потоки могли приостанавливать друг друга

(4) для того, чтобы потоки могли запускать друг друга

Какие утверждения относительно класса Math верны?

(1) от этого класса нельзя унаследоваться

(2) является абстрактным

(3) нельзя создать экземпляр этого класса

(4) содержит только статические методы

Какой из перечисленных ниже классов имеет наибольшее сходство с классомVector?

(1) AbstractCollection.

(2) ArrayList

(3) Hashtable

(4) TreeSet

(5) LinkedList

Какие утверждения относительно класса BufferedOutputStream верны?

(1) предоставляет возможность производить многократную запись небольших блоков данных без обращения к устройству вывода

(2) запись с использованием буфера значительно быстрее, чем без него

(3) инициирование передачи содержимого буфера на устройство вывода осуществляется самим классом BufferedOutputStream

(4) инициирование передачи содержимого буфера на устройство вывода можно осуществить явным образом

Какие из следующих адресов относятся к подсети класса B?

(1) 194.80.20.1

(2) 172.16.0.1

(3) 140.150.160.1

(4) 224.0.0.10

Что используется для описания поведения объекта?

(1) поля

(2) методы

(3) наследование

(4) инкапсуляция

Отметьте ключевые слова языка Java:

(1) yes

(2) nil

(3) goto

(4) const

(5) var

Какие существуют примитивные целочисленные типы?

(1) byte

(2) float

(3) short

(4) boolean

Какие утверждения относительно модуля компиляции верны?

(1) хранится в текстовом .java-файле

(2) отсутствие объявления пакета в модуле компиляции вызовет ошибку компиляции

(3) объявления верхнего уровня содержат объявление только одного типа

(4) если в модуле компиляции есть объявление пакета — оно будет первым выражением

(5) import-выражения позволяют импортировать типы в модуль компиляции и далее обращаться к ним по простым именам

Какие утверждения относительно полей класса верны?

(1) допускаются поля с одинаковыми именами, но с разными типами

(2) объявление полей начинается с перечисления модификаторов

(3) поле может быть проинициализировано только в конструкторе

(4) допускается инициализация final полей в конструкторе класса

Какие утверждения относительно преобразования ссылочных типов верны?

(1) преобразование от null-типа к любому объектному типу является расширяющим

(2) преобразование от класса A к классу B, если A наследуется от B является сужающим

(3) можно преобразовать ссылку одного типа к ссылке другого типа даже если они не являются родителем и наследником

(4) всегда можно обращаться к объекту, порожденному от наследника, по типу его родителя

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
int b = this.a;
int a = 5;
{
System.out.print(a);
System.out.print(b);
}
public static void main(String[] args) {
new SomeClass();
}
}

(1) 00

(2) 05

(3) 50

(4) 55

(5) будет выведено сообщение об ошибке компиляции

Какое утверждение относительно приведения массивов верно

(1) любые массивы приводимы, поскольку являются объектами

(2) A[] можно привести кB[], если A приводится к B

(3) A[] можно привести к B[], если A приводится к B, и A, B – ссылочные типы

(4) массивы не преобразовываются

Какие утверждения относительно Java Development Kit (JDK) и Java Runtime Environment (JRE) верны?

(1) JRE включает в себя средства разработки

(2) JDK включает в себя компилятор

(3) JDK не позволяет запускать программы

(4) JRE является минимальной реализацией виртуальной машины

(5) JRE включает в себя JDK

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
int i = 0;
while (i < 6) {
if (i > 5) i—;
if (i < 4) i++;
if (i == 5) i++;
i++;
System.out.print(i);
}
}
}

(1) 1234

(2) 245

(3) 2457

(4) 3457

(5) ошибка времени выполнения

В чем разница между классами Checkbox и CheckboxGroup?

(1) Checkbox позволяет просмотреть весь список вариантов значения, а CheckboxGroup – нет

(2) компонент Checkbox предназначен для организации «переключателей» ( radio buttons )

(3) задача экземпляра класса CheckboxGroup – логически объединить несколько экземпляров класса Checkbox

(4) Checkbox не позволяет ввести произвольное значение, а CheckboxGroup – да

Укажите результат выполнения следующего кода:

public abstract class SomeClass implements Runnable {
public final static Object one = new Object(), two = new Object();
public static void main(String s[]) {
Thread t1 = new Thread() {
public void run() {
synchronized (one) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (two) {
System.out.print(«1»);
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized (two) {
synchronized (one) {
System.out.print(«2»);
}
}
}
};
t1.start();
t2.start();
}
}

(1) программа не завершит работу, на консоли появится 1

(2) программа не завершит работу, на консоли появится 2

(3) программа не завершит работу

(4) программа не завершит работу, на консоли появится 12

Какие утверждения относительно класса ClassLoader верны?

(1) от этого класса нельзя наследовать

(2) является неабстрактным

(3) каждый объект Class содержит ссылку на объект ClassLoader, с помощью которого он был загружен

(4) можно реализовать свой загрузчик, унаследовав его от ClassLoader

Какие утверждения относительно java.util.Observer и java.util.Observable корректны?

(1) Observer является классом, реализующим интерфейс Observable

(2) интерфейс Observer определяет всего один метод, update (Observable o, Object arg), который вызывается, когда обозреваемый объект изменяется

(3) обозреватели должны реализовать интерфейс Observable

(4) порядок, в котором вызываются методы update обозревателей, заранее не определен

(5) из-за отсутствия множественного наследования использовать Observer неудобно

Что произойдет, если, используя ByteArrayOutputStream, записать в файл значения типов long, int,
byte именно в таком порядке, а считать в обратном, используя DataInputStream?

(1) ошибка на этапе компиляции, так как нельзя настраивать DataInputStream
на данные, записанные с помощью ByteArrayOutputStream

(2) несоответствие форматов ByteArrayOutputStream и DataInputStream
проявится только во время выполнения, что приведет к возникновению исключения IOException

(3) все пройдет успешно, но полученные значения byte, int и
long могут отличаться от тех, которые были записаны

(4) все пройдет успешно, полученные значения byte, int и
long не будут отличаться от тех, которые были записаны

Какие из перечисленных ниже характеристик относятся к протоколу TCP?

(1) образование постоянного соединения

(2) не гарантирует доставку сообщения

(3) использование в важных сервисах

(4) протокол уровня приложений

Какие возможны отношения между классами?

(1) агрегация

(2) полиморфизм

(3) ассоциация

(4) инкапсуляция

(5) наследование

Отметьте целочисленные литералы языка Java:

(1) 15L

(2) 15D

(3) 0xdec

(4) 3.14

(5) 0x0

Какой тип должна иметь переменная d в следующем фрагменте:

int a = 1;
short b = 1;
long c = 1;
? d = a + b + c;

(1) byte

(2) short

(3) int

(4) long

(5) char

Какие утверждения относительно импорт-выражений верны?

(1) позволяют импортировать типы в модуль компиляции

(2) можно импортировать один тип

(3) нельзя импортировать пакет целиком

(4) выражение, импортирующее один тип, записывается с помощью ключевого слова import и полного имени типа

(5) import-выражения обязательно всегда являются первыми в модуле компиляции

Какие утверждения относительно методов класса верны?

(1) методы не могут иметь модификатор доступа default

(2) к методу, объявленному с модификаторами public final, нельзя обратиться из класса-наследника

(3) метод, объявленный с модификатором native, должен быть написан на другом языке программирования

(4) идентификатор метода при объявлении становится составным именем метода

(5) метод, объявленный с модификатором final, не может быть переопределен в классе-наследнике

Пусть классы Wolf и Rabbit являются наследниками классаAnimal. Корректен ли следующий пример?

Wolf w = new Wolf();
Animal a = (Animal)w;
Rabbit r = (Rabbit)a;

(1) пример не будет откомпилирован, ошибка в первой строке

(2) пример не будет откомпилирован, ошибка во второй строке

(3) пример будет откомпилирован, но возникнет ошибка времени исполнения

(4) пример полностью корректен

Можно ли при наследовании не реализовывать абстрактный метод родительского класса?

(1) можно в любом случае

(2) можно, если наследник имеет модификатор abstract

(3) можно, если родитель имеет модификатор final

(4) нельзя

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?

public class Vehicle {
public static void main(String[] args) {
Vehicle[] v = new Car[5];

}
public void setVehicles(Vehicle c[]) {
c[0] = new Vehicle();
}
public void setVehicles2(Vehicle c[]) {
if (c[0] instanceof Vehicle) {
c[0] = new Vehicle();
}
}
public void setVehicles3(Car c[]) {
if (c[0] instanceof Car) {
c[0] = new Car();
}
}
}
class Car extends Vehicle{}

(1) setVehicles

(2) setVehicles2

(3) setVehicles3

Какие меры позволяют Java обеспечивать безопасность?

(1) правила работы с памятью

(2) наличие виртуальной машины-интерпретатора

(3) наличие JIT-компилятора

(4) сертификаты для приложений, загружаемых по сети

Есть следующая иерархия наследования:

java.lang.Object
|
+—java.lang.Throwable
|
+—java.lang.Exception
|
+—java.lang.RuntimeException
|
+—java.lang.IndexOutOfBoundsException
|
+—java.lang.StringIndexOutOfBoundsException
|
+—java.lang.ArrayIndexOutOfBoundsException

В методе testSomеValue
могут быть возбуждены исключения StringIndexOutOfBoundsException и
ArrayIndexOutOfBoundsException, при этом они не обрабатываются в блокеtry – catch.
Какое из перечисленных ниже утверждений будет верным?

(1) определение метода testSomеValue
должно включатьthrows StringIndexOutOfBoundsException,
ArrayIndexOutOfBoundsException

(2) если метод, вызывающий testSomeValue, перехватывает
IndexOutOfBoundsException
, то исключения StringIndexOutOfBoundsException,
ArrayIndexOutOfBoundsException тоже будут перехватываться

(3) так как в определении метода указано throws
StringIndexOutOfBoundsException
, ArrayIndexOutOfBoundsException, любой вызывающий
его метод должен перехватывать эти типы исключений, вне зависимости от того, возбуждается во время
работы исключение или нет

(4) при объявлении метода testSomeValue необходимо указывать возбуждаемые исключения

От какого класса наследуется классApplet?

(1) Object

(2) java.awt.Component

(3) java.awt.Canvas

(4) java.awt.Panel

Каким будет результат работы следующего кода?

public abstract class SomeClass implements Runnable{
private Object lock = new Object();
public void lock() {
synchronized (lock) {
try {
lock.wait();
System.out.print(«1»);
} catch (InterruptedException e) {}
}
}
public void notifyThread() {
synchronized (lock) {
lock.notify();
}
}
public void unlock() {
synchronized (lock) {
lock.notify();
System.out.print(«2»);
}
}
public static void main(String s[]) {
SomeClass c = new SomeClass() {
public void run() {
lock();
}
};
SomeClass c1 = new SomeClass() {
public void run() {
unlock();
}
};
new Thread(c).start();
new Thread(c1).start();
c.notifyThread();
}
}

(1) программа не завершит работу, на консоли ничего не появится

(2) программа завершит работу, на консоли появится 12

(3) программа завершит работу, на консоли появится 21

(4) программа не завершит работу, на консоли появится 1

(5) результат трудно предугадать

Классы каких базовых исключений определены в пакете java.lang?

(1) FatalError

(2) Error

(3) Exception

(4) SystemException

Какие утверждения относительно java.util.StringTokenizer корректны?

(1) предназначен для разбора строки по лексемам

(2) позволяет использовать регулярные выражения для разбора строк

(3) позволяет указать строку-разделитель лексем

(4) разделителем лексем по умолчанию служит точка

Какие утверждения относительно объекта класса File верны?

(1) может указывать на каталог

(2) для успешного создания объекта файл должен существовать на диске

(3) является абстрактным представлением файла и пути к нему

(4) не позволяет удалять файл из файловой системы

Каким классом лучше воспользоваться для загрузки web-страницы с сервера?

(1) URL

(2) Socket

(3) DatagramSocket

(4) Web

Инкапсуляция это:

(1) объединение данных и обрабатывающего их программного кода в одной логической структуре (классе)

(2) сокрытие реализации класса и отделение его внутреннего представления от внешнего

(3) одно из базовых понятий ООП, которое позволяет расширять функциональность программы, не расширяя объектную модель этой программы

(4) возможность объектов с одинаковой спецификацией иметь различную реализацию

(5) отделение внутреннего представления класса от внешнего

Какие из перечисленных идентификаторов являются корректными?

(1) abc

(2) 2ab

(3) _bc

(4) for_

Даны следующие классы:

class abc.SomeClass {}
class abc.SomeClass2 extends abc.SomeClass {}

Что будет выведено на экран в следующем фрагменте кода:

abc.SomeClass x1 = new abc.SomeClass();
abc.SomeClass2 x2 = new abc.SomeClass2();
System.out.println((x1 instanceof abc.SomeClass) + » » + (x2 instanceof abc.SomeClass));

(1) false false

(2) true false

(3) true true

(4) false true

Корректен ли объявленный ниже класс? Если нет, то как его можно исправить?

class Box {
private int weight=0;
public int getWeight() {
return weight;
}
void setWeight(int weight) {
weight=weight;
}
}

(1) пример корректен, ничего исправлять не нужно

(2) пример некорректен, конфликт имен в методе setWeight
требует переименования поля или аргумента

(3) пример корректен, однако конфликт имен в методе setWeight
требует переименования поля или аргумента

(4) пример корректен, однако конфликт имен в методе setWeight
требует переименования поля или аргумента, либо использования ключевого слова this

(5) пример корректен, однако конфликт имен в методе setWeight
требует переименования поля или аргумента, либо использования ключевого слова this или super

Какие утверждения относительно инициализаторов класса верны?

(1) инициализаторы не имеют имен

(2) если в классе есть два конструктора и один из них вызывается из второго, то инициализатор будет вызван дважды

(3) при вызове конструктора сначала выполняется код конструктора, а потом код инициализатора

(4) при вызове конструктора сначала выполняется код инициализатора, а потом код конструктора

Укажите результат выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeClass();
c.f1(1, 1);
}
public void f1(byte b, char c) {
System.out.println(«1»);
}
public void f1(byte b, byte c) {
System.out.println(«2»);
}
public void f1(char b, char c) {
System.out.println(«3»);
}
public void f1(char b, byte c) {
System.out.println(«4»);
}
}

(1) 1

(2) 2

(3) 3

(4) 4

(5) возникнет ошибка компиляции

Для каких элементов класса работает полиморфизм?

(1) динамические поля

(2) статические поля

(3) динамические методы

(4) статические методы

Какие утверждения относительно клонирования верны?

(1) выражение x == x.clone() должно быть истинным

(2) выражение x.clone().getClass() == x.getClass() может быть ложным

(3) выражение x.equals(x.clone()) должно быть истинным

(4) для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс IsCloneable

(5) попытка вызова new Object().clone() не приведет к ошибке

Какие утверждения относительно автоматического сборщика мусора (garbage collector) верны?

(1) это отдельное приложение, запускаемое виртуальной машиной

(2) это процесс, периодически запускаемый виртуальной машиной

(3) можно напрямую влиять на алгоритм сборки мусора из программы

(4) можно инициировать проход сборщика мусора из программы

Предположим, нам необходимо создать собственную иерархию исключений.
Рассмотрим следующий пример.

Exception
|
+—LengthException
|
+—TooLongException
|
+—TooShortException

1 class BaseMeasurer{
2 int measureLength(Dimension d) throws LengthException{..}
3 }
4 class DerivedMeasurer extends BaseMeasurer{
5 ___ {
6 }
7 }

Какие из перечисленных ниже выражений можно использовать в строке 5 вместо знаков подчеркивания, чтобы код успешно
откомпилировался?

(1)
int measureLength(Dimension d) throws LengthException

(2)
int measureLength(Dimension d) throws Exception

(3)
int measureLength(Dimension d) throws TooLongException

(4)
int measureLength(Dimension d)

Для чего нужны менеджеры компоновки?

(1) для автоматизации расчета координат компонентов

(2) для облегчения работы со шрифтами

(3) для автоматизации расчета размеров компонентов

Каким будет результат работы следующего кода?

public abstract class SomeClass implements Runnable{
private Object lock = new Object();
public void lock() {
synchronized (lock) {
try {
lock.wait();
System.out.print(«1»);
} catch (InterruptedException e) {}
}
}
public void unlock() {
synchronized (lock) {
lock.notify();
System.out.print(«2»);
}
}
public static void main(String s[]) {
new Thread(new SomeClass() {
public void run() {
lock();
}
}).start();
new Thread(new SomeClass() {
public void run() {
unlock();
}
}).start();
}
}

(1) программа не завершит работу, на консоли ничего не появится

(2) 12

(3) 21

(4) программа не завершит работу, на консоли появится 1

(5) программа не завершит работу, на консоли появится 2

(6) результат трудно предугадать

Какие классы и интерфейсы, необходимые для поддержки многопоточности, определены в пакете java.lang?

(1) Thread

(2) Runnable

(3) ThreadIterator

(4) ThreadException

(5) RunnableException

Какие утверждения относительно java.util.ResourceBundle корректны?

(1) предназначен для хранения объектов, общих для всех локалей

(2) позволяет манипулировать наборами ресурсов, зависящих от локалей

(3) загрузка объекта для нужной локали производится с помощью статического метода getResource()

(4) класс ресурсов может иметь модификатор private

(5) класс ресурсов может иметь модификатор protected

Каковы высказывания относительно классов Reader и InputStream верны?

(1) оба класса работают с байтовыми данными

(2) оба класса могут работать с символьными данными

(3) Reader является потомком класса InputStream

(4) Reader работает с символьными данными

(5) при работе с InputStream нельзя указать кодировку

Какие классы используются для работы с протоколом TCP?

(1) URL

(2) Socket

(3) DatagramSocket

(4) ServerSocket

(5) Web

Какой класс в Java является метаклассом?

(1) Meta

(2) Class

(3) Metaclass

(4) Super

(5) в Java нет метакласса

Какой вариант кода выведет на экран значение true?

(1)

int x=0;
System.out.println(++x==++x);

(2)

int x=0;
System.out.println(++x==x);

(3)

int x=0;
System.out.println(x==x++);

(4)

int x=0;
System.out.println(x++==x++);

(5)

int x=0;
System.out.println(x++==++x);

Какие утверждения относительно класса java.lang.Object верны

(1) у этого класса нет суперкласса

(2) нельзя явно наследовать этот класс

(3) у этого класса нет полей

(4) любой класс напрямую, или через своих родителей, является наследником Object

(5) нельзя явно переопределять методы этого класса

Какие формальные нарушения соглашений по именованию присутствуют в следующем примере:

public class flat{
private int floor_number;
private int r; // количество комнат
public int getR() {
return r;
}
public int getFloorNumber() {
return floor_number;
}
}

(1) класс назван со строчной буквы, должно быть Flat

(2) имя поля floor_number
содержит два слова, разделенных знаком подчеркивания, должно быть floorNumber

(3) имя поля r состоит из одной буквы, а оно должно быть более понятным, например,
rooms или roomsNumber

(4) нет методов, с помощью которых можно изменить значения переменных

Укажите правильный вариант объявления метода main — точку входа в программу на языке Java.

(1) public void main(String args[])

(2) public static void main(String args)

(3) public void main(String args)

(4) public static void main(String[] args)

(5) public static void main()

Значение какого типа будет хранить переменная b после инициализации?

byte b = 1 + 2;

(1) char

(2) byte

(3) short

(4) int

Какое значение появится на консоли после выполнения следующей программы?

class Parent {
int x = 2;
public void print() {
System.out.println(x);
}
}
class Child extends Parent {
int x = 3;
public static void main(String[] args) {
new Child().print();
}
public void print(String val){
System.out.println(val);
}
}

(1) 0

(2) 1

(3) 2

(4) 3

(5) будет выведено сообщение об ошибке

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
int a[] = {1, 2, 3};
int b[] = (int[]) a.clone();
a[0] = 0;
System.out.print(b[0]);
System.out.print(b[1]);
System.out.print(b[2]);
}
}

(1) 023

(2) 123

(3) сообщение об ошибке компиляции

(4) сообщение об ошибке времени исполнения

Что будет выведено на экран в результате выполнения следующего кода:

public class Test {
public static void main(String[] args) {
Test t = new Test();
t.test();
}
void test() {
Test:{
test:
for (int i = 0; true; i++) {
if (i % 2 == 0) continue test;
if (i > 10) break Test;
System.out.print(i);
}
}
}
}

(1) 1357

(2) 13579

(3) 135

(4) 1

(5) ошибка времени исполнения

Какие утверждения относительно обработки пользовательских событий в AWT верны?

(1) модель обработки событий построена на основе шаблона проектирования Observer/Observable

(2) слушатели периодически опрашивают наблюдаемый объект на предмет изменения состояния

(3) классы различных событий и интерфейсы слушателей помещены в отдельный пакет java.awt.event

(4) AWT сгенерирует событие, только если имеется соответствующий слушатель

Какие из методов выбрасывают InterruptedException?

(1) sleep

(2) wait

(3) notify

(4) yield

Какие утверждения относительно класса Runtime верны?

(1) каждому приложению Java сопоставляется экземпляр класса Runtime

(2) позволяет загружать классы в память

(3) позволяет получить данные о количестве памяти, выделенной JVM

(4) позволяет загружать библиотеки

(5) объект этого класса можно получить с помощью метода Runtime.getInstance()

Какие утверждения относительно java.util.Properties корректны?

(1) позволяет загрузить набор свойств из входного потока

(2) позволяет хранить набор свойств только в файле

(3) хранит свойства в виде пар ключ/значение

(4) строки, состоящие из одних пробелов, или начинающиеся со знаков ! или #, запоминаются в специальной структуре

(5) list(PrintWriter out) класса java.util.Properties является наиболее оптимальным способом сохранения набора свойств

Какие методы объявлены в интерфейсе Serializable?

(1) в интерфейсе Serializable не определено ни одного метода

(2) Serializable определяет два абстрактных метода – readObject() и writeObject()

(3) Serializable – это класс, в котором есть только конструктор без параметров

(4) Serializable определяет два абстрактных метода – read() и write()

Какие утверждения относительно уровня приложений OSI верны?

(1) позволяет учитывать авторизацию пользователя

(2) обеспечивает выполнение прикладных задач

(3) гарантирует точную доставку данных

(4) обеспечивает виртуальные соединения между пользовательскими приложениями

Наследование это:

(1) сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса)

(2) отношение между классами, при котором класс использует структуру или поведение другого класса

(3) возможность объектов с одинаковой спецификацией иметь различную реализацию

(4) ничего из перечисленного

Отметьте строковые литералы языка Java:

(1) ""

(2) ''

(3) """

(4) 'u0041'

(5) '101'

Дан следующий класс:

class abc.Point {
abc.Point(int a, int b) {
x = a;
y = b;
}
int x, y;

}

Укажите результат выполнения следующего фрагмента кода:

abc.Point p = new abc.Point(5,3), p1;
p1 = p;
p = null;
System.out.println(p1.x);

(1) 3

(2) 4

(3) 5

(4) будет выдано сообщение об ошибке

(5) ничего из перечисленного

Ниже приведено несколько вариантов записи модуля компиляции. Какой из них корректен, если предполагается описать класс
ABCPoint из пакета test.demo, причем класс активно использует класс ru.additional.abc.Point
и несколько классов из пакета java.net?

(1)

package test.demo;
import ru.additional.abc.Point;
import java.net.*;

(2)

import ru.additional.*;
import java.net.*;
package test.demo;

(3)

package test.demo;
import java.net;
import ru.additional.abc.Point;

(4)

package test.demo.*;
import java.net.*;
import ru.additional.abc.*;

(5) ни один из перечисленных

Какие утверждения относительно конструкторов класса верны?

(1) конструктор может иметь модификатор доступа final

(2) имя конструктора должно совпадать с названием класса

(3) если конструктор выполнился без ошибок, то объект гарантированно создается

(4) конструктор не может содержать return-выражение

(5) чтобы обратиться к конструктору родительского класса необходимо использовать ключевое слово this

Какие из следующих присвоений корректны?

(1)
SomeClass c = 1;

(2)
Object o = 1;

(3)
int i = 1;

(4)
String s = 1;

(5)
byte b = (byte) 1;

Какие утверждения относительно интерфейсов верны?

(1) интерфейс может иметь модификатор abstract

(2) у интерфейса может быть только один интерфейс родитель

(3) все поля интерфейса имеют модификаторы public final static

(4) класс может реализовать только один интерфейс

(5) для наследования интерфейса применяется ключевое слово extends

От какого класса наследуются классы массивов?

(1) особый класс для массивов

(2) Object

(3) одномерные массивы – отObject, двумерные – от одномерных и т.д.

(4) ни от какого

Какие утверждения относительно языка Java верны:

(1) язык Java является объектно-ориентированным

(2) Java является расширением HTML

(3) язык Java является кроссплатформенным

(4) синтаксис языка Java не похож на синтаксис языка C

(5) язык Java имеет открытую спецификацию

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
static int x;
public static void main(String[] args) {
SomeClass s = new SomeClass();
s.test(5);
System.out.println(x);
}
private void test(int x) {
x = this.x + 5;
System.out.print(x);
}
}

(1) 55

(2) 510

(3) 05

(4) 50

(5) сообщение об ошибке компиляции

Какими параметрами в Java характеризуется шрифт?

(1) имя-семейство шрифта

(2) жирность

(3) размер

(4) стиль

(5) цвет

Что такое приоритет потока?

(1) порядковый номер потока в очереди на исполнение

(2) количество интервалов времени, в течение которого процессор будет обслуживать поток

(3) процессор сначала выполняет все задачи с более высоким приоритетом, затем – с менее высоким

(4) качественная характеристика, обеспечивающая распределение процессорного
времени между потоками: чем выше приоритет, тем в среднем чаще будет выделяться процессорное время
для такого потока

Какие методы есть в классе Object?

(1) public String toString()

(2) public boolean notify()

(3) public final native void wait()

(4) public boolean finalize()

(5) public void wait()

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String s[]) {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.YEAR, 2011);
cal.set(Calendar.MONTH, Calendar.APRIL);
cal.set(Calendar.DAY_OF_MONTH, 30);
cal.add(Calendar.DAY_OF_MONTH, 1);
cal.roll(Calendar.MONTH, 11);
SimpleDateFormat sdf = new SimpleDateFormat(«yyyy MMMM dd»);
System.out.println(sdf.format(cal.getTime()));
}
}

(1) 2011 April 31

(2) 2011 April 01

(3) 2011 March 01

(4) сообщение об ошибке компиляции

(5) сообщение об ошибке времени исполнения

Какие утверждения относительно классов InputStream и OutputStream верны?

(1) являются абстрактными

(2) если запрашиваемые данные еще не готовы к считыванию, метод read() вернет значение -1

(3) метод write(int) является абстрактным и должен быть реализован в классах-наследниках

(4) метод write(int) принимает в качестве параметра int, но реально записывает в поток только byte

(5) метод write(int) принимает в качестве параметра int, реально записывает в поток только int

Назовите сете-зависимые уровни модели OSI

(1) представительский уровень

(2) сетевой уровень

(3) уровень передачи данных

(4) сессионный уровень

(5) физический уровень

(6) уровень приложений

Что из перечисленного является недостатком ООП?

(1) неэффективность в смысле распределения памяти

(2) унификация программ за счет стандартных компонентов

(3) излишняя универсальность

(4) неэффективность в смысле модификации отдельных компонентов

Сколько комментариев в следующем примере кода:

int x = 0; /* text // text */
int y=1; // text */ // text */

(1) 1 блочный, 0 строчных

(2) 1 блочный, 1 строчный

(3) 1 блочный, 2 строчных

(4) 2 блочных, 3 строчных

Какие варианты объявления булевой переменной верны (никакие переменные предварительно не объявлены)?

(1) boolean a;

(2) boolean a = '5';

(3) boolean a = true;

(4) boolean a = 5;

(5) boolean a = (5==6);

Какое из перечисленных ниже имен является составным?

Object
java.lang
lang
java.lang.Object

(1) Object

(2) java.lang

(3) lang

(4) java.lang.Object

Какие модификаторы позволяют обращаться к элементу класса из классов, не являющихся наследниками того же пакета?

(1) public

(2) protected

(3) по умолчанию

(4) private

Укажите количество преобразований, которые будут сделаны в следующем коде:

long a = 3;
a = 5 + a;
System.out.print(«a = » + a);

(1) 1

(2) 2

(3) 3

(4) 4

(5) 5

Предположим, вы моделируете автомобиль, описывая его свойства в формате Java-класса. Какие из
следующих полей нужно объявить динамическими?

(1) количество колес этого класса автомобилей

(2) цвет автомобиля

(3) наличие/отсутствие кондиционера

(4) дата начала выпуска марки автомобилей

Что означает термин «строгая типизация»?

(1) переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной

(2) переменная связывается с типом в момент объявления и тип не может быть изменён позже

(3) тип переменной может изменяться в процессе работы программы

(4) переменная имеет тип, известный уже на момент компиляции

(5) ничего из перечисленного

Приведенная ниже программа должна вывести на консоль Hello World! Выберите строки, которые нужно
модифицировать в вашей программе, чтобы получить правильный результат.

1 public class SomeClass {
2 public static void main(String[] args) {
3 String[] arr = {«H», «e», «l», «l», «o», » «, «W», «o», «r», «l», «d», «!»};
4 String result = «»;
5 int i = 0;
6 …
7 System.out.print(arr[++i]);
8 }
9 }

(1) заменить строку 6 на for(i = -1; i < arr.length;)

(2) заменить строку 6 на for(i = -1; i < arr.length - 1;)

(3) заменить строку 6 на for(i = -1; i < arr.length; i++)

(4) заменить строку 6 на for(i = -1; i < arr.length - 1; i++)

Какие утверждения относительно класса java.awt.Container верны?

(1) процесс отрисовки инициализируется операционной системой

(2) контейнер своим методом repaint отрисовывает себя и все вложенные в него компоненты

(3) компоненты отрисовываются в произвольном порядке

(4) добавляемые компоненты хранятся в упорядоченном списке

Какой метод класса Thread будет выполнен после запуска потока?

(1) start()

(2) begin()

(3) init()

(4) run()

(5) go()

Какие утверждения относительно метода hashCode верны?

(1) если два объекта идентичны, то есть вызов метода equals(Object) возвращает true, то вызов метода hashCode() у каждого из этих двух объектов должен возвращать одно и то же значение

(2) реализация этого метода в классе Object вернет true только в случае равенства по ссылке

(3) метод hashCode() должен возвращать одно и то же значение между разными запусками приложения

(4) во время одного запуска программы для одного объекта при вызове метода hashCode() должно возвращаться одно и то же значение, если между этими вызовами не были затронуты данные, используемые для проверки объектов на идентичность в методе equals()

(5) при переопределении метода equals() необходимо переопределить также метод hashCode()

В чем различия классов SimpleTimeZone и TimeZone?

(1) можно создавать экземпляры обоих классов

(2) SimpleTimeZone является абстрактным, а TimeZone — нет

(3) TimeZone является абстрактным, а SimpleTimeZone — нет

(4) SimpleTimeZone является наследником TimeZone

Какие классы предоставляют методы для записи в поток двоичного представления значений примитивных типов Java?

(1) DataOutputStream

(2) OutputStream

(3) SimpleOutputStream

(4) ObjectOutputStream

Что из перечисленного относится к топологиям физического уровня?

(1) шина

(2) круг

(3) кольцо

(4) расширенное кольцо

(5) расширенная звезда

Какие утверждения относительно состояния объекта верны?

(1) состояние объекта всегда постоянно

(2) это совокупный результат поведения объекта

(3) в любой момент времени включает в себя значения свойств объекта

(4) не зависит от свойств объекта

Какие из вариантов являются строчными комментариями?

(1) /* комментарий

(2) //* комментарий */

(3) // комментарий

(4) /** комментарий */

Укажите результат выполнения следующего фрагмента кода:

int a = 5;
int b = 6;
++a = b++;
System.out.println(a);

(1) 5

(2) 6

(3) 7

(4) будет выдано сообщение об ошибке

(5) ничего из перечисленного

Какие утверждения относительно пакетов в Java верны?

(1) элементами пакета являются вложенные пакеты и типы

(2) пакет может включать вложенные пакеты

(3) пакет, содержащий класс, не может содержать вложенные пакеты

(4) пакет, содержащий вложенный пакет, не может содержать интерфейсы

(5) каждый пакет имеет свое пространство имен

Какой модификатор доступа можно применить для пакета?

(1) public

(2) default

(3) protected

(4) private

(5) никакой

Какие варианты кода будут выполнены без ошибок?

(1)

int a = b;
boolean c = (boolean)a;

(2)

byte b = 3;
int a = b;

(3)

int a = 2;
byte c = a;

(4)

int a = 2;
float c = (float)a;

Какой из следующих вариантов кода выведет на экран "perform"?

(1)

public class SomeClass {
void perform() {
System.out.println(«perform»);
}
private SomeClass c;
public static void main(String[] args) {
SomeClass.perform();
}
}

(2)

public class SomeClass {
static void perform() {
System.println(«perform»);
}
private static SomeClass = new SomeClass();
public static void main(String[] args) {
c.perform(«perform»);
}
}

(3)

public class SomeClass {
static void perform() {
System.out.println(«perform»);
}
private static SomeClass c;
public static void main(String[] args) {
SomeClass.c.perform();
}
}

(4)

public class SomeClass {
void perform() {
System.out.println(«perform»);
}
private static SomeClass c = new SomeClass();
public static void main(String[] args) {
c.perform();
}
}

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?

public class SomeClass {
public static void main(String[] args) {
____
for (int i = 0; i < b.length; i++) {
System.out.print(b[i]);
}
}
}

(1) int b[] = new {0,0,0};

(2) int b[3] = [0,0,0];

(3) int b[] = {0,0,0};

(4) int b[] = [0,0,0];

Какие из следующих утверждений верны?

(1) язык Java обладает встроенной и прозрачной моделью безопасности

(2) язык Java не является объектно-ориентированным

(3) язык Java прост в освоении

(4) язык Java ориентирован на сетевые распределенные приложения

(5) язык Java не является переносимым

Есть следующий код:

public class SomeClass {
public static void main(String[] args) {
SomeClass t = new SomeClass();
____
}
private int check(String x, int n) {
if (n == 0) return n;
else if (n == 1) {
if (x != null) return 5;
} else if (n == 2 && x != null) {
if (x.equals(«YES»)) return 3;
else if (x.equals(«NO»)) return 4;
}
return -1;
}
}

Если вместо знаков подчеркивания поместить код вызова метода check, то какое из предложений будет верным?

(1) t.check("NO",2), в этом случае функция вернет значение 4

(2) t.check("NO",1), в этом случае функция вернет значение 5

(3) t.check("ANY",0), в этом случае функция вернет значение -1

(4) t.check("YES",3), в этом случае функция вернет значение 3

(5) t.check("YES",5), в этом случае функция вернет значение -1

Какие утверждения верны?

(1) метод update вызывает метод paint

(2) метод repaint вызывает метод paint

(3) метод update вызывает метод repaint

(4) метод repaint вызывает метод update

Какое преимущество предоставляет интерфейс Runnable
по сравнению с классом Thread?

(1) позволяет работать с потокома-демонами

(2) позволяет более гибко работать с приоритетами потоков

(3) обеспечивает автоматическую синхронизацию

(4) позволяет классу, содержащему логику работы, наследоваться от других классов

Для каких примитивных типов Java существуют классы-обертки?

(1) для всех примитивных типов, включая void

(2) для всех примитивных типов, кроме void

(3) только для числовых (byte,int,short ,float,double) и void

(4) только для char и void

В JDK 1.2 введены новые классы и интерфейсы, которые позволяют работать с наборами объектов. Отметьте тот из них, который является интерфейсом.

(1) java.util.SortedMap

(2) java.util.TreeMap

(3) java.util.LinkedList

(4) java.util.AbstractList

Если вызвать write(0x02468101) у экземпляра OutputStream, то в каком порядке и какие байты будут записаны в выходной поток?

(1) 0x02,0x46

(2) 0x81,0x01

(3) только 0x01

(4) 0x01,0x81,0x46,0x02

(5) 0x02,0x46,0x81,0x01

Какое назначение подуровня MAC?

(1) обеспечивает обмен данными с сетевым уровнем

(2) обеспечивает доступ к физическому уровню

(3) обеспечивает обмен данными с транспортным уровнем

(4) обеспечивает доступ к канальному уровню

(5) обеспечивает доступ к представительскому уровню

Укажите варианты кода, которые будут скомпилированы без ошибок

(1)

circle.get/*комментарий*/Radius();

(2)

circle./*комментарий*/getRadius();

(3)

int/*комментарий*/x=1;

(4)

in/*комментарий*/t x=1;

(5)

int x/*комментарий*/=1;

Дан следующий класс:

class abc.Point {
abc.Point(int a, int b) {
x = a;
y = b;
}
int x, y;

}

Укажите результат выполнения следующего фрагмента кода:

abc.Point p = new abc.Point(5,3), p1;
System.out.println(p1 == p);

(1) true

(2) false

(3) будет выдано сообщение об ошибке

(4) ничего из перечисленного

Вы создали класс Animal в пакете ru.animal. Где будет храниться исходный код класса в файловой системе?

(1) ruAnimal.java

(2) ruAnimal.class

(3) ruanimalAnimal.java

(4) ruanimalAnimal.class

(5) ruanimalAnimal

Какие варианты кода не вызовут ошибку компиляции?

(1)

class Parent {}
class FirstChild extends Parent {}
class SecondChild implements FirstChild {}

(2)

class Parent {}
interface FirstChild {}
class SecondChild implements FirstChild {}

(3)

class Parent {}
interface FirstChild extends Parent {}
class SecondChild implements FirstChild {}

(4)

class Parent {}
interface FirstChild {}
interface SecondChild extends FirstChild {}

(5)

class Parent {}
interface FirstChild {}
interface SecondChild implements FirstChild {}

Укажите результат выполнения следующего кода?

long a = 111111111111L;
float f = a;
long b = 11111L;
float d = b;
System.out.println( a == (long) f);
System.out.println( b == (long) d);

(5) будет выведено сообщение об ошибке

Какой из следующих вариантов кода будет скомпилирован без ошибок

(1)

public class SomeClass {
static int a = SomeClass.b;
static int b = a;
}

(2)

public class SomeClass {
static int a = b;
int b = 5;
}

(3)

public class SomeClass {
static int a = SomeClass.b;
int b = 5;
}

(4)

public class SomeClass {
static int a = SomeClass.b;
static int b = 5;
}

(5)

public class SomeClass {
int a = SomeClass.b;
static int b = 5;
}

Сколько объектов порождается при инициализации массива
new int[][3]?

(1) 1

(2) 2

(3) 3

(4) 4

(5) ни одного, так как код не будет скомпилирован

Какие утверждения относительно компилятора JIT (Just in Time) верны?

(1) он транслирует байт-код программы в «родной» код операционной системы

(2) увеличивает время запуска

(3) замедляет выполнение программы

(4) может быть отключен

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass t = new SomeClass();
t.say(3);
}
private void say(int digit) {
switch (digit) {
case 1:
System.out.print(«ONE»);
break;
case 2:
System.out.print(«TWO»);
case 3:
System.out.print(«THREE»);
default:
System.out.print(«Unknown»);
}
}
}

(1) ONETWO

(2) TWO

(3) TWOTHREEUnknown

(4) THREEUnknown

(5) ONETWOTHREEUnknown

Какие утверждения относительно класса Canvas верны?

(1) является базовым для всех остальных компонентов

(2) используется в качестве суперкласса для создания пользовательского компонента с нестандартным внешним видом

(3) является простейшим наследником Component

(4) является простейшим наследником Container

Если один поток начал исполнение synchronized-блока, указав ссылку на некий объект, может ли другой поток обратиться к полю этого объекта? К методу?

(1) да, нет

(2) нет, да

(3) нет, да (если это не synchronized-метод)

(4) ничего из перечисленного

Какой класс используется для представления модифицируемых строк?

(1) String

(2) StringTokenizer

(3) StringBuffer

(4) StringEditable

(5) EditableString

Какие высказывания относительно java.util.Vector и java.util.ArrayList можно считать корректными?

(1) оба класса являются синхронизированными

(2) Vector является более медленным, чем ArrayList

(3) ArrayList нельзя применять при работе с потоками, т.к. он не является синхронизированным

(4) синхронизированную версию Arraylist можно получить с помощью конструкции Collections.synchronizedList(new ArrayList(...))

(5) синхронизированную версию Arraylist можно получить с помощью конструкции ArrayList.synchronizedList(new ArrayList(...))

Какой класс позволяет подсчитать количество считанных строк?

(1) LineInputStream

(2) LineNumberInputStream

(3) NumberInputStream

(4) CountInputStream

Какие из следующих адресов относятся к подсети класса c?

(1) 184.80.20.1

(2) 14.80.22.5

(3) 194.15.40.6

(4) 219.40.80.33

Какое утверждение относительно полиморфизма верно?

(1) позволяет скрывать реализацию класса

(2) используется для написания общего кода, который будет
одинаково работать с разными типами данных (объектами разных классов), при условии, что классы, от которых созданы эти объекты, имеют общего предка

(3) позволяет отделять внутреннее представление класса от внешнего

Отметьте ключевые слова языка Java:

(1) protected

(2) false

(3) null

(4) boolean

(5) default

Какие значения может принимать переменная булева типа?

(1) 0

(2) 1

(3) true

(4) null

(5) false

Какие утверждения относительно модуля компиляции верны?

(1) import-выражения необязательны

(2) если объявление пакета отсутствует, то модуль компиляции будет принадлежать безымянному пакету

(3) хранится в текстовом .class-файле

(4) в модуле компиляции может быть больше одного объявления пакета

(5) объявления верхнего уровня позволяют обращаться к типам из других пакетов по их простым именам

Что будет выведено на экран в результате выполнения следующего фрагмента кода:

public class SomeClass {
public static void main(String args[]) {
SomeClass s = new SomeClass();
System.out.println(s.x + «, » + s.y);
}
int getX() {
return x;
}
int y = getX();
int x = 3;
}

(1) 3, 3

(2) 3, 0

(3) 0, 0

(4) сообщение об ошибке компиляции

(5) ничего из перечисленного

Какие значения могут участвовать в преобразовании к строке?

(1) выражения примитивного типа

(2) выражения ссылочного типа

(3) значение null

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public void perform() {
this.perform(1);
System.out.print(«1»);
}
public void perform(int val) {
System.out.print(val);
}
public static void main(String[] args) {
SomeClass c = new SomeClass2();
c.perform(4);
}
}
class SomeClass2 extends SomeClass {
public void perform() {
super.perform();
System.out.print(«3»);
}
public void perform(int val) {
super.perform();
System.out.print(val);
}
}

(1) 114

(2) 4113

(3) 41

(4) 311

(5) произойдет ошибка времени выполнения

Какое утверждение относительно приведения массивов верно?

(1) многомерные массивы преобразовывать нельзя

(2) любые массивы приводимы, поскольку являются объектами

(3)
A[] можно привести к B[], если A приводится к B, и A,
B – примитивные типы

(4) массивы не преобразовываются

(5) ничего из перечисленного

Что означает выражение deprecated?

(1) используемые функции устарели, но поддерживаются в целях совместимости

(2) используемые функции работают неэффективно

(3) используемые функции не поддерживаются

(4) используемые функции работают неправильно

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
int i = 0;
do {
if (i > 5) i—;
if (i < 4) i++;
if (i == 5) i+=2;
i++;
System.out.print(i);
} while (i <= 5);
}
}

(1) 2457

(2) 24578

(3) 2458

(4) 245

(5) ошибка времени выполнения

Какие утверждения относительно классов Frame и Dialog верны?

(1) экземпляр класса Frame создается видимым

(2) Dialog является несамостоятельным окном

(3) экземпляр класса Frame обладает свойством модальности

(4) класс Frame предназначен для создания основного окна приложения

Укажите возможный результат выполнения следующего кода:

public abstract class SomeClass implements Runnable {
public final static Object one = new Object(), two = new Object();
public static void main(String s[]) {
Thread t1 = new Thread() {
public void run() {
synchronized (one) {
synchronized (two) {
System.out.print(«1»);
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized (two) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (one) {
System.out.print(«2»);
}
}
}
};
t1.start();
t2.start();
}
}

(1) программа не завершит работу

(2) программа завершит работу, на консоли появится 1

(3) программа завершит работу, на консоли появится 2

(4) программа не завершит работу, на консоли появится 12

(5) программа завершит работу, на консоли появится 12

Какой класс отвечает за загрузку описания классов в память JVM?

(1) Class

(2) ClassLoader

(3) System

(4) Runtime

(5) ни один из перечисленных

Какие утверждения относительно коллекций верны?

(1) все коллекции отличаются внутренними механизмами хранения

(2) все коллекции имеют одинаковую скорость доступа к элементам

(3) во всех коллекциях объекты упорядочены

(4) в некоторых коллекциях допускается дублирование ссылок на объект

(5) классы, обеспечивающие работу с коллекциями появились только в JDK 1.2

Какой класс позволяет вернуть во входной поток считанные из него данные?

(1) ReturnInputStream

(2) BackInputStream

(3) PushInputStream

(4) PushBackInputStream

(5) в Java нет возможности вернуть считанные данные в поток

Какие из перечисленных ниже характеристик относятся к протоколу UDP?

(1) нет гарантий доставки

(2) образование постоянного соединения

(3) протокол сетевого уровня

(4) подтверждений о доставке нет

Какие отношения невозможны между классами?

(1) полиморфизм

(2) наследование

(3) инкапсуляция

(4) ассоциация

(5) агрегация

Отметьте символьные литералы языка Java:

(1) 'a'

(2) 'u0041'

(3) '0xdec'

(4) '1L'

(5) '101'

Выберите какой тип нужно поставить вместо знака ? для переменной d в следующем фрагменте:

int a = 1;
short b = 1;
long c = 1;
? d = a + b;

(1) long

(2) byte

(3) int

(4) char

(5) short

Какие утверждения относительно импорт-выражений верны?

(1) выражение, позволяющее импортировать пакет целиком имеет вид import <полное имя пакета>;

(2) выражение, импортирующее один тип, записывается с помощью ключевого слова import и простого имени типа

(3) можно импортировать один тип

(4) если тип явно импортирован, то невозможно ни объявление нового типа с таким же именем, ни доступ по простому имени к одноименному типу в текущем пакете

(5) import-выражения не позволяют импортировать типы в модуль компиляции и далее обращаться к ним по простым именам

Укажите варианты кода, которые не вызовут ошибки компиляции.

(1)

public void doSomething(int x, final int y) {
x = Math.abs(y);
}

(2)

public void doSomething(int x, final int y) {
y = Math.abs(y);
}

(3)

public void doSomething(int x, final int y) {
x = Math.abs(y);
return;
}

(4)

public void doSomething(int x, final int y) {
x = Math.abs(y);
return x;
}

(5)

public void doSomething(int x, final int y) {
y = Math.abs(x);
return;
}

Укажите результат выполнения следующего кода?

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeChild2();
((SomeClass)c).print();
((SomeChild1)c).print();
((SomeChild2)c).print();
}
public void print() {
System.out.println(«SomeClass»);
}
}
class SomeChild1 extends SomeClass {
public void print() {
System.out.println(«SomeChild1»);
}
}
class SomeChild2 extends SomeClass {
public void print() {
System.out.println(«SomeChild2»);
}
}

(1)

SomeClass
SomeChild1
SomeChild2

(2)

SomeClass
SomeClass
SomeClass

(3)

SomeClass

и сообщение об ошибке

(4)

SomeChild1

и сообщение об ошибке

(5)

SomeChild2

и сообщение об ошибке

Какие утверждения относительно ключевого слова abstract верны?

(1) метод не может одновременно иметь модификаторы abstract и static

(2) можно объявлять переменные типа абстрактный класс

(3) метод может одновременно иметь модификаторы abstract и protected

(4) абстрактный метод может иметь реализацию

(5) наследники, не имеющие модификатора abstract, должны реализовать все абстрактные методы своего абстрактного родителя

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?

public class Vehicle {
public static void main(String[] args) {
Vehicle[] v = new Car[] { new Car()};

}
public void setVehicles(Vehicle c[]) {
c[0] = new Vehicle();
}
public void setVehicles2(Vehicle c[]) {
if (c[0] instanceof Vehicle) {
c[0] = new Car();
}
}
public void setVehicles3(Vehicle c[]) {
if (c[0] instanceof Car) {
c[0] = new Vehicle();
}
}
}
class Car extends Vehicle{}

(1) setVehicles

(2) setVehicles2

(3) setVehicles3

(4) setVehicles и setVehicles3

(5) setVehicles и setVehicles2

Какие меры позволяют Java обеспечивать безопасность?

(1) наличие сборщика мусора

(2) сертификаты для приложений, загружаемых по сети

(3) наличие JIT-компилятора

(4) политики (policy) и разрешения (permission)

(5) встроенные ограничения в стандартных библиотеках

Есть следующая иерархия наследования:

java.lang.Object
|
+—java.lang.Throwable
|
+—java.lang.Exception
|
+—java.lang.RuntimeException
|
+—java.lang.IndexOutOfBoundsException
|
+—java.lang.StringIndexOutOfBoundsException
|
+—java.lang.ArrayIndexOutOfBoundsException

В методе testSomеValue
могут быть возбуждены исключения StringIndexOutOfBoundsException и
ArrayIndexOutOfBoundsException, при этом они не обрабатываются в блокеtry – catch.
Какие из перечисленных ниже утверждений будут верными?

(1) определение метода testSomеValue
может включатьthrows StringIndexOutOfBoundsException,
ArrayIndexOutOfBoundsException

(2) если метод, вызывающий testSomeValue, перехватывает
IndexOutOfBoundsException
, то исключение StringIndexOutOfBoundsException
тоже будет перехватываться

(3) так как в определении метода указано throws
StringIndexOutOfBoundsException
,ArrayIndexOutOfBoundsException, любой вызывающий
его метод должен перехватывать эти типы исключений, вне зависимости от того, возбуждается во время
работы исключение или нет

(4) при объявлении метода testSomeValue надо обязательно указывать возбуждаемые исключения

Может ли быть дважды вызван метод stop у апплета? Методdestroy?

(1) да, да

(2) да, нет

(3) нет, да

(4) нет, нет

Каким будет результат работы следующего кода?

public abstract class SomeClass implements Runnable{
public static Object lock = new Object();
public void lock() {
synchronized (lock) {
try {
lock.wait();
System.out.print(«1»);
} catch (InterruptedException e) {}
}
}
public void notifyThread() {
synchronized (lock) {
lock.notify();
}
}
public void unlock() {
synchronized (lock) {
lock.notify();
System.out.print(«2»);
}
}
public static void main(String s[]) {
final SomeClass c = new SomeClass() {
public void run() {
lock();
notifyThread();
}
};
final SomeClass c1 = new SomeClass() {
public void run() {
unlock();

}
};
new Thread(c).start();
new Thread(c1).start();
}
}

(1) программа не завершит работу, на консоли ничего не появится

(2) программа не завершит работу, на консоли появится 1

(3) программа не завершит работу, на консоли появится 2

(4) программа завершит работу, на консоли появится 12

(5) программа завершит работу, на консоли появится 21

(6) результат трудно предугадать

Какие классы, помогающие взаимодействовать с программным окружением, определены в пакете java.lang?

(1) Process

(2) Thread

(3) RunnableException

(4) SecurityManager

(5) Class

Какие утверждения относительно java.util.Random корректны?

(1) последовательный запуск приложения, генерирующего последовательность псевдослучайных чисел, никогда не вернет одинаковых последовательностей

(2) используется для получения последовательности псевдослучайных чисел

(3) double nextGaussian()— возвращает случайное число в диапазоне от 0.0 до 1.0 распределенное по нормальному закону

(4) void nextBytes(byte[] arr) — заполняет массив arr нулями

Какие методы класса File позволяет различать обычный файл и директорию?

(1) isFileDirectory()

(2) isDirectory()

(3) isByteFile()

(4) isDirectoryFile()

(5) isFile()

Можно ли с помощью класса URL пересылать данные на сервер?

(1) нет

(2) да, всегда

(3) да, если сервер позволяет закачивание (upload) данных

Какие утверждения относительно инкапсуляции верны?

(1) позволяет контролировать корректные значения полей класса

(2) способствует уменьшению количества кода, созданного для описания схожих сущностей

(3) позволяет скрывать реализацию класса

(4) позволяет изменять способ хранения данных

(5) позволяет объектам с одинаковой спецификацией иметь различную реализацию

Какие из перечисленных идентификаторов являются корректными?

(1) _

(2) 3

(3) const

(4) temp

(5) _do

Даны следующие классы:

class abc.SomeClass {}
class abc.SomeClass2 extends abc.SomeClass {}

Что будет выведено на экран в следующем фрагменте кода:

abc.SomeClass x1 = new abc.SomeClass();
abc.SomeClass2 x2 = new abc.SomeClass2();
System.out.println((x1 instanceof abc.SomeClass) + » » + (x2 instanceof abc.SomeClass2));

(1) false false

(2) true true

(3) true false

(4) false true

Что будет выведено на экран в результате выполнения следующего кода?

import java.awt.Point;

public class Obscuring {
static Point Test = new Point(3,2);
public static void main (String s[]) {
System.out.println(Test.x);
}
}
class Test {
static int x = -5;
}

(1) -5

(2) 2

(3) 3

(4) будет выдано сообщение об ошибке

Что будет выведено на экран в результате выполнения следующего кода?

public class SomeClass {
public static void main(String args[]) {
SomeClass2 s = new SomeClass2();
}
public SomeClass() {
System.out.print(«1»);
}
{
System.out.print(«2»);
}
}
class SomeClass2 extends SomeClass {
public SomeClass2() {
System.out.print(«3»);
}
{
System.out.print(«4»);
}
}

(1) 1243

(2) 2143

(3) 1234

(4) 2134

(5) 3421

Укажите результат выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeClass();
c.f1(1, 1);
}
public void f1(Integer i1, Integer i2) {
System.out.println(«1»);
}
public void f1(Integer i1, int i2) {
System.out.println(«2»);
}
public void f1(int b, Integer c) {
System.out.println(«3»);
}
public void f1(long b, long c) {
System.out.println(«4»);
}
}

(1) 1

(2) 2

(3) 3

(4) 4

(5) возникнет ошибка компиляции

Для какого элемента класса работает полиморфизм?

(1) динамические методы

(2) динамические поля

(3) статические поля

(4) статические методы

(5) конструкторы

Какие утверждения относительно клонирования верны?

(1) выражение x.clone().getClass() == x.getClass() должно быть истинным

(2) выражение x == x.clone() должно быть ложным

(3) попытка вызова new Object().clone() не приведет к ошибке

(4) попытка вызова new Object().clone() приведет к ошибке

Какое утверждение относительно автоматического сборщика мусора (garbage collector) верно?

(1) позволяет управлять выделением памяти

(2) является отдельным приложением

(3) удаляет объекты, когда не остается ни одной ссылки на них

(4) ничего из перечисленного

Предположим, нам необходимо создать собственную иерархию исключений.
Рассмотрим следующий пример.

Exception
|
+—LengthException
|
+—TooLongException
|
+—TooShortException

1 class BaseMeasurer{
2 int measureLength(Dimension d) throws TooShortException{..}
3 }
4 class DerivedMeasurer extends BaseMeasurer{
5 ___ {
6 }
7 }

Какое из перечисленных ниже выражений можно использовать в строке 5 вместо знаков подчеркивания, чтобы код успешно
откомпилировался?

(1)
int measureLength(Dimension d) throws TooShortException

(2)
int measureLength(Dimension d) throws LengthException

(3)
int measureLength(Dimension d) throws TooLongException

(4)
int measureLength(Dimension d)

Какие утверждения относительно менеджера компоновки BorderLayout верны?

(1) является стандартным для Window

(2) не меняет размер компонент

(3) разделяет весь контейнер на одинаковые прямоугольные сектора

(4) может изменить высоту и ширину центрального компонента

Каким будет результат работы следующего кода?

public abstract class SomeClass implements Runnable{
private Object lock = new Object();
public void lock() {
synchronized (lock) {
try {
lock.wait();
System.out.print(«1»);
} catch (InterruptedException e) {}
}
}
public void notifyThread() {
synchronized (lock) {
lock.notify();
}
}
public void unlock() {
synchronized (lock) {
lock.notify();
System.out.print(«2»);
}
}
public static void main(String s[]) {
Thread t = new Thread(new SomeClass() {
public void run() {
lock();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
notifyThread();
}
});
t.start();
Thread t1 = new Thread(new SomeClass() {
public void run() {
unlock();
}
});
t1.start();
}
}

(1) программа не завершит работу, на консоли ничего не появится

(2) программа не завершит работу, на консоли появится 2

(3) программа не завершит работу, на консоли появится 1

(4) программа не завершит работу, на консоли появится 21

(5) программа не завершит работу, на консоли появится 12

(6) результат трудно предугадать

Какие классы служат для представления примитивных значений в виде объектов?

(1) Short

(2) String

(3) Integer

(4) Long

(5) Void

Укажите порядок поиска локали fr_CH_UNIX, если текущая локаль — en_US (название базового класса ResourceBundleMyResources)

(1)

MyResources_fr_CH
MyResources_en_US
MyResources_fr
MyResources_en
MyResources

(2)

MyResources_fr_CH
MyResources_fr
MyResources_en_US
MyResources_en
MyResources

(3)

MyResources_fr_CH
MyResources_fr
MyResources

(4)

MyResources_en_US
MyResources_en
MyResources_fr_CH
MyResources_fr
MyResources

(5) ни один из перечисленных

Какой класс соответствует классу DataInputStream, но работает только с символьными данными?

(1) BufferedReader

(2) InputStreamReader

(3) PipedReader

(4) CharArrayReader

(5) нет аналога

С помощью какого класса можно получить ip-адрес сервера по его имени?

(1) URL

(2) Socket

(3) ServerSocket

(4) InetAddress

(5) Web

Какие утверждения относительно метакласса верны?

(1) можно создавать собственные метаклассы

(2) это шаблон, задающий различные классы

(3) в Java есть метакласс Class

(4) в Java есть метакласс Meta

(5) без метакласса нельзя реализовать наследование

Какие утверждения относительно класса java.lang.String верны

(1) породив объект, содержащий некое значение-строку, мы можем изменить данное значение

(2) строковый литерал имеет примитивный тип

(3) экземпляры только этого класса можно создавать без использования ключевого слова new

(4) это единственный класс, который не наследует класс java.lang.Object

(5) каждый строковый литерал порождает экземпляр java.lang.String

Какие формальные нарушения соглашений по именованию присутствуют в следующем примере:

public class Flat{
private int floor_number;
private int roomNumber;
public int rooms() {
return roomNumber;
}
public int getFloorNumber() {
return floor_number;
}
}

(1) имя поля roomNumber необходимо заменить на r

(2) класс назван с заглавной буквы, должно быть flat

(3) имя поля floor_number
содержит два слова, разделенных знаком подчеркивания, должно быть floorNumber

(4) имя метода rooms() необходимо изменить на getRoomNumber()

(5) нет методов, с помощью которых можно изменить значения переменных

Укажите результат выполения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass s = new SomeClass(«5», «6»);
SomeClass s1 = new SomeClass(«10», «12»);
s1.doSomething(s);
System.out.print(s1.x + s1.y + s.x + s.y);
}
private void doSomething(SomeClass s) {
s.x = «5»;
this.y = «6»;
}
public SomeClass(String x, String y) {
this.x = x;
this.y = y;
}
String x, y;
}

(1) 5656

(2) 101256

(3) 10656

(4) будет выведена ошибка компиляции

(5) ни один из перечисленных

Укажите результат выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeClass2();
SomeClass2 c2 = new SomeClass2();
c2.print();
c.print();
}
}
class SomeClass2 extends SomeClass {
public void print() {
System.out.println(«message»);
}
}

(2)

message

и сообщение об ошибке

(3)

message
message

и сообщение об ошибке

(4) сообщение об ошибке

(5) пример не будет скомпилирован

Какое значение появится на консоли после выполнения следующей программы?

class Parent {
public void print() {
System.out.println(x);
}
}
class Child extends Parent {
int x = 3;
public static void main(String[] args) {
Parent c = new Child();
c.print();
}
}

(1) 1

(2) 2

(3) 3

(4) будет выведено сообщение об ошибке

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
int a[] = {1, 2, 3};
int b[] = (int[]) a.clone();
a[0] = 0;
System.out.print(b[0]);
}
}

(1) 0

(2) 0, 2

(3) 1

(4) 1, 2

(5) сообщение об ошибке времени исполнения

Что будет выведено на экран в результате выполнения следующего кода:

public class Test {
public static void main(String[] args) {
Test t = new Test();
t.test();
}
void test() {
Test:{
test:
for (int i = 0; true; i++) {
if (i % 2 == 0) continue Test;
if (i > 10) break Test;
System.out.print(i);
}
}
}
}

(1) 12

(2) 123456789

(3) 13579

(4) 1357

(5) ошибка компиляции

Какие утверждения относительно классов WindowListener и WindowEvent верны?

(1) событие WindowEvent сигнализирует об изменении состояния окна

(2) данные классы можно использовать для инициирования закрытия окна приложения

(3) событие WindowListener отслеживает нажатие клавиш клавиатуры

(4) данные классы можно использовать для отслеживания изменения количества компонент в контейнере

Какие из методов выбрасывают InterruptedException?

(1) sleep

(2) notifyAll

(3) waitAll

(4) wait

(5) yield

Какие утверждения относительно класса Process верны?

(1) является абстрактным классом

(2) не позволяет уничтожить запущенный процесс

(3) объекты этого класса получаются вызовом метода exec() у объекта Runtime, запускающего отдельный процесс

(4) объект этого класса может использоваться для управления процессом и получения информации о нем

Какие утверждения относительно java.util.Comparator корректны?

(1) предназначен для работы с функциями сортировки, требующими в качестве параметра объект типа java.util.Comparator

(2) содержит метод compare(Object obj), возвращающий результат сравнения текущего объекта (this) и объекта obj

(3) в случае равенства объектов вернет значение true

(4) в случае равенства объектов вернет значение 1

(5) позволяет программисту реализовать любой алгоритм сравнения

Какие утверждения относительно сериализации в Java верны?

(1) для исключения поля объекта из сериализации его необходимо объявить с модификатором volatile

(2) если класс впервые реализует Serializable в своей ветке наследования, то его класс-родитель должен иметь доступный конструктор без параметров

(3) для исключения поля объекта из сериализации его необходимо объявить с модификатором transient

Укажите протоколы уровня приложений?

(1) UDP

(2) POP3

(3) DNS

(4) RIP

(5) HTTP

Множественным наследованием называют:

(1) ситуацию, когда у некоторого класса есть более чем один непосредственный наследник

(2) наследование, в котором участвует множество классов (более двух)

(3) отношение наследования, когда некоторый класс наследует свойства и методы сразу нескольких классов

(4) отношение наследования, когда класс-наследник также имеет наследников

Какие операторы есть в языке Java:

(1) ??

(2) ++

(3) /=

(4) equal

Дан следующий класс:

class abc.Point {
abc.Point(int a, int b) {
x = a;
y = b;
}
int x, y;

}

Каков будет результат следующего примера?

abc.Point p1 = new abc.Point(3, 4);
abc.Point p2 = p1;
p1.x = 5;
p1 = new abc.Point(4, 4);
System.out.print(p2.x — p1.x);

(1) -1

(2) 0

(3) 1

(4) будет выдано сообщение об ошибке

(5) ничего из перечисленного

Ниже приведено несколько вариантов записи модуля компиляции. Какой из них корректен, если предполагается описать класс
abc.Point из пакета test.demo, причем класс активно использует классы ru.additional.abc
и несколько классов из пакета java.net?

(1)

package test.demo.*;
import java.net.*;
import ru.additional.abc.*;

(2)

package test.demo;
import java.net;
import ru.additional.abc.*;

(3)

package test.demo;
import java.net.*;
import ru.additional.abc.Point;

(4)

package test.demo;
import java.net.*;
import ru.additional.abc.*;

(5) ни один из перечисленных

Какие варианты кода не приведут к ошибке компиляции?

(1)

public class SomeClass {
public SomeClass(int x, int y) {
this.x = x;
this.y = y;
super();
}
int x, y;
}

(2)

public class SomeClass {
public SomeClass(int x, int y) {
super();
this.x = x;
this.y = y;
}
int x, y;
}

(3)

public class SomeClass {
public SomeClass(int x, int y) {
super();
this.x = x;
this.y = y;
}
public SomeClass() {
super();
this(0, 0);
}
int x, y;
}

(4)

public class SomeClass {
public SomeClass(int x, int y) {
super();
this.x = x;
this.y = y;
}
public SomeClass() {
this(0, 0);
}
int x, y;
}

(5)

public class SomeClass {
public SomeClass(int x, int y) {
this(x, y);
}
int x, y;
}

Какие из следующих присвоений корректны?

(1)
byte c = (char)150;

(2)
byte c = (char)50;

(3)
byte c = 'a';

(4)
byte c = (char)150 + "a";

(5)
byte c = (long)50;

Укажите корректный вариант кода

(1)

interface SomeInterface{}
class SomeClass extends SomeInterface{

(2)

interface SomeInterface{}
interface SomeInterface2 extends SomeInterface{}
class SomeClass implements SomeInterface2{}

(3)

interface SomeInterface{}
interface SomeInterface2 extends SomeInterface{}
class SomeClass implements SomeInterface2 extends SomeInterface {}

(4)

interface SomeInterface{}
interface SomeInterface2 extends SomeInterface{}
class SomeClass implements SomeInterface2, SomeInterface {}

(5)

interface SomeInterface{}
interface SomeInterface2 extends SomeInterface{}
class SomeClass implements SomeInterface extends SomeInterface2 {

Может ли массив основываться на абстрактных классах? Интерфейсах?

(1) да, да

(2) да, нет

(3) нет, да

(4) нет, нет

Какое из следующих утверждений верно?

(1) в Java можно использовать множественное наследование реализаций

(2) в Java можно создавать многопоточные приложения

(3) в Java можно вручную освобождать память, выделенную под объекты

(4) ничего из перечисленного

Есть следующий код:

public class SomeClass {
public static void main(String[] args) {
SomeClass t = new SomeClass();
____
}
private int check(String x, int n) {
if (n == 0) return n;
else if (n == 1) {
if (x != null) return 5;
} else if (n == 2 && x != null) {
if (x.equals(«YES»)) return 3;
else if (x.equals(«NO»)) return 4;
}
return -1;
}
}

Если вместо знаков подчеркивания поместить код вызова метода check, то какое из предложений будет верным?

(1) t.check("ANY",1), в этом случае функция вернет значение 5

(2) t.check("NO",2), в этом случае функция вернет значение 3

(3) t.check("YES",1), в этом случае функция вернет значение -1

(4) t.check("YES",2), в этом случае функция вернет значение 3

(5) t.check("ANY",6), в этом случае функция вернет значение -1

Какой метод нужно переопределить, чтобы реализовать отрисовку внешнего вида компонента?

(1) paint

(2) update

(3) repaint

(4) show

Какое преимущество предоставляет интерфейс Runnable
по сравнению с классом Thread?

(1) позволяет более гибко работать с приоритетами потоков

(2) позволяет классу, содержащему логику работы, наследоваться от других классов

(3) позволяет обойтись без класса Thread

(4) никакого преимущества нет

Для чего нужны классы-обертки?

(1) использование классов-оберток ускоряет работу приложения

(2) при использовании коллекций нельзя использовать значения примитивных типов

(3) переменная класса-обертки может принимать значения null

(4) классы-обертки предоставляют набор статических методов для работы с примитивными типами

В JDK 1.2 введены новые классы и интерфейсы, которые позволяют работать с наборами объектов.
Отметьте те из них, которые являются интерфейсами.

(1) java.util.Map

(2) java.util.TreeMap

(3) java.util.HashMap

(4) java.util.SortedSet

(5) java.util.SortedMap

Какая кодировка используется классом OutputStreamWriter по умолчанию?

(1) используемая кодировка зависит от системы, где запущена Java-машина

(2) спецификацией Java не оговаривается кодировка, используемая по умолчанию,
но точно известно, что jdk, поставляемая Sun, использует KOI-8

(3) UTF-8 независимо от системы, где запущена Java-машина

(4) UTF-16 независимо от системы, где запущена Java-машина

Какие из перечисленных ниже терминов относятся к подуровням второго уровня?

(1) LLC

(2) MAC

(3) TCP

(4) ARP

(5) RIP

Сколько комментариев в следующем примере кода:

int x = 0; /* комментарий // комментарий */
String s = «text/*комментарий*/»;

(1) 1 блочный, 0 строчных

(2) 1 блочный, 1 строчный

(3) 1 блочный, 2 строчных

(4) 2 блочных, 0 строчных

(5) 2 блочных, 1 строчный

Дан следующий класс:

class abc.Point {
abc.Point(int a, int b) {
x = a;
y = b;
}
int x, y;

}

Укажите результат выполнения следующего фрагмента кода:

abc.Point p = new abc.Point(5,3), p1 = p;
System.out.println(p1 == p);

(1) true

(2) false

(3) будет выдано сообщение об ошибке

(4) ничего из перечисленного

Вы создали класс Animal в пакете ru.animal. Где будет храниться бинарный код класса в файловой системе?

(1) ruanimalAnimal.java

(2) ruAnimal.java

(3) ruanimalAnimal.class

(4) ruAnimal.class

(5) ruanimalAnimal

Какие варианты кода не вызовут ошибку компиляции?

(1)

final class Parent {}
class FirstChild extends Parent {}
class SecondChild extends FirstChild {}

(2)

class Parent {}
class FirstChild extends Parent {}
final class SecondChild extends FirstChild {}

(3)

class Parent {}
final class FirstChild extends Parent {}
class SecondChild extends Parent {}

(4)

class Parent {}
final class FirstChild extends Parent {}
class SecondChild extends FirstChild {}

(5)

class Parent {}
final class FirstChild extends Parent {}
class SecondChild extends Object {}

Укажите результат выполнения следующего кода?

long a = 111111111111L;
double f = a;
long b = 11111L;
double d = b;
System.out.println( a == (long) f);
System.out.println( b == (long) d);

(5) будет выведено сообщение об ошибке

Какой из следующих вариантов кода будет скомпилирован без ошибок

(1)

public class SomeClass {
static int a = 5;
static int b = a;
}

(2)

public class SomeClass {
static int a = b;
int b = 5;
}

(3)

public class SomeClass {
static int a = SomeClass.b;
int b = 5;
}

(4)

public class SomeClass {
static int a = SomeClass.b;
static int b = 5;
}

(5)

public class SomeClass {
int a = SomeClass.b;
static int b = 5;
}

Сколько объектов порождается при инициализации массива
new int[3][]?

(1) 1

(2) 2

(3) 3

(4) 4

(5) ни одного, так как код не будет скомпилирован

Виртуальная машина Java (Java Virtual Machine) это —

(1) специальная операционная система

(2) единая среда исполнения для Java-приложений, которая пишется специально для каждой реальной платформы

(3) библиотека, предоставляющая единый API для разных платформ

(4) ничего из перечисленного

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass t = new SomeClass();
t.say(2);
}
private void say(int digit) {
switch (digit) {
case 1:
System.out.print(«ONE»);
break;
case 2:
System.out.print(«TWO»);
case 3:
System.out.print(«THREE»);
break;
default:
System.out.print(«Unknown»);
}
}
}

(1) ONE

(2) TWO

(3) THREE

(4) ONETWO

(5) TWOTHREE

В чем разница между классами List и Choice?

(1) List позволяет просмотреть весь список вариантов значения, а Choice – нет

(2) List допускает выбор нескольких вариантов, а Choice – нет

(3) List одновременно отображает несколько вариантов значения, а Choice – нет

(4) List не позволяет ввести произвольное значение, а Choice – да

Если один поток начал исполнение не synchronized-блока, указав ссылку на некий объект,
может ли другой поток обратиться к полю этого объекта? К методу?

(1) да, да

(2) да, да (если это неsynchronized-метод)

(3) да, нет

(4) нет, да

(5) нет, да (если это неsynchronized-метод)

Какие утверждения относительно класса String верны?

(1) от этого класса можно унаследоваться

(2) является абстрактным

(3) обладает свойством неизменяемости

(4) содержит только статические методы

Какие высказывания относительно java.util.Vector и java.util.Hashtable можно считать корректными?

(1) в Vector могут сохраняться ссылки как на объекты, так и на примитивные типы

(2) ссылки на объекты в Vector хранятся в порядке их добавления

(3) в качестве ключей для Hashtable должны передаваться объекты типа String

(4) ссылки на объекты в Hashtable хранятся в порядке их добавления

(5) и Hashtable, и Vector
являются синхронизированными, чтобы избежать ситуации, когда несколько потоков пытаются получить
доступ к одной и той же коллекции

Какие утверждения относительно класса BufferedInputStream верны?

(1) содержит массив типа int, который служит буфером для считываемых данных

(2) содержит массив байт, который служит буфером для считываемых данных

(3) метод mark() запоминает точку во входном потоке

(4) метод reset() всегда сбрасывает текущую позицию на начало файла

Какие из следующих адресов относятся к подсети класса A?

(1) 14.80.22.5

(2) 172.16.0.1

(3) 120.150.15.3

(4) 240.10.5.5

Зачем нужен полиморфизм?

(1) полиморфизм используется для написания общего кода, который будет
одинаково работать с разными типами данных (объектами разных классов), при условии, что классы, от
которых созданы эти объекты, имеют общего предка

(2) полиморфизм позволяет создавать в одном классе несколько переменных с
одинаковыми именами, но с разным типами данных

(3) полиморфизм необходим в любой программе, использующей ООП. Без него
невозможно написать программу на объектно-ориентированном языке программирования

(4) без полиморфизма нельзя реализовать инкапсуляцию

Отметьте ключевые слова языка Java:

(1) true

(2) private

(3) const

(4) repeat

(5) except

Какие существуют примитивные дробные типы?

(1) long

(2) byte

(3) float

(4) double

(5) char

Какие утверждения относительно модуля компиляции верны?

(1) в модуле компиляции должно быть хотя бы одно import-выражение

(2) объявления верхнего уровня содержат объявления одного или нескольких типов

(3) объявление пакета записывается с помощью ключевого слова package

(4) если в модуле компиляции есть объявление пакета и import-выражения — import-выражения будут идти после объявления пакета

Какие утверждения относительно полей класса верны?

(1) числовое поле ссылочного типа имеет значение по умолчанию null

(2) идентификатор при объявлении становится составным именем поля

(3) идентификатор поля при объявлении становится простым именем поля

(4) final-поле может быть проинициализировано в конструкторе

(5) поля не могут иметь модификатор доступа protected

Какие преобразования не вызовут ошибку компиляции?

(1)

Object o = (String)null;
String s = o;

(2)

Object o = (String)null;
String s = (String)o;

(3)

Object o = null;
String s = (String)o;

(4)

Object o = null;
String s = o;

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "12":

public class SomeClass {
public void perform() {
System.out.print(«1»);
}
public static void main(String[] args) {
SomeClass c = new SomeClass2();
c.perform();
}
}
class SomeClass2 extends SomeClass {
public void perform() {
____
System.out.print(«2»);
}
}

(1) this.perform();

(2) super.perform();

(3) perform();

(4) SomeClass.perform();

(5) ничего подставлять не надо

Какие утверждения относительно приведения массивов верны

(1) преобразования между типами массивов, основанных на различных примитивных типах, запрещены

(2)
A[] можно привести кB[], если A приводится кB, иA,
B – ссылочные типы

(3) массивы не преобразовываются

(4) A[] можно привести кB[], если A
приводится к B

Какие из перечисленных свойств являются общими для программ, написанных на C++ и Java?

(1) поддерживают обращения к физической памяти

(2) компилируются в машинные коды

(3) имеют схожий синтаксис

(4) являются процедурными

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
int i = 0;
do {
if (i > 5) i—;
if (i < 4) i++;
if (i == 5) i++;
i++;
System.out.print(i);
} while (i <= 6);
}
}

(1) 1234

(2) 2458

(3) 245

(4) 2457

(5) ошибка времени выполнения

Какие утверждения относительно классов TextComponent, TextField и TextArea верны?

(1) TextComponent является базовым классом для TextField и TextArea

(2) TextField позволяет вводить и редактировать несколько строк текста

(3) TextArea позволяет вводить и редактировать несколько строк текста

(4) TextArea можно использовать как поле для ввода пароля, когда все символы меняются на какой-то один

Укажите возможный результат выполнения следующего кода:

public abstract class SomeClass implements Runnable {
public final static Object one = new Object(), two = new Object();
public static void main(String s[]) {
Thread t1 = new Thread() {
public void run() {
synchronized (one) {
synchronized (two) {
System.out.print(«1»);
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized (two) {
synchronized (one) {
System.out.print(«2»);
}
}
}
};
t1.start();
t2.start();
}
}

(1) программа не завершит работу, на консоли появится 1

(2) программа не завершит работу, на консоли появится 2

(3) программа не завершит работу, на консоли появится 12

(4) программа завершит работу, на консоли появится 12

Какой класс позволяет приложению взаимодействовать со средой исполнения?

(1) ClassLoader

(2) Class

(3) System

(4) Runtime

(5) ни один из перечисленных

Для чего можно использовать java.util.Collections?

(1) для сортировки элементов списков

(2) для поиска элементов в упорядоченных коллекциях

(3) для получения несинхронизированных вариантов классов-коллекций

(4) для получения синхронизированных вариантов классов-коллекций

Что произойдет, если, используя DataOutputStream, записать в файл значения типов long,int,
byte именно в таком порядке, а считать в обратном, используя DataInputStream?

(1) ошибка на этапе компиляции, так как эти классы можно использовать только со значениями byte[]

(2) ошибка на этапе компиляции, так как эти классы можно использовать только со значениями byte

(3) все пройдет успешно, но полученные значения byte, int и
long могут отличаться от тех, которые были записаны

(4) все пройдет успешно, полученные значения byte, int и
long не будут отличаться от тех, которые были записаны

Какие из перечисленных ниже характеристик относятся к протоколу TCP?

(1) пересылает заново потерянные сегменты

(2) обеспечивает минимальное время доставки пакетов

(3) это протокол сетевого уровня модели OSI

(4) использует соединение для передачи данных

Что такое агрегация?

(1) отношение между классами типа «реализует»

(2) отношение между классами типа «наследует»

(3) отношение между классами типа «содержит»

(4) отношение между классами типа «является»

Отметьте дробные литералы языка Java:

(1) 1L

(2) 7e10

(3) 0x0

(4) 3.14

(5) 1F

Какой тип должна иметь переменная d в следующем фрагменте:

int a = 1;
short b = 1;
long c = 1;
c = (d = a + c) ? a : b;

(1) char

(2) byte

(3) long

(4) int

(5) short

Какие утверждения относительно импорт-выражений верны?

(1) если импортируются типы с одинаковыми простыми именами из разных пакетов, то такая ситуация породит ошибку компиляции

(2) нельзя импортировать один тип

(3) объявления верхнего уровня содержат объявление только одного типа

(4) можно импортировать пакет целиком

(5) выражение, позволяющее импортировать пакет целиком имеет вид import <полное имя пакета>.*;

Укажите правильные варианты объявления метода.

(1) void doSomething(int x, y);

(2) void doSomething(int x, int y);

(3) void doSomething(int x, double y);

(4) void doSomething(int x; double y);

(5) void doSomething(int x; y);

Укажите результат выполнения следующего кода?

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeChild1();
((SomeClass)c).print();
((SomeChild1)c).print();
((SomeChild2)c).print();
}
public void print() {
System.out.println(«SomeClass»);
}
}
class SomeChild1 extends SomeClass {
public void print() {
System.out.println(«SomeChild1»);
}
}
class SomeChild2 extends SomeClass {
public void print() {
System.out.println(«SomeChild2»);
}
}

(1)

SomeClass
SomeChild1
SomeChild2

(2)

SomeClass
SomeClass
SomeClass

(3)

SomeClass

и сообщение об ошибке

(4)

SomeChild1
SomeChild1

и сообщение об ошибке

(5)

SomeClass
SomeClass

и сообщение об ошибке

Какие утверждения относительно ключевого слова abstract верны?

(1) класс не может одновременно иметь модификаторы abstract и final

(2) метод может одновременно иметь модификаторы abstract и final

(3) класс может не быть абстрактным, если у него есть абстрактные методы

(4) класс может быть абстрактным, если у него нет абстрактных методов

(5) метод не может одновременно иметь модификаторы abstract и private

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?

public class Vehicle {
public static void main(String[] args) {
Vehicle[] v = new Car[] { new Car()};

}
public void setVehicles(Vehicle c[]) {
c[0] = new Vehicle();
}
public void setVehicles2(Vehicle c[]) {
if (c[0] instanceof Car) {
c[0] = new Vehicle();
}
}
public void setVehicles3(Vehicle c[]) {
if (c[0] instanceof Vehicle) {
c[0] = new Car();
}
}
}
class Car extends Vehicle{}

(1) setVehicles

(2) setVehicles2

(3) setVehicles3

(4) setVehicles и setVehicles3

(5) setVehicles и setVehicles2

На какие направления разделяется платформа Java 2?

(1) Standard Edition

(2) Extended Edition

(3) Enterprise Edition

(4) Micro Edition

(5) Minimal Edition

Что будет выведено на экран в результате выполнения следующего кода:

public class Test {
public static void main(String[] args) {
Test t = new Test();
t.test();
}
void test() {
Test:{
test:
for (int i = 0; true; i++) {
if (i % 2 == 0) continue test;
if (i > 10) break test;
System.out.print(i);
}
}
}
}

(1) 12

(2) 123456789

(3) 13579

(4) 1357

(5) ошибка времени исполнения

Какие утверждения относительно обработки пользовательских событий в AWT верны?

(1) нельзя удалять добавленных слушателей

(2) классы сообщений содержат вспомогательную информацию

(3) для удаления слушателей предназначены методы removeXXXListener()

(4) слушатели периодически опрашивают наблюдаемый объект на предмет изменения состояния

Какие из методов выбрасывают InterruptedException?

(1) wait

(2) notifyAll

(3) yield

(4) sleep

Какие утверждения относительно класса System верны?

(1) предоставляет доступ к стандартному выводу, доступному через переменную System.out

(2) позволяет перенаправлять стандартный ввод

(3) позволяет получить все свойства, определенные в системе

(4) не позволяет перенаправлять поток вывода сообщений об ошибках

(5) некоторые методы этого класса позволяют приложению проверять, является ли операция допустимой в данном контексте

Какие утверждения относительно java.util.Arrays корректны?

(1) позволяет получить синхронизированную версию массива

(2) обеспечивает набор методов для выполнения операций над массивами

(3) позволяет получить список фиксированного размера, основанный на массиве

(4) позволяет сохранить массив в поток вывода

(5) позволяет сравнивать массивы примитивных типов

Какие утверждения относительно сериализации в Java верны?

(1) сериализованный объект – это последовательность байт

(2) объект сериализуется и записывается в выходной поток с помощью метода writeExternal()

(3) для того, чтобы объект мог быть сериализован, класс, от которого он порожден, должен реализовывать интерфейс Serializable

(4) чтобы начать сериализацию объекта, нужен выходной поток OutputStream

(5) для успешной десериализации не обязательно наличие описание класса

Укажите протоколы уровня приложений?

(1) FTP

(2) ARP

(3) HTTP

(4) TCP

(5) SMTP

Какие утверждения относительно наследования верны?

(1) позволяет отделять внутреннее представление класса от внешнего

(2) позволяет скрывать реализацию класса

(3) может быть множественным

(4) способствует уменьшению количества кода, созданного для описания схожих сущностей

Какие операторы есть в языке Java:

(1) ==

(2) ===

(3) !!

(4) +=

Дан следующий класс:

class abc.Point {
abc.Point(int a, int b) {
x = a;
y = b;
}
int x, y;

}

Укажите результат выполнения следующего фрагмента кода:

abc.Point p = new abc.Point(5,3), p1;
p1 = p;
p = null;
System.out.println(p.x);

(1) 3

(2) 4

(3) 5

(4) будет выдано сообщение об ошибке

(5) ничего из перечисленного

Ниже приведено несколько вариантов записи модуля компиляции. Какой из них корректен, если предполагается описать класс
abc.Point из пакета test.demo, причем класс активно использует классы ru.additional.abc.Point
и несколько классов из пакета java.net?

(1)

package test.demo;
import java.net.*;
import ru.additional.abc.Point;

(2)

package test.demo;
import java.net.*;
import ru.additional.abc.*;

(3)

package test.demo;
import ru.additional.abc.Point;
import java.net;

(4)

package test.demo.*;
import java.net.*;
import ru.additional.abc.Point;

(5) ни один из перечисленных

Какие утверждения относительно конструкторов класса верны?

(1) чтобы обратиться к конструктору родительского класса необходимо использовать ключевое слово super

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

(3) конструктор не может генерировать исключения

(4) выражение super может стоять на любой строке конструктора

(5) если в классе не объявлен ни один конструктор, компилятор добавляет один по умолчанию

Какие из следующих присвоений корректны?

(1)
short s = (short)(2 + 3);

(2)
byte b2 = 200;

(3)
byte c = (int)150 + 'a';

(4)
char c = (byte)5 + 'a';

(5)
byte c = (char)5 + 'a';

Укажите корректный вариант кода

(1)

abstract interface SomeInterface{}
interface SomeInterface2 implements SomeInterface{}

(2)

private interface SomeInterface{}
interface SomeInterface2 extends SomeInterface{}

(3)

interface SomeInterface{}
final interface SomeInterface2 extends SomeInterface{}

(4)

interface SomeInterface{}
abstract interface SomeInterface2 extends SomeInterface{}

(5) ни один из перечисленных

От какого класса наследуются классы двумерных массивов?

(1) особый класс для массивов

(2) Object

(3) от классов одномерных массивов

(4) ни от какого

Какие меры позволяют Java обеспечивать безопасность?

(1) наличие выражения deprecated

(2) сертификаты для приложений, загружаемых по сети

(3) политики (policy) и разрешения (permission)

(4) наличие JIT-компилятора

Есть следующая иерархия наследования:

java.lang.Object
|
+—java.lang.Throwable
|
+—java.lang.Exception
|
+—java.lang.RuntimeException
|
+—java.lang.IndexOutOfBoundsException
|
+—java.lang.StringIndexOutOfBoundsException
|
+—java.lang.ArrayIndexOutOfBoundsException

В методе testSomеValue
могут быть возбуждены исключения StringIndexOutOfBoundsException и
ArrayIndexOutOfBoundsException, при этом они не обрабатываются в блокеtry – catch.
Какое из перечисленных ниже утверждений будет верным?

(1) определение метода testSomеValue
должно включатьthrows StringIndexOutOfBoundsException,
ArrayIndexOutOfBoundsException

(2) если метод, вызывающий testSomeValue, перехватывает
StringIndexOutOfBoundsException
, то исключение ArrayIndexOutOfBoundsException
тоже будет перехватываться

(3) так как в определении метода указано throws
StringIndexOutOfBoundsException
,ArrayIndexOutOfBoundsException, любой вызывающий
его метод может перехватывать эти типы исключений, вне зависимости от того, возбуждается во время
работы исключение или нет

(4) при объявлении метода testSomeValue можно указывать возбуждаемые исключения

Может ли быть дважды вызван метод init у апплета? Методstart?

(1) да, да

(2) да, нет

(3) нет, да

(4) нет, нет

Каким будет результат работы следующего кода?

public abstract class SomeClass implements Runnable{
public Object lock = new Object();
public void lock() {
synchronized (lock) {
try {
lock.wait();
System.out.print(«1»);
} catch (InterruptedException e) {}
}
}
public void notifyThread() {
synchronized (lock) {
lock.notify();
}
}
public void unlock() {
synchronized (lock) {
lock.notify();
System.out.print(«2»);
}
}
public static void main(String s[]) {
final SomeClass c = new SomeClass() {
public void run() {
lock();
}
};
final SomeClass c1 = new SomeClass() {
public void run() {
unlock();
c.notifyThread();
}
};
new Thread(c).start();
new Thread(c1).start();
}
}

(1) программа не завершит работу, на консоли ничего не появится

(2) программа завершит работу, на консоли появится 12

(3) программа завершит работу, на консоли появится 21

(4) программа не завершит работу, на консоли появится 1

(5) результат трудно предугадать

Классы каких базовых исключений определены в пакете java.lang?

(1) RunnableException

(2) Error

(3) Fatal

(4) Exception

(5) Throwable

Какие утверждения относительно java.util.BitSet корректны?

(1) предназначен для работы с последовательностями байтов

(2) метод int length() возвращает «логический» размер набора битов

(3) значения, возвращаемые методами int length() и int size() всегда совпадают

(4) cодержимое экземпляра класса BitSet может быть модифицировано содержимым другого экземпляра с использованием арифметических операций

(5) количество памяти, занимаемой последовательностью может динамически изменяться

Какие утверждения относительно объекта класса File верны?

(1) для создания объекта неважно, существует ли такой файл на диске

(2) не может указывать на каталог

(3) имеет специальный метод для получения расширения файла

(4) для работы с содержимым файла можно получить экземпляры FileI/OStream

Каким классом лучше воспользоваться для рассылки сигналов точного времени?

(1) URL

(2) Socket

(3) DatagramSocket

(4) TimeSocket

Какие преимущества дает обеспечение доступа к свойствам класса только через его методы?

(1) можно контролировать корректные значения полей класса

(2) способствует уменьшению количества кода, созданного для описания схожих сущностей

(3) можно изменить способ хранения данных

(4) программный код, написанный с использованием данного принципа, легче отлаживать

(5) облегчает реализацию полиморфизма

Какие из перечисленных идентификаторов являются корректными?

(1) int

(2) 1a

(3) _

(4) __$

(5) $a

Даны следующие классы:

class SomeClass {}
class SomeClass2 extends SomeClass {}

Что будет выведено на экран в следующем фрагменте кода:

SomeClass x1 = new SomeClass();
SomeClass2 x2 = new SomeClass2();
System.out.println((x1 instanceof SomeClass2) + » » + (x2 instanceof SomeClass2));

(1) false false

(2) true false

(3) true true

(4) false true

Корректен ли объявленный ниже класс? Если нет, то как его можно исправить?

class Box {
private int weight=0;
public int getWeight() {
return weight;
}
void setWeight(int weight) {
this.weight=weight;
}
}

(1) пример корректен, ничего исправлять не нужно

(2) пример некорректен, конфликт имен в методе setWeight
требует переименования поля или аргумента

(3) пример корректен, однако конфликт имен в методе setWeight
требует переименования поля или аргумента

(4) пример корректен, однако конфликт имен в методе setWeight
требует переименования поля или аргумента, либо использования ключевого слова this

(5) пример корректен, однако конфликт имен в методе setWeight
требует переименования поля или аргумента, либо использования ключевого слова this или super

Какие утверждения относительно инициализаторов класса верны?

(1) инициализаторы могут быть унаследованы

(2) если в классе есть несколько инициализаторов, то порядок их вызова не определен

(3) если в классе есть два конструктора и один из них вызывается из второго, то инициализатор будет вызван только один раз

(4) при вызове конструктора сначала выполняется код инициализатора, а потом код конструктора

(5) инициализатор может иметь имя

Укажите результат выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeClass();
c.f1(1, 1);
}
public void f1(int b, long c) {
System.out.println(«1»);
}
public void f1(long b, int c) {
System.out.println(«2»);
}
public void f1(int b, int c) {
System.out.println(«3»);
}
public void f1(long b, long c) {
System.out.println(«4»);
}
}

(1) 1

(2) 2

(3) 3

(4) 4

(5) возникнет ошибка компиляции

Какое значение появится на консоли после выполнения следующей программы?

class Parent {
int x = 2;
public void print() {
System.out.println(x);
}
}
class Child extends Parent {
int x = 3;
public static void main(String[] args) {
new Child().print();
}
}

(1) 0

(2) 2

(3) 3

(4) будет выведено сообщение об ошибке

Какие утверждения относительно клонирования верны?

(1) для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс Cloneable

(2) массивы не реализуют интерфейс Cloneable

(3) выражение x == x.clone() может быть ложным

(4) возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы

(5) выражение x.clone().getClass() == x.getClass() может быть ложным

Автоматический сборщик мусора (garbage collector) в Java – это механизм, который:

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

(2) удаляет объекты, когда не остается ни одной ссылки на них

(3) удаляет объекты, которые давно не используются

(4) удаляет объекты, которые программист помечает для удаления

Предположим, нам необходимо создать собственную иерархию исключений.
Рассмотрим следующий пример.

Exception
|
+—LengthException
|
+—TooLongException
|
+—TooShortException

1 class BaseMeasurer{
2 int measureLength(Dimension d) throws TooLongException{..}
3 }
4 class DerivedMeasurer extends BaseMeasurer{
5 ___ {
6 }
7 }

Какое из перечисленных ниже выражений можно использовать в строке 5 вместо знаков подчеркивания, чтобы код успешно
откомпилировался?

(1)
int measureLength(Dimension d) throws LengthException

(2)
int measureLength(Dimension d) throws Exception

(3)
int measureLength(Dimension d) throws TooLongException

(4)
int measureLength(Dimension d) throws TooShortException

Какие утверждения относительно менеджера компоновки FlowLayout верны?

(1) является стандартным для Window

(2) не меняет размер компонент

(3) разделяет весь контейнер на одинаковые прямоугольные сектора

(4) располагает компоненты один за другим в линию

Каким может быть результат работы следующего кода?

public abstract class SomeClass implements Runnable{
private Object lock = new Object();
public void lock() {
synchronized (lock) {
try {
System.out.print(«1»);
lock.wait();
} catch (InterruptedException e) {}
}
}
public void unlock() {
synchronized (lock) {
lock.notify();
System.out.print(«2»);
}
}
public static void main(String s[]) {
new Thread(new SomeClass() {
public void run() {
lock();
}
}).start();
new Thread(new SomeClass() {
public void run() {
unlock();
}
}).start();
}
}

(1) программа не завершит работу, на консоли ничего не появится

(2) программа не завершит работу, на консоли появится 1

(3) программа не завершит работу, на консоли появится 2

(4) программа не завершит работу, на консоли появится 12

(5) программа не завершит работу, на консоли появится 21

Какие классы, необходимые для поддержки многопоточности, определены в пакете java.lang?

(1) Process

(2) Thread

(3) RunnableException

(4) ThreadGroup

(5) RuntimeException

Укажите порядок поиска локали fr_CH, если текущая локаль — en_US (название базового класса ResourceBundleMyResources)

(1)

MyResources_fr_CH
MyResources_fr
MyResources

(2)

MyResources_en_US
MyResources_en
MyResources
MyResources_fr
MyResources_fr_CH

(3)

MyResources_fr
MyResources_fr_CH
MyResources_en
MyResources_en_US
MyResources

(4)

MyResources_fr_CH
MyResources_fr
MyResources_en_US
MyResources_en
MyResources

(5) ни один из перечисленных

Какой класс соответствует классу CharArrayReader, но работает только с байтовыми данными?

(1) FilterInputStream

(2) BufferedInputStream

(3) ByteInputStream

(4) ByteArrayInputStream

(5) нет аналога

Какой класс используется для работы с протоколом UDP?

(1) URL

(2) Socket

(3) DatagramSocket

(4) ServerSocket

(5) Web

Метакласс это:

(1) базовый класс в дереве наследования. Все потомки этого класса расширяют или замещают его функциональность

(2) некоторый шаблон, который описывает свойства и поведение класса, подобно тому, как класс описывает свойства и поведение объекта

(3) класс, от которого наследуются все классы в дереве наследования. Любой из классов в программе обязательно является наследником этого класса (пример java.lang.Object)

(4) некоторый шаблон, который описывает поведение класса, но не описывает его свойства

Каким будет результат следующих действий?

System.out.println(1/0);
System.out.println(1./0);
System.out.println(1/0.);
System.out.println(1./0.);
System.out.println(‘n’+’r’);

(1) все 4 операции деления вызовут ошибку деления на 0, сложение даст «nr»

(2) результатом всех 4 операций деления будетPOSITIVE_INFINITY, сложение даст 'nr'

(3) операция 1/0 приведет к арифметической ошибке;следующие 3 операции будут иметь результат POSITIVE_INFINITY

(4) операция 1/0 приведет к арифметической ошибке;следующие 3 операции будут иметь результат
POSITIVE_INFINITY последнее сложение даст 'nr'

Какие утверждения относительно метода public boolean equals(Object obj) класса java.lang.Object верны

(1) не может быть переопределен

(2) в классе java.lang.Object метод public boolean equals(Object obj) возвращает результат сравнения по ссылке

(3) может быть переопределен для сравнения по значению

(4) всегда возвращает результат сравнения по ссылке

Какие формальные нарушения соглашений по именованию присутствуют в следующем примере:

public class flat{
private int floorNumber;
private int roomNumber;
public int rooms() {
return roomNumber;
}
public int GetFloorNumber() {
return floorNumber;
}
}

(1) имя метода rooms() необходимо изменить на getRoomNumber()

(2) имя поля roomNumber необходимо заменить на r

(3) класс назван со строчной буквы, должно быть Flat

(4) нет методов, с помощью которых можно изменить значения переменных

(5) имя метода GetFloorNumber() необходимо изменить на getFloorNumber()

Укажите правильные варианты объявления перегруженных методов.

(1)

public int doSomething(int a) {return 5;}
public double doSomething() {return 5;}

(2)

public int doSomething(int a) {return 5;}
public double doSomething(int a) {return 5;}

(3)

public int doSomething(int a) {return 5;}
private double doSomething(int b) {return 5;}

(4)

public int doSomething(int a) {return 5;}
private double doSomething(int a, int b) {return 5;}

На объект какого типа будет ссылаться переменная c?

public class SomeClass {
public static void main(String[] args) {
SomeClass c = new SomeClass2();
}
}
class SomeClass2 extends SomeClass {}

(1) Object

(2) SomeClass

(3) SomeClass2

(4) пример не будет скомпилирован

Какое значение появится на консоли после выполнения следующей программы?

class Parent {
static int x = 2;
static public void print() {
System.out.println(x);
}
}
class Child extends Parent {
static int x = 3;
public static void main(String[] args) {
Parent c = new Child();
c.print();
}
}

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
public static void main(String[] args) {
int a[][] = {{1, 2}, {3}};
int b[][] = (int[][]) a.clone();
a[0] = new int[]{0};
System.out.println(b[0][0]);
}
}

(1) 0

(2) 0, 2

(3) 1

(4) 1, 2

(5) сообщение об ошибке времени исполнения

Что будет выведено на экран в результате выполнения следующего кода:

public class SomeClass {
static int x;
public static void main(String[] args) {
SomeClass s = new SomeClass();
s.test(5);
System.out.println(x);
}
private void test(int x) {
this.x = x + 5;
System.out.print(x);
}
}

(1) 55

(2) 510

(3) 105

(4) 1010

(5) сообщение об ошибке компиляции

Как установить размер компонента AWT?

(1) setSize(10, 20)

(2) setSize(d), где d — переменная класса java.awt.Dimension

(3) setSize(r), где r — переменная класса java.awt.Rect

(4) setDimension(d), где d — переменная класса java.awt.Dimension

Какие преимущества дает многопоточная архитектура?

(1) упрощается программа, если ее алгоритм требует выполнения нескольких
действий одновременно (например, обслуживание запросов)

(2) программа выполняется быстрее

(3) можно более полно использовать аппаратные ресурсы для каждой задачи

(4) если различные задачи требуют разных аппаратных ресурсов, причем, все они
могут управляться центральным процессором без перегрузки, то за счет распределенной работы суммарное
время выполнения уменьшится

(5) за счет управления приоритетами потоков можно настроить систему так, что,
выполняя меньшее количество действий, она будет совершать больше полезной работы для пользователя

(6) за счет управления приоритетами потоков можно добиться ускорения работы
программы

Какие методы, необходимые для поддержки многопоточности, есть в классе Object?

(1) public void synchronize()

(2) public void notify()

(3) public void notifyAll()

(4) public void wait()

(5) public void run()

От какого класса наследуются InputStream иOutputStream?

(1) IOStream

(2) AbstractStream

(3) IOWriter

(4) Object

Назовите сете-независимые уровни модели OSI

(1) уровень передачи данных

(2) представительский уровень

(3) сессионный уровень

(4) физический уровень

(5) сетевой уровень

(6) уровень приложений

Что из перечисленного является преимуществом ООП?

(1) обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов

(2) обеспечение возможности создавать не зависящие от платформы программы

(3) повышение скорости выполнения программ

(4) обеспечение возможности повторного использования отдельных компонентов программного обеспечения

Какие утверждения относительно кодировки Unicode верны?

(1) представляет символы кодом из 2 байт

(2) является синонимом кодировки ASCII

(3) представляет символы кодом из 1 байта

(4) значение u1B05 является допустимым значением Unicode

(5) значение 'ub105' является допустимым значением Unicode

Какие варианты объявления дробной переменной верны (никакие переменные предварительно не объявлены)?

(1) float a;

(2) float a = "4";

(3) float a = 5, b = a;

(4) float a = b = 5;

Какое из перечисленных ниже имен является простым?

Object
java.lang
lang
java.lang.Object

(1) Object

(2) java.lang

(3) lang

(4) java.lang.Object

Какие модификаторы позволяют обращаться к элементу класса из классов-наследников в другом пакете?

(1) public

(2) protected

(3) по умолчанию

(4) private

Укажите количество преобразований, которые будут сделаны в следующем коде:

long a = 3;
a = 5 + ‘A’ + a;
System.out.print(«a = » + a);

Предположим, вы моделируете автомобиль, описывая его свойства в формате Java-класса. Какие из
следующих полей нужно объявить статическими?

(1) идентификационный номер (VIN)

(2) максимально допустимая масса для этого класса автомобилей

(3) дата начала выпуска автомобилей

(4) дата выпуска автомобиля

Сколько ошибок компиляции и ошибок времени выполнения в следующем примере?

int b[] = new int[5];
for (int i = 0; i < b.length(); i++) {
b[i] = Math.sqrt(i);
}

(1) 1

(2) 2

(3) 3

(4) 4

(5) 5

Приведенная ниже программа должна вывести на консоль Hello World! Выберите строки, которые нужно модифицировать в вашей программе, чтобы получить правильный результат.

1 public class SomeClass {
2 public static void main(String[] args) {
3 String[] arr = {«H», «e», «l», «l», «o», » «, «W», «o», «r», «l», «d», «!»};
4 String result = «»;
5 int i = 0;
6 …
7 System.out.print(arr[i]);
8 }
9 }

(1) заменить строку 6 на for(; i < arr.length;)

(2) заменить строку 6 на for(i = 0; i < arr.length;)

(3) заменить строку 6 на for(i = 0; i < arr.length; i++)

(4) заменить строку 6 на for(i = 0; i < arr.length-1; i++)

Какие утверждения относительно класса java.awt.Container верны?

(1) процесс отрисовки инициализируется самим контейнером

(2) контейнер своим методом paint отрисовывает себя и все вложенные в него компоненты

(3) компоненты отрисовываются в произвольном порядке

(4) для удаления всех компонентов из контейнера служит метод removeAll()

Какая функция класса Thread запускает поток?

(1) run()

(2) begin()

(3) init()

(4) start()

(5) go()

Какие утверждения относительно метода equals верны?

(1) для любой объектной ссылки x, отличной от null, вызов x.equals(x) возвращает true

(2) реализация этого метода в классе Object вернет true только в случае равенства по значению

(3) для любых объектных ссылок x и y, вызов x.equals(y) возвращает true только в том случае, если вызов y.equals(x) возвращает true

(4) для любой не равной null объектной ссылки x вызов x.equals(null) должен вернуть значение false

Какие утверждения относительно класса SimpleTimeZone верны?

(1) предназначен для применения в настройках, использующих Юлианский календарь

(2) не имеет открытых конструкторов

(3) позволяет задавать нестандартные настройки перехода на летнее и зимнее время

(4) может быть получен с помощью метода TimeZone.getDefault()

Что произойдет при создании экземпляра класса FileOutputStream, если ассоциированный файл не существует?

(1) ничего не произойдет, но перед записью данных в файл его надо создать с помощью специального метода класса FileOutputStream

(2) будет сгенерирована ошибка, но можно будет продолжить работу и создать файл с помощью специального метода класса FileOutputStream

(3) будет сгенерирована ошибка, дальнейшая работа с экземпляром класса FileOutputStream будет невозможна

(4) файл будет автоматически создан

(5) ничего не произойдет, но перед записью данных в файл он будет автоматически создан

Расположите следующие средства передачи данных по скорости и надежности (по возрастанию):

1 — Коаксиальный кабель
2 — Оптоволокно
3 — Телефонный кабель
4 — Витая пара

(1) 1,2,3,4

(2) 1,3,4,2

(3) 3,1,4,2

(4) 4,3,1,2

(5) 1,4,3,2

Какие утверждения относительно объектов верны?

(1) объект — это понятие, абстракция или любой предмет с четко очерченными границами

(2) объекты могут быть неуникальными

(3) объект имеет определенное время жизни

(4) объект имеет состояние

(5) объекты можно создавать, но нельзя уничтожить

Какой из вариантов является блочным комментарием?

(1) // комментарий

(2) /* комментарий */

(3) /** комментарий */

(4) //* комментарий

(5)

/* коментарий 1
коментарий 2 */

Укажите результат выполнения следующего фрагмента кода:

int a = 5, b = 6;
a = b++;
System.out.println(++a == b++);

(1) true

(2) false

(3) будет выдано сообщение об ошибке

(4) ничего из перечисленного

Какое утверждение относительно пакетов в Java верно?

(1) разные пакеты могут разделять одно пространство имен

(2) пакеты, вложенные в один и тот же пакет, не имеют никаких дополнительных связей между собой

(3) пакеты, вложенные в один и тот же пакет, имеют дополнительные связи между собой

Какие модификаторы доступа можно применить для типов объявления верхнего уровня?

(1) private

(2) default

(3) protected

(4) public

Какие утверждения относительно преобразования примитивных типов верны?

(1) сужение — это переход от менее емкого типа к более емкому

(2) преобразование от типа char к типу byte является сужающим

(3) при сужении целочисленного типа к более узкому целочисленному все старшие биты, не попадающие в новый тип, просто отбрасываются

(4) тип byte можно привести к типу int без потери данных

(5) компилятор может осуществить сужающее преобразование самостоятельно

Какой из следующих вариантов кода выведет на экран "perform"?

(1)

public class SomeClass {
static void perform() {
System.out.println(«perform»);
}
private SomeClass c;
public static void main(String[] args) {
SomeClass.perform();
}
}

(2)

public class SomeClass {
void perform() {
System.out.println(«perform»);
}
private SomeClass c;
public static void main(String[] args) {
SomeClass.perform();
}
}

(3)

public class SomeClass {
static void perform() {
System.out.println(«perform»);
}
private SomeClass c;
public static void main(String[] args) {
SomeClass.c.perform();
}
}

(4)

public class SomeClass {
void perform() {
System.out.println(«perform»);
}
private static SomeClass c;
public static void main(String[] args) {
SomeClass.c.perform();
}
}

(5) ни один из перечисленных

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?

public class SomeClass {
public static void main(String[] args) {
____
for (int i = 0; i < b.length; i++) {
System.out.print(b[i]);
}
}
}

(1) int b[3] = new int[] {0,0,0};

(2) int b[] = new int[3] {0,0,0};

(3) int b[] = new int[] {0,0,0};

(4) int b[3] = new int[3] {0,0,0};

(5) int b[] = new {0,0,0};

When i try to clone a generic Object i get compile time error . why?

    Object obj=new Object();
    obj.clone();  // Here compile time error "The method clone() from the type Object is not visible"

Every class extends Object class and clone method is protected in Object class.

protected methods can be accessed in same package as well as by subclasses and all classes are child of java.lang.Object.

asked Jul 5, 2012 at 12:56

amicngh's user avatar

1

Because clone is protected in the Object class. It’s not public.

The only way to get access to an object’s clone() method is to know it has a compile-time type that has a public clone() method.

answered Jul 5, 2012 at 12:57

Louis Wasserman's user avatar

Louis WassermanLouis Wasserman

188k25 gold badges334 silver badges406 bronze badges

3

This will be the minimum to get clone working:

public class SubObj implements Cloneable {
  public Object clone() { return super.clone(); }
}

answered Jul 5, 2012 at 13:01

Marko Topolnik's user avatar

Marko TopolnikMarko Topolnik

193k27 gold badges309 silver badges425 bronze badges

Per the Java SE docs:

The class Object does not itself implement the interface Cloneable, so
calling the clone method on an object whose class is Object will
result in throwing an exception at run time.

answered Jul 5, 2012 at 12:59

Steve Townsend's user avatar

Steve TownsendSteve Townsend

53.1k9 gold badges91 silver badges139 bronze badges

4

protected fields can be accessed only from inside the same package, thus clone() method of Object class can be accessed only from any class that is located in java.lang package.

answered Jul 5, 2012 at 13:01

Eng.Fouad's user avatar

Eng.FouadEng.Fouad

114k70 gold badges312 silver badges413 bronze badges

You must explicitely implements Cloneable interface.
see this thread which give explanations.

answered Jul 5, 2012 at 12:58

Arcadien's user avatar

ArcadienArcadien

2,26016 silver badges26 bronze badges

If you use Groovy so that you can bypass the java compilation error, you get this:

Exception in thread "main" java.lang.CloneNotSupportedException: java.lang.Object
    at java.lang.Object.clone(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
    at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:766)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:754)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:198)
    at regexTests.main(regexTests.groovy:19)
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

If you read the clone API (I will link it) it says that if the Interface isn’t implemented, then calling *.clone() will throw a CloneNotSupportedException.

Link to the clone API for java.lang.Object
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29

[EDIT]
The Original Question™ asked for why this method is visible in the way it is. This is because it only accessible to methods within the java.lang package. It isn’t intended for a programmer to be able to clone an Object. Throwing a CloneNotSupportedException is exactly what you want to do if you don’t want your OWN object cloned.

answered Jul 5, 2012 at 13:08

avgvstvs's user avatar

avgvstvsavgvstvs

6,1166 gold badges43 silver badges73 bronze badges

 void method() {

    Object obj=new Object(); //Object is a parent class, it's not inherit from any other class...     
    obj.clone();        //  compile time error   

}

We can’t access the protected method of «Has A» relationship from different package, because your Class package is (com.xxx.yyy) and an Object class package is (java.lang) both the classes are in different package.

protected methods can be accessed in same package as well as by subclasses(IS A relationship)

BetaRide's user avatar

BetaRide

15.8k29 gold badges92 silver badges172 bronze badges

answered Aug 12, 2014 at 7:00

Ratheesh's user avatar

RatheeshRatheesh

6118 silver badges8 bronze badges

I tried this code :

public final class User {


    private String name;
    private boolean isActive;
    private String userId;
    private Address address;


    // can be constructed using this constructor ONLY !
    public User(String name, boolean isActive, String userId, Address address) {
        this.name = name;
        this.isActive = isActive;
        this.userId = userId;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public boolean isActive() {
        return isActive;
    }

    public String getUserId() {
        return userId;
    }

    public Address getAddress() {
        return address;
    }

    protected Object cloneMe() throws CloneNotSupportedException {
        return super.clone(); // throws CloneNotSupportedException
    }
}

public class CloneNotSupportedException
extends Exception

Thrown to indicate that the clone method in class Object has been
called to clone an object, but that the object’s class does not
implement the Cloneable interface. Applications that override the
clone method can also throw this exception to indicate that an object
could not or should not be cloned.

Object doesn’t implement any interface and to make my User class work it must implement Cloneable

answered Feb 17, 2016 at 14:00

Adelin's user avatar

AdelinAdelin

17.5k25 gold badges111 silver badges159 bronze badges

Object class clone() method has modified by protected access modifier in the API level. So we can’t access it anywhere without inheritance. So before we invoke object class clone() method you need to implements Cloneable interface. Then Code will run at runtime properly. Otherwise it will generate CloneNotSupportedException at runtime.

/*Subclass is my implementing class */

public class SubClass implements Cloneable {

    @Override
    public SubClass clone() throws CloneNotSupportedException {
        return (SubClass) super.clone();
    }
}

ChrisMM's user avatar

ChrisMM

8,23612 gold badges31 silver badges47 bronze badges

answered Dec 8, 2019 at 2:19

Manoj Ekanayaka's user avatar

import java.util.Scanner;
import java.util.jar.Attributes.Name;
import java.util.Arrays;
public class Main{
    public class man{
        protected void name() {
            System.out.println("hei");
        }
    }
    public class people extends man{
        public int age;

        public int getAge() {
            name();
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "people [age=" + age + "]";
        }
        
        public Object myclone() throws CloneNotSupportedException {
            return this.clone();
        }
    }
    
    public void test() throws CloneNotSupportedException {
        
        people p1 = new people();
        p1.setAge(10);
        System.out.println(p1);
//      NG:
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();
        p1.setAge(10);
        System.out.println(p1);
        System.out.println(p2);
    }
    public static void main(String args[]) throws CloneNotSupportedException{
        new Main().test();
        
    }
}

see the NG code and ok code.

//      NG for:The method clone() from the type Object is not visible
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();

why?
cause test() is not belong to the subclass.
so even though call clone() by peopel object p1,it is not the place of peopel object.
The myclone() is the exactly the place of people object.

Arghya Sadhu's user avatar

Arghya Sadhu

38.9k9 gold badges72 silver badges98 bronze badges

answered Aug 29, 2020 at 15:19

andrea wang's user avatar

Клонирование

Механизм клонирования, как следует из названия, позволяет порождать новые объекты на основе существующего, которые обладали бы точно таким же состоянием, что и исходный. То есть ожидается, что для исходного объекта, представленного ссылкой x, и результата клонирования, возвращаемого методом x.clone(), выражение

должно быть истинным, как и выражение

x.clone().getClass() == x.getClass()

Наконец, выражение

также верно. Реализация такого метода clone() осложняется целым рядом потенциальных проблем, например:

  • класс, от которого порожден объект, может иметь разнообразные конструкторы, которые к тому же могут быть недоступны (например, модификатор доступа private );
  • цепочка наследования, которой принадлежит исходный класс, может быть довольно длинной, и каждый родительский класс может иметь свои поля – недоступные, но важные для воссоздания состояния исходного объекта;
  • в зависимости от логики реализации возможна ситуация, когда не все поля должны копироваться для корректного клонирования; одни могут оказаться лишними, другие потребуют дополнительных вычислений или преобразований;
  • возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы.

Поэтому было реализовано следующее решение.

Класс Object содержит метод clone(). Рассмотрим его объявление:

protected native Object clone() 
    throws CloneNotSupportedException;

Именно он используется для клонирования. Далее возможны два варианта.

Первый вариант: разработчик может в своем классе переопределить этот метод и реализовать его по своему усмотрению, решая перечисленные проблемы так, как того требует логика разрабатываемой системы. Упомянутые условия, которые должны быть истинными для клонированного объекта, не являются обязательными и программист может им не следовать, если это требуется для его класса.

Второй вариант предполагает использование реализации метода clone() в самом классе Object. То, что он объявлен как native, говорит о том, что его реализация предоставляется виртуальной машиной. Естественно, перечисленные трудности легко могут быть преодолены самой JVM, ведь она хранит в памяти все свойства объектов.

При выполнении метода clone() сначала проверяется, можно ли клонировать исходный объект. Если разработчик хочет сделать объекты своего класса доступными для клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable. В этом интерфейсе нет ни одного элемента, он служит лишь признаком для виртуальной машины, что объекты могут быть клонированы. Если проверка не выполняется успешно, метод порождает ошибку CloneNotSupportedException.

Если интерфейс Cloneable реализован, то порождается новый объект от того же класса, от которого был создан исходный объект. При этом копирование выполняется на уровне виртуальной машины, никакие конструкторы не вызываются. Затем значения всех полей, объявленных, унаследованных либо объявленных в родительских классах, копируются. Полученный объект возвращается в качестве клона.

Обратите внимание, что сам класс Object не реализует интерфейс Cloneable, а потому попытка вызова new Object().clone() будет приводить к ошибке. Метод clone() предназначен скорее для использования в наследниках, которые могут обращаться к нему с помощью выражения super.clone(). При этом могут быть сделаны следующие изменения:

  • модификатор доступа расширен до public ;
  • удалено предупреждение об ошибке CloneNotSupportedException ;
  • результирующий объект может быть модифицирован любым способом, на усмотрение разработчика.

Напомним, что все массивы реализуют интерфейс Cloneable и, таким образом, доступны для клонирования.

Важно помнить, что все поля клонированного объекта приравниваются, их значения никогда не клонируются. Рассмотрим пример:

public class Test implements Cloneable {
  Point p;
  int height;

  public Test(int x, int y, int z) {
    p=new Point(x, y);
    height=z;
  }

  public static void main(String s[]) {
    Test t1=new Test(1, 2, 3), t2=null;
    try {
      t2=(Test) t1.clone();
    } catch (CloneNotSupportedException e) {}
    t1.p.x=-1;
    t1.height=-1;
    System.out.println("t2.p.x=" + t2.p.x + ", t2.height=" + t2.height);
  }
}

Результатом работы программы будет:

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

А вот ссылочное поле было скопировано по ссылке, оба объекта ссылаются на один и тот же экземпляр класса Point. Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.

Этого можно избежать, если переопределить метод clone() в классе Test.

public Object clone() {
   Test clone=null;
   try {
      clone=(Test) super.clone();
   } catch (CloneNotSupportedException e) {
      throw new InternalError(e.getMessage());
   }
   clone.p=(Point)this.p.clone();
   return clone;
}

Обратите внимание, что результат метода Object.clone() приходится явно приводить к типу Test, хотя его реализация гарантирует, что клонированный объект будет порожден именно от этого класса. Однако тип возвращаемого значения в данном методе для универсальности объявлен как Object, поэтому явное сужение необходимо.

Теперь метод main можно упростить:

public static void main(String s[]) {
   Test t1=new Test(1, 2, 3);
   Test t2=(Test) t1.clone();
   t1.p.x=-1;
   t1.height=-1;
   System.out.println("t2.p.x=" + t2.p.x +
     ", t2.height=" + t2.height);
}

Результатом будет:

То есть теперь все поля исходного и клонированного объектов стали независимыми.

Реализация такого «неглубокого» клонирования в методе Object.clone() необходима, так как в противном случае клонирование второстепенного объекта могло бы привести к огромным затратам ресурсов, ведь этот объект может содержать ссылки на более значимые объекты, а те при клонировании также начали бы копировать свои поля, и так далее. Кроме того, типом поля клонируемого объекта может быть класс, не реализующий Cloneable, что приводило бы к дополнительным проблемам. Как показано в примере, при необходимости дополнительное копирование можно добавить самостоятельно.

Клонирование массивов

Итак, любой массив может быть клонирован. В этом разделе хотелось бы рассмотреть особенности, возникающие из-за того, что Object.clone() копирует только один объект.

Рассмотрим пример:

int a[]={1, 2, 3};
int b[]=(int[])a.clone();
a[0]=0;
System.out.println(b[0]);

Результатом будет единица, что вполне очевидно, так как весь массив представлен одним объектом, который не будет зависеть от своей копии. Усложняем пример:

int a[][]={{1, 2}, {3}};
int b[][]=(int[][]) a.clone();

if (...) {
   // первый вариант:
   a[0]=new int[]{0};
   System.out.println(b[0][0]);
} else {
   // второй вариант:
   a[0][0]=0;
   System.out.println(b[0][0]);
}

Разберем, что будет происходить в этих двух случаях. Начнем с того, что в первой строке создается двумерный массив, состоящий из двух одномерных. Итого три объекта. Затем, на следующей строке при клонировании будет создан новый двумерный массив, содержащий ссылки на те же самые одномерные массивы.

Теперь несложно предсказать результат обоих вариантов. В первом случае в исходном массиве меняется ссылка, хранящаяся в первом элементе, что не принесет никаких изменений для клонированного объекта. На консоли появится 1.

Во втором случае модифицируется существующий массив, что скажется на обоих двухмерных массивах. На консоли появится 0.

Обратите внимание, что если из примера убрать условие if-else, так, чтобы отрабатывал первый вариант, а затем второй, то результатом будет опять 1, поскольку в части второго варианта модифицироваться будет уже новый массив, порожденный в части первого варианта.

Таким образом, в Java предоставляется мощный, эффективный и гибкий механизм клонирования, который легко применять и модифицировать под конкретные нужды. Особенное внимание должно уделяться копированию объектных полей, которые по умолчанию копируются только по ссылке.

Главная / Программирование /
Программирование на Java / Тест 9

Упражнение 1:


Номер 1

Сколько ошибок компиляции и ошибок времени выполнения в следующем примере?
                
                    int b[] = new int[5];
                    for (int i = 0; i <= b.length(); i++) {
                        b[i] = Math.sqrt(i);
                    }
                
            

Ответ:

(1)

(2)

(3)

(4)

(5)


Номер 2

Сколько ошибок компиляции и ошибок времени выполнения в следующем примере?
                
                    int b[] = new int[5];
                    for (int i = 0; i < b.length(); i++) {
                        b[i] = Math.sqrt(i);
                    }
                
            

Ответ:

(1)

(2)

(3)

(4)

(5)


Упражнение 2:


Номер 1

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?
                
                    public class SomeClass {
                        public static void main(String[] args) {
                            ____
                            for (int i = 0; i < b.length; i++) {
                                System.out.print(b[i]);
                            }
                        }
                    }
                
            

Ответ:

(1) int b[] = new int[]; 

(2) int b[] = new int[3]; 

(3) int b[]; 

(4) int b[3]; 

(5) int b[] = new int[] {0}; 


Номер 2

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?
                
                    public class SomeClass {
                        public static void main(String[] args) {
                            ____
                            for (int i = 0; i < b.length; i++) {
                                System.out.print(b[i]);
                            }
                        }
                    }
                
            

Ответ:

(1) int b[3] = new int[] {0,0,0}; 

(2) int b[] = new int[3] {0,0,0}; 

(3) int b[] = new int[] {0,0,0}; 

(4) int b[3] = new int[3] {0,0,0}; 

(5) int b[] = new {0,0,0}; 


Номер 3

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?
                
                    public class SomeClass {
                        public static void main(String[] args) {
                            ____
                            for (int i = 0; i < b.length; i++) {
                                System.out.print(b[i]);
                            }
                        }
                    }
                
            

Ответ:

(1) int b[] = new {0,0,0}; 

(2) int b[3] = [0,0,0]; 

(3) int b[] = {0,0,0}; 

(4) int b[] = [0,0,0]; 


Упражнение 3:


Номер 1

Сколько объектов порождается при инициализации массива new int[3][4]?

Ответ:

(1) 1 

(2) 2 

(3) 3 

(4) 4 

(5) ни одного, так как код не будет скомпилирован 


Номер 2

Сколько объектов порождается при инициализации массива
                new int[3][]?
            

Ответ:

(1) 1 

(2) 2 

(3) 3 

(4) 4 

(5) ни одного, так как код не будет скомпилирован 


Номер 3

Сколько объектов порождается при инициализации массива
                new int[][3]?
            

Ответ:

(1) 1 

(2) 2 

(3) 3 

(4) 4 

(5) ни одного, так как код не будет скомпилирован 


Упражнение 4:


Номер 1

Какое утверждение относительно приведения массивов верно

Ответ:

(1) любые массивы приводимы, поскольку являются объектами 

(2) A[] можно привести кB[], если A приводится к B 

(3) A[] можно привести к B[], если A приводится к B, и A, B – ссылочные типы  

(4) массивы не преобразовываются 


Номер 2

Какие утверждения относительно приведения массивов верны

Ответ:

(1) преобразования между типами массивов, основанных на различных примитивных типах, запрещены 

(2)
A[] можно привести кB[], если A приводится кB, иA,
B – ссылочные типы  

(3) массивы не преобразовываются 

(4) A[] можно привести кB[], если A
приводится к B 


Номер 3

Какое утверждение относительно приведения массивов верно?

Ответ:

(1) многомерные массивы преобразовывать нельзя 

(2) любые массивы приводимы, поскольку являются объектами 

(3)
A[] можно привести к B[], если A приводится к B, и A,
B – примитивные типы  

(4) массивы не преобразовываются 

(5) ничего из перечисленного 


Упражнение 5:


Номер 1

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?
                public class Vehicle {
                    public static void main(String[] args) {
                        Vehicle[] v = new Car[5];
                        ...
                    }
                    public void setVehicles(Vehicle c[]) {
                        c[0] = new Vehicle();
                    }
                    public void setVehicles2(Vehicle c[]) {
                        if (c[0] instanceof Vehicle) {
                            c[0] = new Vehicle();
                        }
                    }
                    public void setVehicles3(Car c[]) {
                        if (c[0] instanceof Car) {
                            c[0] = new Car();
                        }
                    }
                }
                class Car extends Vehicle{}
            

Ответ:

(1) setVehicles 

(2) setVehicles2 

(3) setVehicles3 


Номер 2

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?
                public class Vehicle {
                    public static void main(String[] args) {
                        Vehicle[] v = new Car[] { new Car()};
                        ...
                    }
                    public void setVehicles(Vehicle c[]) {
                        c[0] = new Vehicle();
                    }
                    public void setVehicles2(Vehicle c[]) {
                        if (c[0] instanceof Car) {
                            c[0] = new Vehicle();
                        }
                    }
                    public void setVehicles3(Vehicle c[]) {
                        if (c[0] instanceof Vehicle) {
                            c[0] = new Car();
                        }
                    }
                }
                class Car extends Vehicle{}
            

Ответ:

(1) setVehicles 

(2) setVehicles2 

(3) setVehicles3 

(4) setVehicles и setVehicles3 

(5) setVehicles и setVehicles2 


Номер 3

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?
                public class Vehicle {
                    public static void main(String[] args) {
                        Vehicle[] v = new Car[] { new Car()};
                        ...
                    }
                    public void setVehicles(Vehicle c[]) {
                        c[0] = new Vehicle();
                    }
                    public void setVehicles2(Vehicle c[]) {
                        if (c[0] instanceof Vehicle) {
                            c[0] = new Car();
                        }
                    }
                    public void setVehicles3(Vehicle c[]) {
                        if (c[0] instanceof Car) {
                            c[0] = new Vehicle();
                        }
                    }
                }
                class Car extends Vehicle{}
            

Ответ:

(1) setVehicles 

(2) setVehicles2 

(3) setVehicles3 

(4) setVehicles и setVehicles3 

(5) setVehicles и setVehicles2 


Упражнение 6:


Номер 1

От какого класса наследуются классы массивов?

Ответ:

(1) особый класс для массивов 

(2) Object 

(3) одномерные массивы – отObject, двумерные – от одномерных и т.д. 

(4) ни от какого 


Номер 2

От какого класса наследуются классы двумерных массивов?

Ответ:

(1) особый класс для массивов 

(2) Object 

(3) от классов одномерных массивов 

(4) ни от какого 


Номер 3

Может ли массив основываться на абстрактных классах? Интерфейсах?

Ответ:

(1) да, да 

(2) да, нет 

(3) нет, да 

(4) нет, нет 


Упражнение 7:


Номер 1

Какие утверждения относительно клонирования верны?

Ответ:

(1) выражение x == x.clone() должно быть истинным 

(2) выражение x.clone().getClass() == x.getClass() может быть ложным 

(3) выражение x.equals(x.clone()) должно быть истинным 

(4) для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс IsCloneable 

(5) попытка вызова new Object().clone() не приведет к ошибке 


Номер 2

Какие утверждения относительно клонирования верны?

Ответ:

(1) для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс Cloneable 

(2) массивы не реализуют интерфейс Cloneable 

(3) выражение x == x.clone() может быть ложным 

(4) возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы 

(5) выражение x.clone().getClass() == x.getClass() может быть ложным 


Номер 3

Какие утверждения относительно клонирования верны?

Ответ:

(1) выражение x.clone().getClass() == x.getClass() должно быть истинным 

(2) выражение x == x.clone() должно быть ложным 

(3) попытка вызова new Object().clone() не приведет к ошибке 

(4) попытка вызова new Object().clone() приведет к ошибке 


Упражнение 8:


Номер 1

Что будет выведено на экран в результате выполнения следующего кода: 
                public class SomeClass {
                    public static void main(String[] args) {
                        int a[] = {1, 2, 3};
                        int b[] = (int[]) a.clone();
                        a[0] = 0;
                        System.out.print(b[0]);
                        System.out.print(b[1]);
                        System.out.print(b[2]);
                    }
                }
            

Ответ:

(1) 023 

(2) 123 

(3) сообщение об ошибке компиляции 

(4) сообщение об ошибке времени исполнения 


Номер 2

Что будет выведено на экран в результате выполнения следующего кода: 

public class SomeClass {
            public static void main(String[] args) {
                        int a[][] = {{1, 2}, {3}};
                        int b[][] = (int[][]) a.clone();
                        a[0] = new int[]{0};
                        System.out.println(b[0][0]);
             }
}

Ответ:

(1) 0 

(2) 0, 2 

(3) 1 

(4) 1, 2 

(5) сообщение об ошибке времени исполнения 


Номер 3

Что будет выведено на экран в результате выполнения следующего кода:  public class SomeClass {
  public static void main(String[] args) {
      int a[] = {1, 2, 3};
      int b[] = (int[]) a.clone();
      a[0] = 0;
      System.out.print(b[0]);
    }
}

Ответ:

(1) 0 

(2) 0, 2 

(3) 1 

(4) 1, 2 

(5) сообщение об ошибке времени исполнения 


В этом посте будет обсуждаться, как скопировать объект в Java с помощью clone() метод в Object class и один, предоставленный Apache Commons Lang. Мы также подробно обсудим мелкое и глубокое копирование.

Клонирование объекта создает копию существующего объекта для изменения или перемещения скопированного объекта, не затрагивая исходный объект. В Java управление объектами осуществляется с помощью ссылочных переменных, и нет оператора для фактического копирования объекта. Помните, что оператор присваивания дублирует ссылку, а не объект.

Классы, которым нужна функция копирования, могут использовать Object.clone() метод, который создает и возвращает копию объекта. Прототип Object.clone() является

protected Object clone() throws CloneNotSupportedException;

В качестве возвращаемого типа Object.clone() является Object, приведение типов необходимо для присвоения возвращаемой ссылки Object ссылке на объект.

Все задействованные классы должны реализовывать Cloneable интерфейс для указания Object.clone() метод о том, что для этого метода разрешено создавать полевые копии экземпляров этого класса. Вызов метода clone объекта для экземпляра, который не реализует Cloneable интерфейс приводит к CloneNotSupportedException.

Поскольку каждый класс неявно расширяет Object учебный класс, Object.clone() является переопределяемым методом. Поскольку Java поддерживает ковариантные возвращаемые типы, возвращаемый тип clone() можно изменить с Object на тип клонируемого объекта, и clone() должен переопределить защищенный Object.clone() метод с общедоступным методом.

The clone() ведет себя так же, как Копировать конструктор. Он называет clone() метод своего родительского класса для получения копии и т. д., пока он в конечном итоге не достигнет класса Object. clone() метод, который создает новый экземпляр того же класса, поскольку объект копирует все поля в новый экземпляр.

Минусы:

1. Object.clone() не будет работать с интерфейсами и абстрактными классами.

Единственный способ использовать Object.clone() метод, если класс объекта известен, т. е. мы не можем получить доступ к clone() метод для абстрактного типа, так как большинство интерфейсов и абстрактных классов в Java не определяют общедоступный clone() метод.

Например, нельзя вызвать clone() в ссылке на карту в Java, потому что карта не указывает общедоступного clone() метод. Только реализации карты, такие как HashMap а также LinkedHashMap имеют clone() методы, но носить с собой тип класса объекта не рекомендуется, и это противоречит принципу “программа для интерфейса, а не для реализации”.

 
2. Реализация по умолчанию Object.clone() метод возвращает Неглубокое копирование.

При неглубоком копировании, если значение поля является примитивным типом, оно копирует свое значение; в противном случае, если значение поля является ссылкой на объект, оно копирует ссылку и, следовательно, ссылается на тот же объект. Теперь, если один из этих объектов изменен, изменение будет видно в другом. В Глубокое копирование, в отличие от мелкой копии, объекты, на которые есть ссылки, не являются общими; вместо этого новые объекты создаются для любых объектов, на которые есть ссылки.

Поверхностное клонирование

Shallow Copy

 
Следующая программа демонстрирует использование Object.clone() метод, используя его реализацию по умолчанию, которая возвращает поверхностную копию. Мы рассмотрим глубокое копирование с помощью clone() метод в следующем разделе.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

import java.util.Arrays;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Set;

import java.util.Map;

// `Subject` также должен реализовать `Cloneable`!!

class Subject implements Cloneable

{

    private Set<String> subjects;

    public Subject()

    {

        subjects = new HashSet<>(

                Arrays.asList(«Maths», «Science», «English», «History»)

        );

    }

    @Override

    public Object clone() throws CloneNotSupportedException {

        // вызовите `super.clone()`, чтобы получить ссылку на клонированный объект

        return super.clone();

    }

    @Override

    public String toString() {

        return subjects.toString();

    }

    public Set<String> getSubjects() {

        return subjects;

    }

}

// Обратите внимание, что `Student` реализует интерфейс `Cloneable`

class Student implements Cloneable

{

    private String name;        // неизменяемое поле

    private int age;            // примитивное поле

    private Subject subjects;

    private Map<String, Integer> map;

    public Student(String name, int age)

    {

        this.name = name;

        this.age = age;

        map = new HashMap<String, Integer>() {{

            put(name, age);

        }};

        subjects = new Subject();

    }

    @Override

    public String toString()

    {

        return Arrays.asList(name, String.valueOf(age),

                subjects.toString()).toString();

    }

    @Override

    public Object clone() throws CloneNotSupportedException {

        // вызовите `super.clone()`, чтобы получить ссылку на клонированный объект

        return super.clone();

    }

    public Set<String> getSubjects() { return subjects.getSubjects(); }

    public Map<String, Integer> getMap() { return map; }

    // включаем оставшиеся геттеры и сеттеры

}

// Демонстрация поверхностного копирования объектов с помощью метода `clone()`

class Main

{

    // Вспомогательный метод для сравнения двух объектов. Он печатает мелкую копию

    // если оба объекта имеют один и тот же объект; в противном случае он печатает глубокую копию

    public static void compare(Object ob1, Object ob2)

    {

        if (ob1 == ob2) {

            System.out.println(«Shallow Copy»);

        }

        else {

            System.out.println(«Deep Copy»);

        }

    };

    public static void main(String[] args)

    {

        Student student = new Student(«Jon Snow», 22);

        Student clone = null;

        try {

            clone = (Student) student.clone();

            System.out.println(«Cloned Object: « + clone + ‘n’);

        } catch (CloneNotSupportedException ex) {

            ex.printStackTrace();

        }

        compare(student.getSubjects(), clone.getSubjects());

        compare(student.getMap(), clone.getMap());

        // любое изменение, внесенное в карту клона, отразится на карте ученика

        clone.getMap().put(«John Cena», 40);

        System.out.println(student.getMap());

    }

}

Скачать  Выполнить код

результат:

Cloned Object: [Jon Snow, 22, [Maths, English, Science, History]]

 
Shallow Copy
Shallow Copy
{Jon Snow=22, John Cena=40}

Глубокое клонирование

Если класс содержит только примитивы и поля Immutable, поверхностная копия работает нормально. Но любые изменяемые поля, такие как коллекции и массивы, будут совместно использоваться оригиналом и копией, поскольку Object.clone() возвращает точную копию исходного объекта.

Для глубокого клонирования, если класс содержит какие-либо ссылки на объекты, clone() Метод должен выполнить все необходимые модификации объекта, полученного от суперкласса, прежде чем вернуться к вызывающей стороне. т.е., clone() метод должен изменять изменяемые поля объектов, возвращаемых super.clone(). Один из способов сделать это — вызвать clone() метод на изменяемых полях.

Deep Copy

Если мы попытаемся присвоить значения конечным полям в clone() метод, это приведет к ошибке компиляции. Значение поля является неизменяемым объектом, мы можем просто позволить ему скопировать ссылку, и и оригинал, и его клон будут использовать один и тот же объект. Но для изменчивых объектов он должен быть глубоко скопирован.

Сериализация и десериализация — это еще одна альтернатива использованию клона, который правильно обрабатывает окончательные элементы данных, как показано в следующем разделе. Мы также можем использовать Копировать конструктор который берет экземпляр того же класса, что и объект, копирует все примитивные поля и создает новые объекты для любых объектов, на которые ссылаются, в этот новый экземпляр.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

import java.util.Arrays;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Set;

import java.util.Map;

// `Subject` также должен реализовать `Cloneable`!!

class Subject implements Cloneable

{

    private Set<String> subjects;

    public Subject()

    {

        subjects = new HashSet<>(

                Arrays.asList(«Maths», «Science», «English», «History»)

        );

    }

    @Override

    public Subject clone() throws CloneNotSupportedException {

        Subject obj = (Subject)super.clone();

        obj.subjects = new HashSet<>(this.subjects);

        return obj;

    }

    @Override

    public String toString() {

        return subjects.toString();

    }

    public Set<String> getSubjects() {

        return subjects;

    }

}

// Обратите внимание, что `Student` реализует интерфейс `Cloneable`

class Student implements Cloneable

{

    private String name;        // неизменяемое поле

    private int age;            // примитивное поле

    private Subject subjects;

    private Map<String, Integer> map;

    public Student(String name, int age)

    {

        this.name = name;

        this.age = age;

        map = new HashMap<String, Integer>() {{

            put(name, age);

        }};

        subjects = new Subject();

    }

    @Override

    public String toString()

    {

        return Arrays.asList(name, String.valueOf(age),

                subjects.toString()).toString();

    }

    @Override

    public Object clone() throws CloneNotSupportedException {

        Student student = (Student) super.clone();

        // примитивные поля типа int не копируются, так как их содержимое

        // уже скопировано

        // Строка неизменна

        // вызов `clone()` для объекта `Subject`

        student.subjects = this.subjects.clone();

        // создаем новый экземпляр `Hashmap`

        student.map = new HashMap<>(this.map);

        return student;

    }

    public Set<String> getSubjects() { return subjects.getSubjects(); }

    public Map<String, Integer> getMap() { return map; }

    // включаем оставшиеся геттеры и сеттеры

}

// Демонстрация глубокой копии объектов с помощью метода `clone()`

class Main

{

    // Вспомогательный метод для сравнения двух объектов. Он печатает мелкую копию

    // если оба объекта имеют один и тот же объект; в противном случае он печатает глубокую копию

    public static void compare(Object ob1, Object ob2)

    {

        if (ob1 == ob2) {

            System.out.println(«Shallow Copy»);

        }

        else {

            System.out.println(«Deep Copy»);

        }

    };

    public static void main(String[] args)

    {

        Student student = new Student(«Jon Snow», 22);

        Student clone = null;

        try {

            clone = (Student) student.clone();

            System.out.println(«Cloned Object: « + clone + ‘n’);

        } catch (CloneNotSupportedException ex) {

            ex.printStackTrace();

        }

        compare(student.getSubjects(), clone.getSubjects());

        compare(student.getMap(), clone.getMap());

        // любые изменения, внесенные в карту клона, не отразятся на карте ученика

        clone.getMap().put(«John Cena», 40);

        System.out.println(student.getMap());

    }

}

Скачать  Выполнить код

результат:

Cloned Object: [Jon Snow, 22, [Maths, English, Science, History]]

 
Deep Copy
Deep Copy
{Jon Snow=22}

 
Обычай clone() метод утомителен в реализации, подвержен ошибкам и сложен в обслуживании. Код необходимо модифицировать каждый раз, когда в поля класса вносятся какие-либо изменения.

2. Глубокое клонирование: Apache SerializationUtils.clone() метод

JDK не предоставляет эквивалент глубокого копирования для Object.clone() метод. Но мы можем сослаться на реализацию clone() метод, предоставленный Apache Commons Lang SerializationUtils учебный класс. Прототип SerializationUtils.clone() является:

public static Object clone(Serializable object);

Он в основном выполняет глубокое клонирование с использованием сериализации. Это полезно, поскольку глубокое клонирование с использованием метода клонирования объекта очень болезненно и подвержено ошибкам для сложных graphs объектов.

Минусы:

  • Это во много раз медленнее, чем ручное клонирование всех объектов в вашем экземпляре объекта.
  • Если используется этот метод, все задействованные объекты должны быть Serializable, т. е. объекты должны реализовывать Serializable интерфейс; в противном случае он выкинет java.io.NotSerializableException.

Следующая программа демонстрирует это:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

import org.apache.commons.lang3.SerializationUtils;

import java.io.Serializable;

import java.util.*;

// `Subject` также должен реализовать интерфейс `Serializable`!!

class Subject implements Serializable

{

    private Set<String> subjects;

    public Subject()

    {

        subjects = new HashSet<>(

                Arrays.asList(«Maths», «Science», «English», «History»)

            );

    }

    @Override

    public String toString() {

        return subjects.toString();

    }

    public Set<String> getSubjects() {

        return subjects;

    }

}

// Обратите внимание, что `Student` реализует интерфейс `Serializable`

class Student implements Serializable

{

    private String name;        // неизменяемое поле

    private int age;        // примитивное поле

    private Subject subjects;

    private Map<String, Integer> map;

    public Student(String name, int age)

    {

        this.name = name;

        this.age = age;

        map = new HashMap<String, Integer>() {{

            put(name, age);

        }};

        subjects = new Subject();

    }

    @Override

    public String toString()

    {

        return Arrays.asList(name, String.valueOf(age),

                                    subjects.toString()).toString();

    }

    public Set<String> getSubjects() { return subjects.getSubjects(); }

    public Map<String, Integer> getMap() { return map; }

    // включаем оставшиеся геттеры и сеттеры

}

// Демонстрация глубокого копирования объектов с помощью метода `clone()`, предоставляемого

// `SerializationUtils` Apache Common

class Main

{

    // Вспомогательный метод для сравнения двух объектов. Он печатает мелкую копию

    // если оба объекта имеют один и тот же объект; в противном случае он печатает глубокую копию

    public static void compare(Object ob1, Object ob2)

    {

        if (ob1 == ob2) {

            System.out.println(«Shallow Copy»);

        }

        else {

            System.out.println(«Deep Copy»);

        }

    };

    public static void main(String[] args)

    {

        Student student = new Student(«Jon Snow», 22);

        // вызов метода `clone()` SerializationUtils

        Student clone = (Student) SerializationUtils.clone(student);

        System.out.println(«Cloned Object: « + clone.toString() + ‘n’);

        compare(student.getSubjects(), clone.getSubjects());

        compare(student.getMap(), clone.getMap());

        // любые изменения, внесенные в карту клона, не отразятся на карте ученика

        clone.getMap().put(«John Cena», 40);

        System.out.println(student.getMap());

    }

}

Скачать код

результат:

Cloned Object: [Jon Snow, 22, [Jon Snow, 22]]

 
Deep Copy
Deep Copy
{Jon Snow=22}

Это все о clone() метод в Java.

 
Использованная литература:

https://en.wikipedia.org/wiki/Object_copying#Copying_in_Java
https://en.wikipedia.org/wiki/Clone_(Java_method)

Стр. 12 из 21

Клонирование

Все эти утверждения непосредственно следуют из рассмотренных выше особенностей приведения типов массивов.

Еще раз напомним про исключительный класс Object. Переменные такого типа могут ссылаться на любые объекты, порожденные как от классов, так и от массивов.

Сведем все эти утверждения в таблицу:

Тип переменной

Допустимые типы ее значения

Массив простых значений

null

• в точности совпадающий с типом переменной

Массив ссылочных значений

null

• совпадающий с типом переменной

массивы ссылочных значений, удовлетворяющих

следующему условию: Если тип переменной — массив на

основе типа A, то значение типа массив на основе типа

B допустимо тогда и только тогда, когда B приводимо к

A.

Object

null

• любой ссылочный, включая все массивы

Механизм клонирования, как следует из названия, позволяет порождать новые объекты на основе существующего, которые бы обладали точно таким же состоянием, что и исходный. То есть, ожидается, что для исходного объекта, представленного ссылкой x, и результата клонирования, возвращаемого методом x.clone(), выражение

x != x.clone()

должно быть истинным, также как и выражение

x.clone().getClass() == x.getClass()

и, наконец, выражение

x.equals(x.clone())

также верно. Реализация такого метода clone() осложняется целым рядом потенциальных проблем, например:

класс, от которого порожден объект, может иметь разнообразные конструкторы, которые к тому же могут быть недоступны (например, модификатор доступа private);

цепочка наследования, которой принадлежит исходный класс, может быть довольно длинной, и каждый родительский класс может иметь свои поля, которые являются недоступными, но важными для воссоздания состояния исходного объекта;

в зависимости от логики реализации возможна ситуация, когда не все поля должны копироваться для корректного клонирования. Какие-то могут оказаться лишними, какие потребуют дополнительных вычислений или преобразований;

Программирование на Java

Rendered by www.RenderX.com

Стр. 13 из 21

возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы.

Поэтому было реализовано следующее решение.

Класс Object содержит метод clone(). Рассмотрим его объявление:

protected native Object clone() throws CloneNotSupportedException;

Именно он используется для клонирования. Далее возможно два варианта.

Во-первых, разработчик может в своем классе переопределить этот метод и реализовать его по своему усмотрению, решая перечисленные проблемы так, как этого требует логика разрабатываемой системы. Упомянутые условия, которые ожидаются быть истинными для клонированного объекта, не являются обязательными, и программист может им не следовать, если это требуется для его класса.

Второй вариант предполагает использование реализации метода clone() в самом классе Object. То, что он объявлен как native, говорит о том, что его реализация предоставляется виртуальной машиной. Понятно, что перечисленные трудности легко могут быть преодолены самой JVM, ведь она хранит в своей памяти все свойства объектов.

При выполнении метода clone() сначала делается проверка, можно ли клонировать исходный объект. Если разработчик хочет сделать объекты своего класса доступными для клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable. В этом интерфейсе нет ни одного элемента, он служит лишь признаком для виртуальной машины, что объекты допустимы для клонирования. Если проверка не выполняется успешно, метод порождает ошибку

CloneNotSupportedException

.

Если интерфейс Cloneable реализован, то порождается новый объект от точно того же класса, от которого был создан исходный объект. При этом копирование проводится на уровне виртуальной машины, никакие конструкторы не вызываются. Затем значения всех полей, объявленных, унаследованных, либо объявленных в родительских классах, копируются. Полученный объект возвращается в качестве клона.

Обратите внимание, что сам класс Object не реализует интерфейс Cloneable, а потому попытка вызова new Object().clone() будет приводить к ошибке времени исполнения. Метод clone() предназначен скорее для использования в наследниках, которые могут обращаться к нему с помощью выражения super.clone(). При этом могут быть сделаны следующие изменения:

модификатор доступа расширен до public;

убрано предупреждение об ошибке CloneNotSupportedException;

результирующий объект может быть модифицирован любым образом на усмотрение разработчика.

Напомним, что все массивы реализуют интерфейс Cloneable и, таким образом, доступы для клонирования.

Важно помнить, что все поля клонированного объекта приравниваются, их значения никогда не клонируются. Рассмотрим пример:

Программирование на Java

Rendered by www.RenderX.com

Стр. 14 из 21 Клонирование

public class Test implements Cloneable { Point p;

int height;

public Test(int x, int y, int z) { p=new Point(x, y);

height=z;

}

public static void main(String s[]) { Test t1=new Test(1, 2, 3), t2;

try {

t2=(Test) t1.clone();

} catch (CloneNotSupportedException e) {} t1.p.x=-1;

t1.height=-1;

System.out.println(«t2.p.x=» + t2.p.x + «, t2.height=» + t2.height);

}

}

Результатом работы программы будет:

t2.p.x=-1, t2.height=3

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

А вот ссылочное поле было скопировано по ссылке, оба объекта ссылаются на один и тот же экземпляр класса Point. Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.

Этого можно избежать, если переопределить метод clone() в классе Test.

public Object clone() { Test clone=null;

try {

clone=(Test) super.clone();

} catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage());

}

clone.p=(Point)clone.p.clone(); return clone;

}

Обратите внимание, что результат метода Object.clone() приходится явно приводить к типу Test, несмотря на то, что его реализация гарантирует, что клонированный объект будет порожден именно от этого класса. Однако тип возвращаемого значения в этом методе для универсальности объявлен как Object, поэтому явное сужение необходимо.

Программирование на Java

Rendered by www.RenderX.com

Клонирование массивов

Стр. 15 из 21

Теперь метод main можно упростить:

public static void main(String s[]) { Test t1=new Test(1, 2, 3);

Test t2=(Test) t1.clone(); t1.p.x=-1;

t1.height=-1;

System.out.println(«t2.p.x=» + t2.p.x + «, t2.height=» + t2.height);

}

Результатом будет:

t2.p.x=1, t2.height=3

То есть, теперь все поля исходного и клонированного объектов стали независимыми.

Реализация такого «неглубокого» клонирования в методе Object.clone() необходима, так как в противном случае клонирование второстепенного объекта могло бы привести к огромным затратам ресурсов, ведь этот объект может содержать ссылки на более значимые объекты, а те при клонировании также начали бы копировать свои поля и так далее. Кроме этого, поля клонируемого объекта могут иметь своим типом класс, не реализующий Cloneable, что приводило бы к дополнительным проблемам. Как показано в примере, при необходимости дополнительное копирование можно легко добавить самостоятельно.

4.1. Клонирование массивов

Итак, любой массив может быть клонирован. В этом разделе хотелось бы рассмотреть особенности, возникающие из-за того, что Object.clone() копирует только один объект.

Рассмотрим пример:

int a[]={1, 2, 3};

int b[]=(int[])a.clone(); a[0]=0; System.out.println(b[0]);

Результатом будет ноль, что вполне очевидно, так как весь массив представлен одним объектом, который не будет зависеть от своей копии. Усложняем пример:

int a[][]={{1, 2}, {3}};

int b[][]=(int[][]) a.clone();

if (…) {

//первый вариант: a[0]=new int[]{0};

System.out.println(b[0][0]); } else {

//второй вариант: a[0][0]=0;

Программирование на Java

Rendered by www.RenderX.com

Соседние файлы в папке Курс Вязовика

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

9. Лекция: Массивы

Лекция посвящена описанию массивов в Java. Массивы издавна присутствуют в языках программирования, поскольку при выполнении многих задач приходится оперировать целым рядом однотипных значений. Массивы в Java – один из ссылочных типов, который, однако, имеет особенности при инициализации, создании и оперировании со своими значениями. Наибольшие различия проявляются при преобразовании таких типов. Также объясняется, почему многомерные массивы в Java можно (и зачастую более правильно) рассматривать как одномерные. Завершается классификация типов переменных и типов значений, которые они могут хранить. В заключение рассматривается механизм клонирования Java, позволяющий в любом классе описать возможность создания точных копий объектов, порожденных от него.

Массивы как тип данных в Java

В отличие от обычных переменных, которые хранят только одно значение, массивы (arrays) используются для хранения целого набора значений. Количество значений в массиве называется его длиной, сами значения – элементами массива. Значений может не быть вовсе, в этом случае массив считается пустым, а его длина равной нулю.

Элементы не имеют имен, доступ к ним осуществляется по номеру индекса. Если массив имеет длину n, отличную от нуля, то корректными значениями индекса являются числа от 0 до n-1. Все значения имеют одинаковый тип и говорится, что массив основан на этом базовом типе. Массивы могут быть основаны как на примитивных типах (например, для хранения числовых значений 100 измерений), так и на ссылочных (например, если нужно хранить описание 100 автомобилей в гараже в виде экземпляров класса Car ).

Сразу оговоримся, что в Java массив символов char[] и класс String являются различными типами. Их значения могут легко конвертироваться друг в друга с помощью специальных методов, но все же они не относятся к идентичным типам.

Как уже говорилось, массивы в Java являются объектами (примитивных типов в Java всего восемь и их количество не меняется), их тип напрямую наследуется от класса Object, поэтому все элементы данного класса доступны у объектов-массивов.

Базовый тип также может быть массивом. Таким образом конструируется массив массивов, или многомерный массив.

Работа с любым массивом включает обычные операции, уже описанные для других типов, — объявление, инициализация и т.д. Начнем последовательно изучать их в приложении к массивам.

Объявление массивов

В качестве примера рассмотрим объявление переменной типа «массив, основанный на примитивном типе int «:

int a[];

Как мы видим, сначала указывается базовый тип. Затем идет имя переменной, а пара квадратных скобок указывает на то, что используемый тип является именно массивом. Также допустима запись:

int[] a;

Количество пар квадратных скобок указывает на размерность массива. Для многомерных массивов допускается смешанная запись:

int[] a[];

Переменная a имеет тип «двумерный массив, основанный на int «. Аналогично объявляются массивы с базовым объектным типом:

Point p, p1[], p2[][];

Создание переменной типа массив еще не создает экземпляры этого массива. Такие переменные имеют объектный тип и хранят ссылки на объекты, однако изначально имеют значение null (если они являются полями класса; напомним, что локальные переменные необходимо явно инициализировать). Чтобы создать экземпляр массива, нужно воспользоваться ключевым словом new, после чего указывается тип массива и в квадратных скобках – длина массива.

int a[]=new int[5];

Point[] p = new Point[10];

Переменная инициализируется ссылкой, указывающей на только что созданный массив. После его создания можно обращаться к элементам, используя ссылку на массив, далее в квадратных скобках указывается индекс элемента. Индекс меняется от нуля, пробегая всю длину массива, до максимально допустимого значения, на единицу меньшего длины массива.

int array[]=new int[5];

for (int i=0; i<5; i++) {

array[i]=i*i;

}

for (int j=0; j<5; j++) {

System.out.println(j+» «+j+»=»+array[j]);

}

Результатом выполнения программы будет:

00=0

1*1=1

2*2=4

3*3=9

4*4=16

И далее появится ошибка времени исполнения, так как индекс превысит максимально возможное для такого массива значение. Проверка, не выходит ли индекс за допустимые пределы, происходит только во время исполнения программы, т.е. компилятор не пытается выявить эту ошибку даже в таких явных случаях, как:

int i[]=new int[5]; i[-2]=0;

// ошибка! индекс не может

// быть отрицательным

Ошибка возникнет только на этапе выполнения программы.

Хотя при создании массива необходимо указывать его длину, это значение не входит в определение типа массива, важна лишь размерность. Таким образом, одна переменная может ссылаться на массивы разной длины:

int i[]=new int[5];

i=new int[7];

// переменная та же, длина

// массива другая

Однако для объекта массива длина обязательно должна указываться при создании и уже никак не может быть изменена. В последнем примере для присвоения переменной ссылки на массив большей длины потребовалось создать новый экземпляр.

Поскольку для экземпляра массива длина является постоянной характеристикой, для всех массивов существует специальное поле length, позволяющее узнать ее значение. Например:

Point p[]=new Point[5];

for (int i=0; i<p.length; i++) {

p[i]=new Point(i, i);

}

Значение индекса массива всегда имеет тип int. При обращении к элементу можно также использовать byte, short или char, поскольку эти типы автоматически расширяются до int. Попытка задействовать long приведет к ошибке компиляции.

Соответственно, и поле length имеет тип int, а теоретическая максимально возможная длина массива равняется 231-1, то есть немногим больше 2 млрд.

Продолжая рассматривать тип массива, подчеркнем, что в качестве базового типа может использоваться любой тип Java, в том числе:

* интерфейсы. В таком случае элементы массива могут иметь значение null или ссылаться на объекты любого класса, реализующего этот интерфейс;

* абстрактные классы. В этом случае элементы массива могут иметь значение null или ссылаться на объекты любого неабстрактного класса-наследника.

Поскольку массив является объектным типом данных, его значения могут быть приведены к типу Object или, что то же самое, присвоены переменной типа Object. Например,

Object o = new int[4];

Это дает интересную возможность для массивов, основанных на типе Object, хранить в качестве элемента ссылку на самого себя:

Object arr[] = new Object[3];

arr[0]=new Object();

arr[1]=null;

arr[2]=arr;

// Элемент ссылается

// на весь массив!

Инициализация массивов

Теперь, когда мы выяснили, как создавать экземпляры массива, рассмотрим, какие значения принимают его элементы.

Если создать массив на основе примитивного числового типа, то изначально после создания все элементы массива имеют значение по умолчанию, то есть 0. Если массив объявлен на основе примитивного типа boolean, то и в этом случае все элементы будут иметь значение по умолчанию false. Выше рассматривался пример инициализации элементов с помощью цикла for.

Рассмотрим создание массива на основе ссылочного типа. Предположим, это будет класс Point. При создании экземпляра массива с применением ключевого слова new не создается ни один объект класса Point, создается лишь один объект массива. Каждый элемент массива будет иметь пустое значение null. В этом можно убедиться на простом примере:

Point p[]=new Point[5];

for (int i=0; i<p.length; i++) {

System.out.println(p[i]);

}

Результатом будут лишь слова null.

Далее нужно инициализировать элементы массива по отдельности, например, в цикле. Вообще, создание массива длиной n можно рассматривать как заведение n переменных и работать с элементами массива (в последнем примере p[i] ) по правилам обычных переменных.

Кроме того, существует и другой способ создания массивов – инициализаторы. В этом случае ключевое слово new не используется, а ставятся фигурные скобки, и в них через запятую перечисляются значения всех элементов массива. Например, для числового массива явная инициализация записывается следующим образом:

int i[]= {1, 3, 5};

int j[]= {};

// эквивалентно new int[0]

Длина массива вычисляется автоматически, исходя из количества введенных значений. Далее создается массив такой длины и каждому его элементу присваивается указанное значение.

Аналогично можно порождать массивы на основе объектных типов, например:

Point p=new Point(1,3);

Point arr[]= {

p, new Point(2,2), null, p

};

// или String sarr[]= {

«aaa», «bbb», «cde»+»xyz»

};

Однако инициализатор нельзя использовать для анонимного создания экземпляров массива, то есть не для инициализации переменной, а, например, для передачи параметров метода или конструктора.

Например:

public class Parent {

private String[] values;

protected Parent(String[] s) {

values=s;

}

}

public class Child extends Parent {

public Child(String firstName,

String lastName) {

super(???);

// требуется анонимное создание массива

}

}

В конструкторе класса Child необходимо осуществить обращение к конструктору родителя и передать в качестве параметра ссылку на массив. Теоретически можно передать null, но это приведет в большинстве случаев к некорректной работе классов. Можно вставить выражение new String[2], но тогда вместо значений firstName и lastName будут переданы пустые строки. Попытка записать {

firstName, lastName

}

приведет к ошибке компиляции, так можно только инициализировать переменные.

Корректное выражение выглядит так:

new String[] {

firstName, lastName

}

Что является некоторой смесью выражения, создающего массивы с помощью new, и инициализатора. Длина массива определяется количеством указанных значений.

Многомерные массивы

Теперь перейдем к рассмотрению многомерных массивов. Так, в следующем примере

int i[][]=new int[3][5];

переменная i ссылается на двумерный массив, который можно представить себе в виде таблицы 3х5. Суммарно в таком массиве содержится 15 элементов, к которым можно обращаться через комбинацию индексов от (0, 0) до (2, 4). Пример заполнения двумерного массива через цикл:

int pithagor_table[][]=new int[5][5];

for (int i=0; i<5; i++) {

for (int j=0; j<5; j++) {

pithagor_table[i][j]=i*j;

System.out.print(pithagor_table[i][j] + » «);

}

System.out.println();

}

Результатом выполнения программы будет:

0 0 0 0 0

0 1 2 3 4

0 2 4 6 8

0 3 6 9 12

0 4 8 12 16

Однако такой взгляд на двумерные и многомерные массивы является неполным. Более точный подход заключается в том, что в Java нет двумерных, и вообще многомерных массивов, а есть массивы, базовыми типами которых являются также массивы. Например, тип int[] означает «массив чисел», а int[][] означает «массив массивов чисел». Поясним такую точку зрения.

Если создать двумерный массив и определить переменную x, которая на него ссылается, то, используя x и два числа в паре квадратных скобок каждое (например, x[0][0] ), можно обратиться к любому элементу двумерного массива. Но в то же время, используя x и одно число в паре квадратных скобок, можно обратиться к одномерному массиву, который является элементом двумерного массива. Его можно проинициализировать новым массивом с некоторой другой длиной и таблица перестанет быть прямоугольной – она примет произвольную форму. В частности, можно одному из одномерных массивов присвоить даже значение null.

int x[][]=new int[3][5];

// прямоугольная таблица

x[0]=new int[7];

x[1]=new int[0];

x[2]=null;

После таких операций массив, на который ссылается переменная x, назвать прямоугольным никак нельзя. Зато хорошо видно, что это просто набор одномерных массивов или значений null.

Полезно подсчитать, сколько объектов порождается выражением new int[3][5]. Правильный подсчет таков: создается один массив массивов (один объект) и три массива чисел, каждый длиной 5 (три объекта). Итого, четыре объекта.

В рассмотренном примере три из них (массивы чисел) были тут же переопределены новыми значениями. Для таких случаев полезно использовать упрощенную форму выражения создания массивов:

int x[][]=new int[3][];

Такая запись порождает один объект – массив массивов – и заполняет его значениями null. Теперь понятно, что и в этом, и в предыдущем варианте выражение x.length возвращает значение 3 – длину массива массивов. Далее можно с помощью выражений x[i].length узнать длину каждого вложенного массива чисел, при условии, что i неотрицательно и меньше x.length, а также x[i] не равно null. Иначе будут возникать ошибки во время выполнения программы.

Вообще, при создании многомерных массивов с помощью new необходимо указывать все пары квадратных скобок, соответственно количеству измерений. Но заполненной обязательно должна быть лишь крайняя левая пара, это значение задаст длину верхнего массива массивов. Если заполнить следующую пару, то этот массив заполнится не значениями по умолчанию null, а новыми созданными массивами с меньшей на единицу размерностью. Если заполнена вторая пара скобок, то можно заполнить третью, и так далее.

Аналогично, для создания многомерных массивов можно использовать инициализаторы. В этом случае применяется столько вложенных фигурных скобок, сколько требуется:

int i[][] = {{1,2}, null, {3}, {}};

В этом примере порождается четыре объекта. Это, во-первых, массив массивов длиной 4, а во-вторых, три массива чисел с длинами 2, 1, 0, соответственно.

Все рассмотренные примеры и утверждения одинаково верны для многомерных массивов, основанных как на примитивных, так и на ссылочных типах.

Класс массива

Поскольку массив является объектным типом данных, можно попытаться представить себе, как выглядело бы объявление класса такого типа. На самом деле эти объявления не хранятся в файлах, или еще каком-нибудь формате. Учитывая, что массив может быть объявлен на основе любого типа и иметь произвольную размерность, это физически невыполнимо, да и не требуется. Вместо этого во время выполнения приложения виртуальная машина генерирует эти объявления динамически на основе базового типа и размерности, а затем они хранятся в памяти в виде таких же экземпляров класса Class, как и для любых других типов.

Рассмотрим гипотетическое объявление класса для массива, основанного на неком объектном типе Element.

Объявление класса начинается с перечисления модификаторов, среди которых особую роль играют модификаторы доступа. Класс массива будет иметь такой же уровень доступа, как и базовый тип. То есть если Element объявлен как public -класс, то и массив будет иметь уровень доступа public. Для любого примитивного типа класс массива будет public. Можно также указать модификатор final, поскольку никакой класс не может наследоваться от класса массива.

Затем следует имя класса, на котором можно подробно не останавливаться, т.к. к типу массив обращение идет не по его имени, а по имени базового типа и набору квадратных скобок.

Затем нужно указать родительский класс. Все массивы наследуются напрямую от класса Object. Далее перечисляются интерфейсы, которые реализует класс. Для массива это будут интерфейсы Cloneable и Serializable. Первый из них подробно рассматривается в конце этой лекции, а второй будет описан в следующих лекциях.

Тело класса содержит объявление одного public final поля length типа int. Кроме того, переопределен метод clone() для поддержки интерфейса Cloneable.

Сведем все вышесказанное в формальную запись класса:

[public] class A implements Cloneable,

java.io.Serializable {

public final int length;

// инициализируется при создании

public Object clone() {

try {

return super.clone();

}

catch (CloneNotSupportedException e) {

throw new InternalError(e.getMessage());

}

}

}

Таким образом, экземпляр типа массив является полноценным объектом, который, в частности, наследует все методы, определенные в классе Object, например, toString(), hashCode() и остальные.

Например:

// результат работы метода toString()

System.out.println(new int[3]);

System.out.println(new int[3][5]);

System.out.println(new String[2]);

// результат работы метода hashCode()

System.out.println(new float[2].hashCode());

Результатом выполнения программы будет:

[I@26b249

[[I@82f0db

[Ljava.lang.String;@92d342

7051261

Преобразование типов для массивов

Теперь, когда массив введен как полноценный тип данных в Java, рассмотрим, какое влияние он окажет на преобразование типов.

Ранее подробно рассматривались переходы между примитивными и обычными (не являющимися массивами) ссылочными типами. Хотя массивы являются объектными типами, их также будет полезно разделить по базовому типу на две группы – основанные на примитивном или ссылочном типе.

Имейте в виду, что переходы между массивами и примитивными типами являются запрещенными. Преобразования между массивами и другими объектными типами возможны только для класса Object и интерфейсов Cloneable и Serializable. Массив всегда можно привести к этим трем типам, обратный же переход является сужением и должен производиться явным образом по усмотрению разработчика. Таким образом, интерес представляют только переходы между разными типами массивов. Очевидно, что массив, основанный на примитивном типе, принципиально нельзя преобразовать к типу массива, основанному на ссылочном типе, и наоборот.

Пока не будем останавливаться на этом подробно, однако заметим, что преобразования между типами массивов, основанных на различных примитивных типах, невозможны ни при каких условиях.

Для ссылочных же типов такого строгого правила нет. Например, если создать экземпляр массива, основанного на типе Child, то ссылку на него можно привести к типу массива, основанного на типе Parent.

Child c[] = new Child[3];

Parent p[] = c;

Вообще, существует универсальное правило: массив, основанный на типе A, можно привести к массиву, основанному на типе B, если сам тип A приводится к типу B.

// если допустимо такое приведение:

B b = (B) new A();

// то допустимо и приведение массивов:

B b[]=(B[]) new A[3];

Применяя это правило рекурсивно, можно преобразовывать многомерные массивы. Например, массив Child[][] можно привести к Parent[][], так как их базовые типы приводимы ( Child[] к Parent[] ) также на основе этого правила (поскольку базовые типы Child и Parent приводимы в силу правил наследования).

Как обычно, расширения можно проводить неявно (как в предыдущем примере), а сужения – только явным приведением.

Вернемся к массивам, основанным на примитивном типе. Невозможность их участия в преобразованиях типов связана, конечно, с различиями между простыми и ссылочными типами данных. Поскольку элементами объектных массивов являются ссылки, они легко могут участвовать в приведении. Напротив, элементы простых типов действительно хранят числовые или булевские значения. Предположим, такое преобразование осуществимо:

// пример вызовет ошибку компиляции

byte b[]= {1, 2, 3};

int i[]=b;

В таком случае, элементы b[0] и i[0] хранили бы значения разных типов. Стало быть, преобразование потребовало бы копирования с одновременным преобразованием типа всех элементов исходного массива. В результате был бы создан новый массив, элементы которого равнялись бы по значению элементам исходного массива.

Но преобразование типа не может порождать новые объекты. Такие операции должны выполняться только явным образом с применением ключевого слова new. По этой причине преобразования типов массивов, основанных на примитивных типах, запрещены.

Если же копирование элементов действительно требуется, то нужно сначала создать новый массив, а затем воспользоваться стандартной функцией System.arraycopy(), которая эффективно выполняет копирование элементов одного массива в другой.

Ошибка ArrayStoreException

Преобразование между типами массивов, основанных на ссылочных типах, может стать причиной одной довольно неочевидной ошибки.

Рассмотрим пример:

Child c[] = new Child[5];

Parent p[]=c;

p[0]=new Parent();

С точки зрения компилятора код совершенно корректен. Преобразование во второй строке допустимо. В третьей строке элементу массива типа Parent присваивается значение того же типа.

Однако при выполнении такой программы возникнет ошибка. Нельзя забывать, что преобразование не меняет объект, изменяется лишь способ доступа к нему. В свою очередь, объект всегда «помнит», от какого типа он был порожден. С учетом этих замечаний становится ясно, что в третьей строке делается попытка добавить в массив Child значение типа Parent, что некорректно.

Действительно, ведь переменная с продолжает ссылаться на этот массив, а значит, следующей строкой может быть такое обращение:

c[0].onlyChildMethod();

где метод onlyChildMethod() определен только в классе Child. Данное обращение совершенно корректно, а значит, недопустима ситуация, когда элемент c[0] ссылается на объект, несовместимый с Child.

Таким образом, несмотря на отсутствие ошибок компиляции, виртуальная машина при выполнении программы всегда осуществляет дополнительную проверку перед присвоением значения элементу массива. Необходимо удостовериться, что реальный массив, существующий на момент исполнения, действительно может хранить присваиваемое значение. Если это условие нарушается, то возникает ошибка, которая называется ArrayStoreException.

Может сложиться впечатление, что разобранная ситуация является надуманной,– зачем преобразовывать массив и тут же задавать для него неверное значение? Однако преобразование при присвоении значений является лишь примером. Рассмотрим объявление метода:

public void process(Parent[] p) {

if (p!=null && p.length>0) {

p[0]=new Parent();

}

}

Метод выглядит абсолютно корректным, все потенциально ошибочные ситуации проверяются if -выражением. Однако следующий вызов этого метода все равно приводит к ошибке:

process(new Child[3]);

И это будет как раз ошибка ArrayStoreException.

Переменные типа массив и их значения

Завершим описание взаимосвязи типа переменной и типа значений, которые она может хранить.

Как обычно, массивы, основанные на простых и ссылочных типах, мы описываем раздельно.

Переменная типа массив примитивных величин может хранить значения только точно такого же типа, либо null.

Переменная типа «массив ссылочных величин» может хранить следующие значения:

null ;

значения точно такого же типа, что и тип переменной;

все значения типа массив, основанный на типе, приводимом к базовому типу исходного массива.

Все эти утверждения непосредственно следуют из рассмотренных выше особенностей приведения типов массивов.

Еще раз напомним про исключительный класс Object. Переменные такого типа могут ссылаться на любые объекты, порожденные как от классов, так и от массивов.

Сведем все эти утверждения в таблицу.

Таблица Табл. 9.1.. Тип переменной и тип ее значения.

Тип переменной

Допустимые типы ее значения

Массив простых чисел

* null

* в точности совпадающий с типом переменной

Массив ссылочных значений

* null

* совпадающий с типом переменной

* массивы ссылочных значений, удовлетворяющих следующему условию: если тип переменной – массив на основе типа A, то значение типа массив на основе типа B допустимо тогда и только тогда, когда B приводимо к A

Object

* null

* любой ссылочный, включая массивы

Клонирование

Механизм клонирования, как следует из названия, позволяет порождать новые объекты на основе существующего, которые обладали бы точно таким же состоянием, что и исходный. То есть ожидается, что для исходного объекта, представленного ссылкой x, и результата клонирования, возвращаемого методом x.clone(), выражение

x == x.clone()

должно быть истинным, как и выражение

x.clone().getClass() == x.getClass()

Наконец, выражение

x.equals(x.clone())

также верно. Реализация такого метода clone() осложняется целым рядом потенциальных проблем, например:

* класс, от которого порожден объект, может иметь разнообразные конструкторы, которые к тому же могут быть недоступны (например, модификатор доступа private );

* цепочка наследования, которой принадлежит исходный класс, может быть довольно длинной, и каждый родительский класс может иметь свои поля – недоступные, но важные для воссоздания состояния исходного объекта;

* в зависимости от логики реализации возможна ситуация, когда не все поля должны копироваться для корректного клонирования; одни могут оказаться лишними, другие потребуют дополнительных вычислений или преобразований;

* возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы.

Поэтому было реализовано следующее решение.

Класс Object содержит метод clone(). Рассмотрим его объявление:

protected native Object clone()

throws CloneNotSupportedException;

Именно он используется для клонирования. Далее возможны два варианта.

Первый вариант: разработчик может в своем классе переопределить этот метод и реализовать его по своему усмотрению, решая перечисленные проблемы так, как того требует логика разрабатываемой системы. Упомянутые условия, которые должны быть истинными для клонированного объекта, не являются обязательными и программист может им не следовать, если это требуется для его класса.

Второй вариант предполагает использование реализации метода clone() в самом классе Object. То, что он объявлен как native, говорит о том, что его реализация предоставляется виртуальной машиной. Естественно, перечисленные трудности легко могут быть преодолены самой JVM, ведь она хранит в памяти все свойства объектов.

При выполнении метода clone() сначала проверяется, можно ли клонировать исходный объект. Если разработчик хочет сделать объекты своего класса доступными для клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable. В этом интерфейсе нет ни одного элемента, он служит лишь признаком для виртуальной машины, что объекты могут быть клонированы. Если проверка не выполняется успешно, метод порождает ошибку CloneNotSupportedException.

Если интерфейс Cloneable реализован, то порождается новый объект от того же класса, от которого был создан исходный объект. При этом копирование выполняется на уровне виртуальной машины, никакие конструкторы не вызываются. Затем значения всех полей, объявленных, унаследованных либо объявленных в родительских классах, копируются. Полученный объект возвращается в качестве клона.

Обратите внимание, что сам класс Object не реализует интерфейс Cloneable, а потому попытка вызова new Object().clone() будет приводить к ошибке. Метод clone() предназначен скорее для использования в наследниках, которые могут обращаться к нему с помощью выражения super.clone(). При этом могут быть сделаны следующие изменения:

* модификатор доступа расширен до public ;

* удалено предупреждение об ошибке CloneNotSupportedException ;

* результирующий объект может быть модифицирован любым способом, на усмотрение разработчика.

Напомним, что все массивы реализуют интерфейс Cloneable и, таким образом, доступны для клонирования.

Важно помнить, что все поля клонированного объекта приравниваются, их значения никогда не клонируются. Рассмотрим пример:

public class Test implements Cloneable {

Point p;

int height;

public Test(int x, int y, int z) {

p=new Point(x, y);

height=z;

}

public static void main(String s[]) {

Test t1=new Test(1, 2, 3), t2=null;

try {

t2=(Test) t1.clone();

}

catch (CloneNotSupportedException e) {

}

t1.p.x=-1;

t1.height=-1;

System.out.println(«t2.p.x=» + t2.p.x + «, t2.height=» + t2.height);

}

}

Результатом работы программы будет:

t2.p.x=-1, t2.height=3

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

А вот ссылочное поле было скопировано по ссылке, оба объекта ссылаются на один и тот же экземпляр класса Point. Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.

Этого можно избежать, если переопределить метод clone() в классе Test.

public Object clone() {

Test clone=null; try {

clone=(Test) super.clone();

}

catch (CloneNotSupportedException e) {

throw new InternalError(e.getMessage());

}

clone.p=(Point)this.p.clone();

return clone;

}

Обратите внимание, что результат метода Object.clone() приходится явно приводить к типу Test, хотя его реализация гарантирует, что клонированный объект будет порожден именно от этого класса. Однако тип возвращаемого значения в данном методе для универсальности объявлен как Object, поэтому явное сужение необходимо.

Теперь метод main можно упростить:

public static void main(String s[]) {

Test t1=new Test(1, 2, 3);

Test t2=(Test) t1.clone();

t1.p.x=-1; t1.height=-1;

System.out.println(«t2.p.x=» + t2.p.x +

«, t2.height=» + t2.height);

}

Результатом будет:

t2.p.x=1, t2.height=3

То есть теперь все поля исходного и клонированного объектов стали независимыми.

Реализация такого «неглубокого» клонирования в методе Object.clone() необходима, так как в противном случае клонирование второстепенного объекта могло бы привести к огромным затратам ресурсов, ведь этот объект может содержать ссылки на более значимые объекты, а те при клонировании также начали бы копировать свои поля, и так далее. Кроме того, типом поля клонируемого объекта может быть класс, не реализующий Cloneable, что приводило бы к дополнительным проблемам. Как показано в примере, при необходимости дополнительное копирование можно добавить самостоятельно.

Клонирование массивов

Итак, любой массив может быть клонирован. В этом разделе хотелось бы рассмотреть особенности, возникающие из-за того, что Object.clone() копирует только один объект.

Рассмотрим пример:

int a[]=

{1, 2, 3};

int b[]=(int[])a.clone();

a[0]=0;

System.out.println(b[0]);

Результатом будет единица, что вполне очевидно, так как весь массив представлен одним объектом, который не будет зависеть от своей копии. Усложняем пример:

int a[][]= {{1, 2}, {3}};

int b[][]=(int[][]) a.clone();

if (…) {

// первый вариант:

a[0]=new int[] {0};

System.out.println(b[0][0]);

} else {

// второй вариант:

a[0][0]=0;

System.out.println(b[0][0]);

}

Разберем, что будет происходить в этих двух случаях. Начнем с того, что в первой строке создается двухмерный массив, состоящий из двух одномерных. Итого три объекта. Затем, на следующей строке при клонировании будет создан новый двухмерный массив, содержащий ссылки на те же самые одномерные массивы.

Теперь несложно предсказать результат обоих вариантов. В первом случае в исходном массиве меняется ссылка, хранящаяся в первом элементе, что не принесет никаких изменений для клонированного объекта. На консоли появится 1.

Во втором случае модифицируется существующий массив, что скажется на обоих двухмерных массивах. На консоли появится 0.

Обратите внимание, что если из примера убрать условие if-else, так, чтобы отрабатывал первый вариант, а затем второй, то результатом будет опять 1, поскольку в части второго варианта модифицироваться будет уже новый массив, порожденный в части первого варианта.

Таким образом, в Java предоставляется мощный, эффективный и гибкий механизм клонирования, который легко применять и модифицировать под конкретные нужды. Особенное внимание должно уделяться копированию объектных полей, которые по умолчанию копируются только по ссылке.

Заключение

В этой лекции было рассмотрено устройство массивов в Java. Подобно массивам в других языках, они представляют собой набор значений одного типа. Основным свойством массива является длина, которая в Java может равняться нулю. В противном случае, массив обладает элементами в количестве, равном длине, к которым можно обратиться, используя индекс, изменяющийся от 0 до величины длины без единицы. Длина задается при создании массива и у созданного массива не может быть изменена. Однако она не входит в определение типа, а потому одна переменная может ссылаться на массивы одного типа с различной длиной.

Создать массив можно с помощью ключевого слова new, поскольку все массивы, включая определенные на основе примитивных значений, имеют объектный тип. Другой способ – воспользоваться инициализатором и перечислить значения всех элементов. В первом случае элементы принимают значения по умолчанию (0, false, null).

Особым образом в Java устроены многомерные массивы. Они, по сути, являются одномерными, основанными на массивах меньшей размерности. Такой подход позволяет единообразно работать с многомерными массивами. Также он дает возможность создавать не только «прямоугольные» массивы, но и массивы любой конфигурации.

Хотя массив и является ссылочным типом, работа с ним зачастую имеет некоторые особенности. Рассматриваются правила приведения типа массива. Как для любого объектного типа, приведение к Object является расширяющим. Приведение массивов, основанных на ссылочных типах, во многом подчиняется обычным правилам. А вот примитивные массивы преобразовывать нельзя. С преобразованиями связано и возникновение ошибки ArrayStoreException, причина которой – невозможность точного отслеживания типов в преобразованном массиве для компилятора.

В заключение рассматриваются последние случаи взаимосвязи типа переменной и ее значения.

Наконец, изучается механизм клонирования, существующий с самых первых версий Java и позволяющий создавать точные копии объектов, если их классы позволяют это делать, реализуя интерфейс Cloneable. Поскольку стандартное клонирование порождает только один новый объект, это приводит к особым эффектам при работе с объектными полями классов и массивами.

вариант: разработчик может в своем классе переопределить этот метод и реализовать его по своему усмотрению, решая перечисленные проблемы так, как того требует логика разрабатываемой системы. Упомянутые условия, которые должны быть истинными для клонированного объекта, не являются обязательными и программист может им не следовать, если это требуется для его класса.

Второй вариант предполагает использование реализации метода clone() в самом классе Object. То, что он объявлен как native, говорит о том, что его реализация предоставляется виртуальной машиной. Естественно, перечисленные трудности легко могут быть преодолены самой JVM, ведь она хранит в памяти все свойства объектов.

При выполнении метода clone() сначала проверяется, можно ли клонировать исходный объект. Если разработчик хочет сделать объекты своего класса доступными для клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable. В этом интерфейсе нет ни одного элемента, он служит лишь признаком для виртуальной машины, что объекты могут быть клонированы. Если проверка не выполняется успешно, метод порождает ошибку CloneNotSupportedException.

Если интерфейс Cloneable реализован, то порождается новый объект от того же класса, от которого был создан исходный объект. При этом копирование выполняется на уровне виртуальной машины, никакие конструкторы не вызываются. Затем значения всех полей, объявленных, унаследованных либо объявленных в родительских классах, копируются. Полученный объект возвращается в качестве клона.

Обратите внимание, что сам класс Object не реализует интерфейс Cloneable, а потому попытка вызова new Object ().clone() будет приводить к ошибке. Метод clone() предназначен скорее для использования в наследниках, которые могут обращаться к нему с помощью выражения super.clone(). При этом могут быть сделаны следующие изменения:

модификатор доступа расширен до public ;

удалено предупреждение об ошибке CloneNotSupportedException ;

результирующий объект может быть модифицирован любым способом, на усмотрение разработчика.

Напомним, что все массивы реализуют интерфейс Cloneable и, таким образом, доступны для клонирования.

Важно помнить, что все поля клонированного объекта приравниваются, их значения никогда не клонируются. Рассмотрим пример:

public class Test implements Cloneable { Point p; int height; public Test(int x, int y, int z) { p=new Point(x, y); height=z; } public static void main(String s[]) { Test t1=new Test(1, 2, 3), t2=null; try { t2=(Test) t1.clone(); } catch (CloneNotSupportedException e) {} t1.p.x=-1; t1.height=-1; System.out.println(‘t2.p.x=’ + t2.p.x + ‘, t2.height=’ + t2.height); } }

Результатом работы программы будет:

t2.p.x=-1, t2.height=3

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

А вот ссылочное поле было скопировано по ссылке, оба объекта ссылаются на один и тот же экземпляр класса Point. Поэтому изменения, происходящие с исходным объектом, сказываются на клонированном.

Этого можно избежать, если переопределить метод clone() в классе Test.

public Object clone() { Test clone=null; try { clone=(Test) super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); } clone.p=(Point)this.p.clone(); return clone; }

Обратите внимание, что результат метода Object.clone() приходится явно приводить к типу Test, хотя его реализация гарантирует, что клонированный объект будет порожден именно от этого класса. Однако тип возвращаемого значения в данном методе для универсальности объявлен как Object, поэтому явное сужение необходимо.

Теперь метод main можно упростить:

public static void main(String s[]) { Test t1=new Test(1, 2, 3); Test t2=(Test) t1.clone(); t1.p.x=-1; t1.height=-1; System.out.println(‘t2.p.x=’ + t2.p.x + ‘, t2.height=’ + t2.height); }

Результатом будет:

t2.p.x=1, t2.height=3

То есть теперь все поля исходного и клонированного объектов стали независимыми.

Реализация такого ‘неглубокого’ клонирования в методе Object.clone() необходима, так как в противном случае клонирование второстепенного объекта могло бы привести к огромным затратам ресурсов, ведь этот объект может содержать ссылки на более значимые объекты, а те при клонировании также начали бы копировать свои поля, и так далее. Кроме того, типом

Все эти утверждения непосредственно следуют из рассмотренных выше особенностей приведения типов массивов.

Еще раз напомним про исключительный класс Object. Переменные такого типа могут ссылаться на любые объекты, порожденные как от классов, так и от массивов.

Сведем все эти утверждения в таблицу.

Таблица Табл. 9.1..
Тип переменной и тип ее значения.Тип переменнойДопустимые типы ее значенияМассив простых чисел

null

в точности совпадающий с типом переменной

Массив ссылочных значений

null

совпадающий с типом переменной

массивы ссылочных значений, удовлетворяющих следующему условию: если тип переменной – массив на основе типа A, то значение типа массив на основе типа B допустимо тогда и только тогда, когда B приводимо к A

Object

null

любой ссылочный, включая массивы

Клонирование

Механизм
клонирования, как следует из названия, позволяет порождать новые
объекты на основе существующего, которые обладали бы точно таким же
состоянием, что и исходный. То есть ожидается, что для исходного
объекта, представленного ссылкой x, и результата клонирования, возвращаемого методом x.clone(), выражение

x == x.clone()

должно быть истинным, как и выражение

x.clone().getClass() == x.getClass()

Наконец, выражение

x.equals(x.clone())

также верно. Реализация такого метода clone() осложняется целым рядом потенциальных проблем, например:

класс,
от которого порожден объект, может иметь разнообразные конструкторы,
которые к тому же могут быть недоступны (например, модификатор доступа private );

цепочка
наследования, которой принадлежит исходный класс, может быть довольно
длинной, и каждый родительский класс может иметь свои поля –
недоступные, но важные для воссоздания состояния исходного объекта;

в
зависимости от логики реализации возможна ситуация, когда не все поля
должны копироваться для корректного клонирования; одни могут оказаться
лишними, другие потребуют дополнительных вычислений или преобразований;

возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы.

Поэтому было реализовано следующее решение.

Класс Object содержит метод clone(). Рассмотрим его объявление:

protected native Object clone()
throws CloneNotSupportedException;

Именно он используется для клонирования. Далее возможны два варианта.

Первый
вариант: разработчик может в своем классе переопределить этот метод и
реализовать его по своему усмотрению, решая перечисленные проблемы так,
как того требует логика разрабатываемой системы. Упомянутые условия,
которые должны быть истинными для клонированного объекта, не являются
обязательными и программист может им не следовать, если это требуется
для его класса.

Второй вариант предполагает использование реализации метода clone() в самом классе Object. То, что он объявлен как native,
говорит о том, что его реализация предоставляется виртуальной машиной.
Естественно, перечисленные трудности легко могут быть преодолены самой
JVM, ведь она хранит в памяти все свойства объектов.

При выполнении метода clone()
сначала проверяется, можно ли клонировать исходный объект. Если
разработчик хочет сделать объекты своего класса доступными для
клонирования через Object.clone(), то он должен реализовать в своем классе интерфейс Cloneable.
В этом интерфейсе нет ни одного элемента, он служит лишь признаком для
виртуальной машины, что объекты могут быть клонированы. Если проверка не
выполняется успешно, метод порождает ошибку CloneNotSupportedException.

Если интерфейс Cloneable
реализован, то порождается новый объект от того же класса, от которого
был создан исходный объект. При этом копирование выполняется на уровне
виртуальной машины, никакие конструкторы не вызываются. Затем значения
всех полей, объявленных, унаследованных либо объявленных в родительских
классах, копируются. Полученный объект возвращается в качестве клона.

Обратите внимание, что сам класс Object не реализует интерфейс Cloneable, а потому попытка вызова new Object().clone() будет приводить к ошибке. Метод clone() предназначен скорее для использования в наследниках, которые могут обращаться к нему с помощью выражения super.clone(). При этом могут быть сделаны следующие изменения:

модификатор доступа расширен до public ;

удалено предупреждение об ошибке CloneNotSupportedException ;

результирующий объект может быть модифицирован любым способом, на усмотрение разработчика.

Напомним, что все массивы реализуют интерфейс Cloneable и, таким образом, доступны для клонирования.

When i try to clone a generic Object i get compile time error . why?

    Object obj=new Object();
    obj.clone();  // Here compile time error "The method clone() from the type Object is not visible"

Every class extends Object class and clone method is protected in Object class.

protected methods can be accessed in same package as well as by subclasses and all classes are child of java.lang.Object.

asked Jul 5, 2012 at 12:56

amicngh's user avatar

1

Because clone is protected in the Object class. It’s not public.

The only way to get access to an object’s clone() method is to know it has a compile-time type that has a public clone() method.

answered Jul 5, 2012 at 12:57

Louis Wasserman's user avatar

Louis WassermanLouis Wasserman

190k25 gold badges340 silver badges413 bronze badges

3

This will be the minimum to get clone working:

public class SubObj implements Cloneable {
  public Object clone() { return super.clone(); }
}

answered Jul 5, 2012 at 13:01

Marko Topolnik's user avatar

Marko TopolnikMarko Topolnik

195k28 gold badges317 silver badges433 bronze badges

Per the Java SE docs:

The class Object does not itself implement the interface Cloneable, so
calling the clone method on an object whose class is Object will
result in throwing an exception at run time.

answered Jul 5, 2012 at 12:59

Steve Townsend's user avatar

Steve TownsendSteve Townsend

53.4k9 gold badges91 silver badges140 bronze badges

4

protected fields can be accessed only from inside the same package, thus clone() method of Object class can be accessed only from any class that is located in java.lang package.

answered Jul 5, 2012 at 13:01

Eng.Fouad's user avatar

Eng.FouadEng.Fouad

115k70 gold badges312 silver badges416 bronze badges

You must explicitely implements Cloneable interface.
see this thread which give explanations.

answered Jul 5, 2012 at 12:58

Arcadien's user avatar

ArcadienArcadien

2,25816 silver badges26 bronze badges

If you use Groovy so that you can bypass the java compilation error, you get this:

Exception in thread "main" java.lang.CloneNotSupportedException: java.lang.Object
    at java.lang.Object.clone(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:912)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:756)
    at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:766)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:754)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:170)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0(ScriptBytecodeAdapter.java:198)
    at regexTests.main(regexTests.groovy:19)
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]

If you read the clone API (I will link it) it says that if the Interface isn’t implemented, then calling *.clone() will throw a CloneNotSupportedException.

Link to the clone API for java.lang.Object
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29

[EDIT]
The Original Question™ asked for why this method is visible in the way it is. This is because it only accessible to methods within the java.lang package. It isn’t intended for a programmer to be able to clone an Object. Throwing a CloneNotSupportedException is exactly what you want to do if you don’t want your OWN object cloned.

answered Jul 5, 2012 at 13:08

avgvstvs's user avatar

avgvstvsavgvstvs

6,1766 gold badges43 silver badges74 bronze badges

 void method() {

    Object obj=new Object(); //Object is a parent class, it's not inherit from any other class...     
    obj.clone();        //  compile time error   

}

We can’t access the protected method of «Has A» relationship from different package, because your Class package is (com.xxx.yyy) and an Object class package is (java.lang) both the classes are in different package.

protected methods can be accessed in same package as well as by subclasses(IS A relationship)

BetaRide's user avatar

BetaRide

16.1k29 gold badges97 silver badges175 bronze badges

answered Aug 12, 2014 at 7:00

Ratheesh's user avatar

RatheeshRatheesh

6118 silver badges8 bronze badges

I tried this code :

public final class User {


    private String name;
    private boolean isActive;
    private String userId;
    private Address address;


    // can be constructed using this constructor ONLY !
    public User(String name, boolean isActive, String userId, Address address) {
        this.name = name;
        this.isActive = isActive;
        this.userId = userId;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public boolean isActive() {
        return isActive;
    }

    public String getUserId() {
        return userId;
    }

    public Address getAddress() {
        return address;
    }

    protected Object cloneMe() throws CloneNotSupportedException {
        return super.clone(); // throws CloneNotSupportedException
    }
}

public class CloneNotSupportedException
extends Exception

Thrown to indicate that the clone method in class Object has been
called to clone an object, but that the object’s class does not
implement the Cloneable interface. Applications that override the
clone method can also throw this exception to indicate that an object
could not or should not be cloned.

Object doesn’t implement any interface and to make my User class work it must implement Cloneable

answered Feb 17, 2016 at 14:00

Adelin's user avatar

AdelinAdelin

17.9k25 gold badges114 silver badges173 bronze badges

Object class clone() method has modified by protected access modifier in the API level. So we can’t access it anywhere without inheritance. So before we invoke object class clone() method you need to implements Cloneable interface. Then Code will run at runtime properly. Otherwise it will generate CloneNotSupportedException at runtime.

/*Subclass is my implementing class */

public class SubClass implements Cloneable {

    @Override
    public SubClass clone() throws CloneNotSupportedException {
        return (SubClass) super.clone();
    }
}

ChrisMM's user avatar

ChrisMM

8,44913 gold badges29 silver badges48 bronze badges

answered Dec 8, 2019 at 2:19

Manoj Ekanayaka's user avatar

import java.util.Scanner;
import java.util.jar.Attributes.Name;
import java.util.Arrays;
public class Main{
    public class man{
        protected void name() {
            System.out.println("hei");
        }
    }
    public class people extends man{
        public int age;

        public int getAge() {
            name();
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "people [age=" + age + "]";
        }
        
        public Object myclone() throws CloneNotSupportedException {
            return this.clone();
        }
    }
    
    public void test() throws CloneNotSupportedException {
        
        people p1 = new people();
        p1.setAge(10);
        System.out.println(p1);
//      NG:
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();
        p1.setAge(10);
        System.out.println(p1);
        System.out.println(p2);
    }
    public static void main(String args[]) throws CloneNotSupportedException{
        new Main().test();
        
    }
}

see the NG code and ok code.

//      NG for:The method clone() from the type Object is not visible
        people p2 = (people)p1.clone();
//      Ok
        people p3 = (people)p1.myclone();

why?
cause test() is not belong to the subclass.
so even though call clone() by peopel object p1,it is not the place of peopel object.
The myclone() is the exactly the place of people object.

Arghya Sadhu's user avatar

Arghya Sadhu

40.4k9 gold badges78 silver badges107 bronze badges

answered Aug 29, 2020 at 15:19

andrea wang's user avatar

Главная / Программирование /
Программирование на Java / Тест 9

Упражнение 1:


Номер 1

Сколько ошибок компиляции и ошибок времени выполнения в следующем примере?
                
                    int b[] = new int[5];
                    for (int i = 0; i <= b.length(); i++) {
                        b[i] = Math.sqrt(i);
                    }
                
            

Ответ:

(1)

(2)

(3)

(4)

(5)


Номер 2

Сколько ошибок компиляции и ошибок времени выполнения в следующем примере?
                
                    int b[] = new int[5];
                    for (int i = 0; i < b.length(); i++) {
                        b[i] = Math.sqrt(i);
                    }
                
            

Ответ:

(1)

(2)

(3)

(4)

(5)


Упражнение 2:


Номер 1

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?
                
                    public class SomeClass {
                        public static void main(String[] args) {
                            ____
                            for (int i = 0; i < b.length; i++) {
                                System.out.print(b[i]);
                            }
                        }
                    }
                
            

Ответ:

(1) int b[] = new int[]; 

(2) int b[] = new int[3]; 

(3) int b[]; 

(4) int b[3]; 

(5) int b[] = new int[] {0}; 


Номер 2

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?
                
                    public class SomeClass {
                        public static void main(String[] args) {
                            ____
                            for (int i = 0; i < b.length; i++) {
                                System.out.print(b[i]);
                            }
                        }
                    }
                
            

Ответ:

(1) int b[3] = new int[] {0,0,0}; 

(2) int b[] = new int[3] {0,0,0}; 

(3) int b[] = new int[] {0,0,0}; 

(4) int b[3] = new int[3] {0,0,0}; 

(5) int b[] = new {0,0,0}; 


Номер 3

Что нужно подставить вместо знаков подчеркивания, чтобы программа вывела на экран "000"?
                
                    public class SomeClass {
                        public static void main(String[] args) {
                            ____
                            for (int i = 0; i < b.length; i++) {
                                System.out.print(b[i]);
                            }
                        }
                    }
                
            

Ответ:

(1) int b[] = new {0,0,0}; 

(2) int b[3] = [0,0,0]; 

(3) int b[] = {0,0,0}; 

(4) int b[] = [0,0,0]; 


Упражнение 3:


Номер 1

Сколько объектов порождается при инициализации массива new int[3][4]?

Ответ:

(1) 1 

(2) 2 

(3) 3 

(4) 4 

(5) ни одного, так как код не будет скомпилирован 


Номер 2

Сколько объектов порождается при инициализации массива
                new int[3][]?
            

Ответ:

(1) 1 

(2) 2 

(3) 3 

(4) 4 

(5) ни одного, так как код не будет скомпилирован 


Номер 3

Сколько объектов порождается при инициализации массива
                new int[][3]?
            

Ответ:

(1) 1 

(2) 2 

(3) 3 

(4) 4 

(5) ни одного, так как код не будет скомпилирован 


Упражнение 4:


Номер 1

Какое утверждение относительно приведения массивов верно

Ответ:

(1) любые массивы приводимы, поскольку являются объектами 

(2) A[] можно привести кB[], если A приводится к B 

(3) A[] можно привести к B[], если A приводится к B, и A, B – ссылочные типы  

(4) массивы не преобразовываются 


Номер 2

Какие утверждения относительно приведения массивов верны

Ответ:

(1) преобразования между типами массивов, основанных на различных примитивных типах, запрещены 

(2)
A[] можно привести кB[], если A приводится кB, иA,
B – ссылочные типы  

(3) массивы не преобразовываются 

(4) A[] можно привести кB[], если A
приводится к B 


Номер 3

Какое утверждение относительно приведения массивов верно?

Ответ:

(1) многомерные массивы преобразовывать нельзя 

(2) любые массивы приводимы, поскольку являются объектами 

(3)
A[] можно привести к B[], если A приводится к B, и A,
B – примитивные типы  

(4) массивы не преобразовываются 

(5) ничего из перечисленного 


Упражнение 5:


Номер 1

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?
                public class Vehicle {
                    public static void main(String[] args) {
                        Vehicle[] v = new Car[5];
                        ...
                    }
                    public void setVehicles(Vehicle c[]) {
                        c[0] = new Vehicle();
                    }
                    public void setVehicles2(Vehicle c[]) {
                        if (c[0] instanceof Vehicle) {
                            c[0] = new Vehicle();
                        }
                    }
                    public void setVehicles3(Car c[]) {
                        if (c[0] instanceof Car) {
                            c[0] = new Car();
                        }
                    }
                }
                class Car extends Vehicle{}
            

Ответ:

(1) setVehicles 

(2) setVehicles2 

(3) setVehicles3 


Номер 2

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?
                public class Vehicle {
                    public static void main(String[] args) {
                        Vehicle[] v = new Car[] { new Car()};
                        ...
                    }
                    public void setVehicles(Vehicle c[]) {
                        c[0] = new Vehicle();
                    }
                    public void setVehicles2(Vehicle c[]) {
                        if (c[0] instanceof Car) {
                            c[0] = new Vehicle();
                        }
                    }
                    public void setVehicles3(Vehicle c[]) {
                        if (c[0] instanceof Vehicle) {
                            c[0] = new Car();
                        }
                    }
                }
                class Car extends Vehicle{}
            

Ответ:

(1) setVehicles 

(2) setVehicles2 

(3) setVehicles3 

(4) setVehicles и setVehicles3 

(5) setVehicles и setVehicles2 


Номер 3

Какой метод сгенерирует ошибку ArrayStoreException при передаче в него массива v?
                public class Vehicle {
                    public static void main(String[] args) {
                        Vehicle[] v = new Car[] { new Car()};
                        ...
                    }
                    public void setVehicles(Vehicle c[]) {
                        c[0] = new Vehicle();
                    }
                    public void setVehicles2(Vehicle c[]) {
                        if (c[0] instanceof Vehicle) {
                            c[0] = new Car();
                        }
                    }
                    public void setVehicles3(Vehicle c[]) {
                        if (c[0] instanceof Car) {
                            c[0] = new Vehicle();
                        }
                    }
                }
                class Car extends Vehicle{}
            

Ответ:

(1) setVehicles 

(2) setVehicles2 

(3) setVehicles3 

(4) setVehicles и setVehicles3 

(5) setVehicles и setVehicles2 


Упражнение 6:


Номер 1

От какого класса наследуются классы массивов?

Ответ:

(1) особый класс для массивов 

(2) Object 

(3) одномерные массивы – отObject, двумерные – от одномерных и т.д. 

(4) ни от какого 


Номер 2

От какого класса наследуются классы двумерных массивов?

Ответ:

(1) особый класс для массивов 

(2) Object 

(3) от классов одномерных массивов 

(4) ни от какого 


Номер 3

Может ли массив основываться на абстрактных классах? Интерфейсах?

Ответ:

(1) да, да 

(2) да, нет 

(3) нет, да 

(4) нет, нет 


Упражнение 7:


Номер 1

Какие утверждения относительно клонирования верны?

Ответ:

(1) выражение x == x.clone() должно быть истинным 

(2) выражение x.clone().getClass() == x.getClass() может быть ложным 

(3) выражение x.equals(x.clone()) должно быть истинным 

(4) для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс IsCloneable 

(5) попытка вызова new Object().clone() не приведет к ошибке 


Номер 2

Какие утверждения относительно клонирования верны?

Ответ:

(1) для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс Cloneable 

(2) массивы не реализуют интерфейс Cloneable 

(3) выражение x == x.clone() может быть ложным 

(4) возможна ситуация, когда объект нельзя клонировать, дабы не нарушить целостность системы 

(5) выражение x.clone().getClass() == x.getClass() может быть ложным 


Номер 3

Какие утверждения относительно клонирования верны?

Ответ:

(1) выражение x.clone().getClass() == x.getClass() должно быть истинным 

(2) выражение x == x.clone() должно быть ложным 

(3) попытка вызова new Object().clone() не приведет к ошибке 

(4) попытка вызова new Object().clone() приведет к ошибке 


Упражнение 8:


Номер 1

Что будет выведено на экран в результате выполнения следующего кода: 
                public class SomeClass {
                    public static void main(String[] args) {
                        int a[] = {1, 2, 3};
                        int b[] = (int[]) a.clone();
                        a[0] = 0;
                        System.out.print(b[0]);
                        System.out.print(b[1]);
                        System.out.print(b[2]);
                    }
                }
            

Ответ:

(1) 023 

(2) 123 

(3) сообщение об ошибке компиляции 

(4) сообщение об ошибке времени исполнения 


Номер 2

Что будет выведено на экран в результате выполнения следующего кода: 

public class SomeClass {
            public static void main(String[] args) {
                        int a[][] = {{1, 2}, {3}};
                        int b[][] = (int[][]) a.clone();
                        a[0] = new int[]{0};
                        System.out.println(b[0][0]);
             }
}

Ответ:

(1) 0 

(2) 0, 2 

(3) 1 

(4) 1, 2 

(5) сообщение об ошибке времени исполнения 


Номер 3

Что будет выведено на экран в результате выполнения следующего кода:  public class SomeClass {
  public static void main(String[] args) {
      int a[] = {1, 2, 3};
      int b[] = (int[]) a.clone();
      a[0] = 0;
      System.out.print(b[0]);
    }
}

Ответ:

(1) 0 

(2) 0, 2 

(3) 1 

(4) 1, 2 

(5) сообщение об ошибке времени исполнения 


попытка вызова new Object().clone() не приведет к ошибке

выражение x.clone().getClass() == x.getClass() может быть ложным

выражение x.equals(x.clone()) должно быть истинным(Верный ответ)

выражение x == x.clone() должно быть истинным(Верный ответ)

для того, чтобы иметь возможность вызвать метод Clone() у объекта, класс объекта должен реализовать интерфейс IsCloneable

Возможно, вам также будет интересно:

  • Популяция представляет собой совокупность свободно скрещивающихся особей разных видов найдите ошибки
  • Популярный шлягер лексическая ошибка или нет
  • Популярный хит лексическая ошибка
  • Популярные орфоэпические ошибки примеры
  • Попробуйте яблоневый джем я сама готовила ошибка

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии