Что такое Instance (инстансы) в Java?
Добрый день!
Недавно начал изучать Java (по урокам Hexlet), и столкнулся с таким вопросом:
«Что такое Instance в Java и для чего они вообще нужны»?
Как я понял, экземпляр класса в Java создаётся так:
class Main public static void main(String. args) Game game = new Game();
>
>
Первое слово Game — это инстанс?
Почему нельзя написать так:
Просто до этого изучал php, там экземпляры классов примерно так объявлялись.
Пока из-за этой темы не могу перейти к следующим урокам, так там «эти» инстансы везде используются.
Объясните пожалуйста новичку :))
Голосование за лучший ответ
instance это экземпляр класса (объект). Т. е. game это ссылка на instance (а поскольку в java все объекты доступны только по ссылке, можно говорить просто instance).
Game game = new Game();
объявляется переменная game типа Game и инициализируется созданным здесь же новым экземпляром (инстансом) Game
Почему нельзя написать так: game = new Game(); можно, если game объявлена ранее — язык то строго типизированный.
asdf ghjkПрофи (579) 6 лет назад
game это ссылка на Game? А что хранится в game и Game?
Game game; Обозначает создать объект game из класса Game. = new Game() — Выделяется память под новый объект размером в Game. При создании переменой вы должны указать что это за переменная (что бы виртуальная машина знала сколько места под переменную выделить). Если вы напишите Game game — то по идее память сразу будет выделена при компиляции (я учусь на си++ поэтому все таки джава существенно отливается, но принципы похожи) при использовании new Game() память выделиться только в момент этой инструкции из оперативы. Возможно в джава немного подругому.
Что такое инстанс в java
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.
Оператор instanceof . Определение типа объекта. Примеры
Оператор instanceof используется для определения типа объекта во время выполнения программы. Определив тип объекта можно реализовать корректное приведение типов в случае, когда классы образуют иерархию. Если выполнить некорректное приведение к некоторому типу, то на этапе выполнения будет сгенерирована исключительная ситуация, что неприемлемо.
Общая форма оператора instanceof следующая
reference instanceof type
- reference – ссылка на объект (экземляр) класса;
- type – тип класса.
Результатом работы оператора instanceof есть значение true или false . Результат true возвращается в случаях:
- если ссылка reference относится к указанному типу;
- если ссылка reference может быть приведена к указанному типу.
В других случаях возвращается значение false .
2. Применение instanceof для классов, образующих иерархию. Пример
В примере демонстрируется корректное определение типа, к которому принадлежит объект класса. Реализовано два класса A и B , которые образуют иерархию. С целью демонстрации определяется тип соответствующего объекта с учетом того, что унаследованный класс расширяет возможности суперкласса.
// Оператор instanceof // Суперкласс A class A < int a; > // Класс B – наследует класс A class B extends A < int b; > public class TestInstanceOf < public static void main(String[] args) < A objA = new A(); B objB = new B(); if (objA instanceof A) System.out.println("objA is a instance of A"); else System.out.println("objA is not an instance of A"); if (objA instanceof B) System.out.println("objA can be cast to type B"); else System.out.println("objA can not be cast to type B"); if (objB instanceof A) System.out.println("objB can be cast to type A"); else System.out.println("objB can not be cast to type A"); if (objB instanceof B) System.out.println("objB is a instance of B"); else System.out.println("objB is not an instance of B"); > >
Результат выполнения программы
objA is a instance of A objA can not be cast to type B objB can be cast to type A objB is a instance of B
Как видно из результата, экземпляр унаследованного класса B может быть корректно приведен к суперклассу A . А вот экземпляр суперкласса A не может быть расширен к возможностям унаследованного класса B .
3. Применение instanceof для типа Object . Пример
В объектной модели языка Java все создаваемые классы унаследованы от класса Object . В следующем примере приходится это утверждение.
// Оператор instanceof // Суперкласс A class A < int a; > // Подкласс class B extends A < int b; > public class TestInstanceOf < public static void main(String[] args) < A objA = new A(); // экземпляр класса A B objB = new B(); // экземпляр класса B // Проверка на наследование от Object if (objA instanceof Object) System.out.println("objA can be cast to type Object"); else System.out.println("objA can not be cast to type Object"); if (objB instanceof Object) System.out.println("objB can be cast to type Object"); else System.out.println("objB can not be cast to type Object"); > >
Результат работы программы
objA can be cast to type Object objB can be cast to type Object
4. Применение instanceof для ссылки на базовый класс. Пример
Если классы образуют иерархию наследования, то ссылка на суперкласс может получать значение экземпляров любого производного класса. В примере ниже демонстрируется определение того, может ли ссылка на суперкласс быть приведена к типу производного класса.
// Оператор instanceof // Суперкласс A class A < int a; > // Подкласс B class B extends A < int b; > // Подкласс C class C extends B < int c; > // Подкласс D class D extends C < int d; > public class TestInstanceOf < public static void main(String[] args) < // экземпляры классов A, B, C, D A objA = new A(); B objB = new B(); C objC = new C(); D objD = new D(); // ссылка на суперкласс A A refA; // Ссылке на суперкласс можно присваивать значения // экземпляров (ссылок на экземпляры) производных классов refA = objA; if (refA instanceof A) System.out.println("refA is an instance of A"); else System.out.println("refA is not an instance of A"); // Перенаправить ссылку на экземпляр objB refA = objB; if (refA instanceof B) System.out.println("refA can be cast to type B"); else System.out.println("refA can not be cast to type B"); if (refA instanceof D) System.out.println("refA can be cast to type D"); else System.out.println("refA can not be cast to type D"); // Ссылка на objC refA = objC; if (refA instanceof B) System.out.println("refA can be cast to type B"); else System.out.println("refA can not be cast to type B"); > >
Результат выполнения программы
refA is an instance of A refA can be cast to type B refA can not be cast to type D refA can be cast to type B
Связанные темы
Переменные в Java
Невозможно представить программу в Java без переменных. О том, какие они бывают, как объявляются и где применяются, поговорим в этой статье.
18 октября 2017 2 минуты 19261

Автор статьи
Илья Бубнов

Автор статьи
Илья Бубнов
https://gbcdn.mrgcdn.ru/uploads/post/1253/og_cover_image/b2aa61ba3c6c8d4572b0a0f99d7b1547

Java является объектно-ориентированным языком, которому свойственна абстракция, однако для прикладных задач всегда приходится оперировать известными параметрами. В программировании они называются переменными. Чем java переменная отличается от объекта?
Всё просто – переменная является ячейкой в памяти, где хранится её значение. Любое действие – прямая работа с этим участком памяти. Объект же является более комплексной величиной. Он занимает определённый диапазон памяти, взаимодействие осуществляется через некую передаточную функцию (методы), выраженную в параметрах объекта.
В данной статье мы поговорим именно о переменных, здесь это совсем не тривиальное понятие.
Объявляются переменные java так:
Здесь же при объявлении можно присвоить значение.
тип_данных имя_переменной = значение_переменной;
Также можно объявить одновременно несколько переменных, просто перечисляя их через запятую.
тип_данных имя_переменной1, имя_переменной2…;
Классификация по принадлежности
Выделяется четыре типа java переменных:
- переменные экземпляра (instance variables);
- переменные класса (class variables);
- локальные переменные (local variables);
- параметры (parameters).
Пусть у нас есть несколько объектов одного класса Automobile(). Помимо общих параметров у них есть уникальные, скажем, максимальная скорость maxSpeed(). Их можно инициировать в теле программы, а можно хранить в нестатических полях класса (объявленных без добавления слова static). Таким образом, каждый экземпляр будет обладать индивидуальным параметром, не зависящим от скоростей других объектов.
public class Automobile< public String name; private double maxSpeed; public Automobile (String autoName)< name = autoName; >>
Переменная класса, или статическая переменная java, напротив, объявляется исключительно с применением слова static. В данном случае её значение будет одинаковым для всех экземпляров. В случае того же автомобиля, введём параметр gearsNum – число передач. Для всех экземпляров оно будет равно 6.
Необязательный модификатор final позволяет присвоить значение переменной только один раз. За соблюдением этого следит компилятор.
public class Automobile< public String model; private double maxSpeed; public static final int gearsNum = 6; >
Локальные переменные и методы в java неизменно связаны. В последних часто фигурируют вспомогательные параметры, которые в дальнейшем коде не нужны. Для объявления локальной переменной нет особой формы инициализации, границы её действия зависят лишь от места объявления. В данном случае — в фигурных скобках внутри метода. При выходе из него переменная будет уничтожена, поэтому обратиться к ней будет уже нельзя.
Крайний случай локальных переменных — это параметры. В частности, классический пример «Hello, World!»:
class HelloWorld < public static void main(String[] args) < System.out.println("Hello World!"); > >
Здесь сразу два параметра. Первая — собственно, «Hello, World!», вторая — аргумент строки args в main.
Классификация по видимости
На основании описанного выше, можно проследить ещё одно деление – по видимости переменных. Существует 4 группы:
- Public. Данный модификатор переменных доступен всем классам и объектам программы. Объявляется при помощи ключевого слова public в начале строки.
- Protected. Области видимости java переменных в этом случае ограничены текущим пакетом и подклассами. Объявляется аналогично — ключевым словом protected.
- Package protected. Модификатор переменных, доступных только внутри пакета. Объявления не требуется, отсутствие ключевых слов указывает на package protected.
- Private. Переменные, доступные исключительно внутри класса. В данном случае, определить тип переменной можно по ключевому слову private.
Несмотря на то, что приватные элементы доступны внутри класса, вопрос: «как обращаться к private java переменным?» всё же имеет ответ. Для того, чтобы иметь возможность извне поменять значение приватного параметра, достаточно внутри того же класса создать публичный метод. Например так:
class Drive< private int gears; public void setGears(int val) < gears = val; > >
Таким образом, в случае необходимости вы легко сможете изменить значение private переменной.
Указатели — ещё один вариант глобальных переменных. Вспомните, для создания экземпляра объекта мы используем следующую запись:
класс_объекта имя_указателя = new класс_объекта;
Такие переменные называются ссылочными переменными.