Вы неправильно понимаете некоторые вещи.
Вы не можете использовать идентификатор до его объявления. Ниже не правильно в вашем коде:
Item itSec = new Item (Pierce);
Это потому, что ты не объявлял Pierce
до этой линии. Вам не нужно создавать экземпляр класса, но вам нужен действительный идентификатор. Вы должны объявили его перед таким образом:
Person Pierce;
На данный момент идентификатор или ссылку, пустой, так сказать, или она равна null
. Все ссылки на объекты, которые не являются локальными, инициируются таким образом или равны false
или 0
, в зависимости от того, что подходит для их типа. Результат такой же, как если бы вы объявили в явном виде:
Person Pierce = null;
Но давайте двигаться дальше. Скажем, ссылка была объявлена. (Btw, Java использует camelCaseNotation
для переменных, поэтому pierce
будет верным.) Предположим, что мы находимся в точке, когда Pierce
имеет значение null или относится к некоторому объекту, мы не знаем. Теперь мы называем это:
Item itSec = new Item (Pierce);
new Item(Pierce)
вызывает конструктор public Item(Person name){...}
в классе Item, который вы должны знать. Но теперь, в этом конструкторе есть строка:
if(!(name instanceof Person)){
которого неправильно. То, что эта строка проверяет, не является, если переменная name
равна нулю или существующему объекту, но Тип переменной name
является подтипом Person
. Который всегда будет возвращать true в этом месте, поскольку заголовок функции public Item(Person name){...}
говорит следующее: функция является открытой, является конструктором, а аргумент имеет тип Person
(так Person
или подтип).
Что вы хотите сказать, вот это:
public Item(Person name){
if(name==null)){ //if the reference is empty
this.name = new Person(); //I'll explain this below
}
else{
this.name = name; //otherwise the local "name" will stay null
}
}
Я использовал this.name
и это был скачок вперед. Зачем? В вашем коде Person name = ...
, что является неправильным, так как name
не продлится после завершения конструктора. Вам нужно поле в объекте класса Item
, которое будет удерживать это значение. Так Item
класс может быть определен следующим образом:
public class Item {
Person name;
//...
}
А теперь поле name
держит значение, присвоенное в строке:
this.name = new Person();
Вы должны использовать this
к неоднозначности, какие name
вам средства , Один из них - поле класса Item, другое - Person name
параметр конструктора.
Теперь мы возвращаемся к функции main
. Если вы хотите, чтобы переменная Pierce
ссылалась на вновь созданный Person
, это еще нужно сделать. Назначение может иметь место здесь, но сначала вам нужно создать функцию в классе Item
, которая возвращает значение своего поля name
. Итак:
getName() {
return name;
}
И теперь называем его из функции main
:
Pierce = itSec.getName();
Вот и все. Наконец, эта функция не имеет смысла:
void getItem(Person name){
System.out.println(name);
}
}
Это не получить любого предмета. Он печатает только то, что вы передаете ему. И это не значит, что если вы назовете его getItem(Pierce)
, вы увидите «Пирс» на экране. Он будет вызывать функцию toString в объекте, обозначенном Pierce, и, как есть, вы получите стандартный идентификатор объекта. Но если вы определите какую-либо функцию:
void printItem() {
System.out.println(name);
}
Тогда вы можете назвать это так. Для существующего объекта itSec
:
itSec.printItem();
Что касается функции геттера, она должна вернуть то, что вы просите, но это другая история.
В этом случае вы можете использовать конструктор '0-arg'. –
Это не имеет смысла. Если 'Pierce' даже не объявлен *, тогда код не будет компилироваться. Вы можете передать объявленную переменную, которая не инициализирована (это 'null'), но вы не можете передать переменную, которая * не существует *. – David
Я хочу найти способ передать параметр; если он не существует, он должен быть создан. Есть идеи? –