2013-05-05 3 views
2

Я понимаю разницу между созданием объекта и созданием переменной. Например:Разница между созданием переменной экземпляра и созданием нового объекта в Java?

private int number; 
MyClass myObj = new MyClass(); 

Но моя точка здесь в чем разница между этими двумя?

private MusicPlayer player; 
player = new MusicPlayer(); 

MusicPlayer класс, но то, что именно мы делаем здесь?

+4

Первый - это * объявление *, последнее - * инициализация *. – Maroun

ответ

4
private MusicPlayer player; 

Здесь вы создаете ссылочную переменную MusicPlayer класса (но это не создает объект) без его инициализации. Поэтому вы не можете использовать эту переменную, потому что она просто не указывает нигде (она равна нулю).

Например, используя Point класс:

Point originOne; 

может быть представлена ​​следующим образом:

enter image description here


player = new MusicPlayer(); 

Здесь вы выделяете объект типа MusicPlayer, и вы храните его в файле player ref чтобы вы могли использовать все функции на нем.

Например, используя Point класс, с x и y координаты:

Point originOne = new Point(23, 94); 

может быть представлена ​​следующим образом:

enter image description here


Сочетание этих двух линий эквивалент:

private MusicPlayer player = new MusicPlayer(); 
+0

Неверно - первый оператор делает * not * "создает объект из класса MusicPlayer". Он создает переменную, которая может ссылаться на такие объекты. –

+0

Да, вы в порядке, это просто переменная экземпляра, спасибо –

+1

Все еще не совсем верно. В первом предложении нет «этого объекта». Во втором предложении вы создаете объект, а не просто его инициализируете. И второе утверждение не эквивалентно третьему. –

2

private MusicPlayer player; Это назначает в память 4-байтовое пространство (или, возможно, больше, на 64-битных машинах), которые в конечном итоге указывают на объект в куче. Этот объект не был создан, поэтому его не существует, поэтому переменная player указывает на значение null .... но это занимает 4 байта. Это по существу похоже на сохранение имени «Stinky» для собаки, которую вы планируете иметь, но у вас ее пока нет.

player = new MusicPlayer(); Эта вещь создает в куче столько места, сколько необходимо для объекта типа MusicPlayer.Это пространство равно заголовку dunnow, сколько байтов, чтобы указать класс этого объекта и дополнительную память, необходимую для хранения объявленных им переменных экземпляра (что означает дополнительные 4 - или более - байты для каждой ссылки на объекты, объявленной как переменная экземпляра (если null) , и дополнительные байты для первичных типов данных. Это, по существу, как убедившись, что у вас есть собака под названием «Вонючка».

4
private MusicPlayer player; 

Это заявление, Это означает, что, чтобы сделать новую ссылочную переменную MusicPlayer, просто ссылка , и никакой экземпляр не будет создан. Вы не можете использовать его, поскольку он указывает на нуль.

player = new MusicPlayer(); 

MusicPlayer() вызывает конструктор MusicPlayer, new создает экземпляр MusicPlayer, = присваивает этот экземпляр ссылке player.

3

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

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

whatEver object1 = new whatEver(); 
  1. объявляет ссылочную переменный (object1) и его типа независимо
  2. создает новый() объект типа независимо
  3. присваивает ссылку на новый любой объект с переменным объектом эталонного 1
  4. присваивание допустимо, так как тип объекта и тип переменной согласен

Далее идет ...

private MusicPlayer player; 
player = new MusicPlayer(); 

Вышеупомянутый результат аналогичный, но в несколько этапов. Первая строка только устанавливает, что переменный игрок будет содержать ссылку на объект типа MusicPlayer. Java всегда хочет знать типы вещей до их использования.

Вторая строка создает новый() объект типа MusicPlayer и присваивает его ссылку переменному игроку. Назначение снова является действительным, поскольку тип объекта и тип ссылочной переменной согласуются.

+0

+1 - лучший ответ до сих пор. –

0

Ответ на этот вопрос находится в https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html.
Я буду использовать пример воображаемого Рыбы класс. При использовании метода ниже,

Fish tuna; 

оператор уведомляет компилятор, что вы будете использовать имя для обращения к данным, содержание которых имеет тип типа. С примитивной переменной это объявление также резервирует необходимый объем памяти для переменной. Если вы объявите такую ​​переменную, ее значение будет неопределенным до тех пор, пока объект не будет создан и не назначен ему.

Когда вы пишете следующее заявление,

Fish tuna = new Fish(); 

новый оператор инициализирует класс путем выделения памяти для нового объекта и возвращает ссылку на эту память. Новый оператор также вызывает конструктор объекта.

Новый оператор возвращает ссылку на созданный объект. Эта ссылка обычно присваивается переменной соответствующего типа.

Поэтому, когда вы говорите,

Fish tuna = new Fish(); 

вы создаете переменную типа рыбы, которая может содержать объект типа рыбы и с помощью нового оператора вы создаете объект этого типа и возвращает ссылку на Это.

Смежные вопросы