Бесполезен ли неэкземплярный объект в Java? - PullRequest
0 голосов
/ 28 мая 2020

Я действительно не знаю, как уточнить свой вопрос, но это то, что я имею в виду:

Car porsche = new Car(); // im creating instance of the class and i can use it to call methods etc.

Car audi; // is that piece of code useful or useless? what can i do with only this

Я не могу изменить атрибуты, как в C ++, или вызвать методы, так что я могу сделать?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Эта строка

Car porsche = new Car(); 

делает несколько вещей. new Car() - это то, что создает новый экземпляр автомобиля и возвращает ссылку на этот автомобиль. Car porsche объявляет переменную типа, которая может содержать ссылку на некоторый автомобиль. А знак равенства = инициализирует переменную (которая может содержать ссылку) ссылкой (полученной в результате выражения 'new').

Напротив,

Car audi;

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

Car audi = null;

явно инициализирует ее, чтобы вообще не ссылаться на Car.

Что касается того, полезна ли она. Что ж, одна из основных функций переменной - это изменение значения. В случае переменной Car, возможно, мы хотим, чтобы она потенциально содержала разные ссылки на автомобили.

Car audi;
if (budget > 160000)
    audi = new Car(AUDI_RS_CONVERTIBLE, NEW);
else {
    haggle_over_used_car_price();
    audi = new Car(AUDI_A3, USED); 
}

В Java очень важно понимать различие между объектом и ссылкой на объект. Переменные содержат ссылки на объекты; переменная не является объектом.

1 голос
/ 28 мая 2020

Это зависит от контекста. Но это может быть полезно когда-нибудь !

Обе строки объявляют переменную, первая напрямую назначается экземпляру объекта. Второй назначен на null

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

Car porsche;

try {
    porsche = loadMyCarFromTheGarage(); // this could throw an exception
} catch (GarageEmptyException e) {
    // handle the error, exit, recovery stuff
}

porsche.drive();
... // continue using your car outside the try/catch scope
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...