В приведенном ниже коде для связанного списка
Почему Link newLink = new Link()
не выдает ошибку во второй раз, когда thelist.insertfirst()
вызывается, поскольку newlink
уже определено?
МОЕ ПОНИМАНИЕ - Область действия переменной newlink
- это метод insertfirst()
.
Link newLink = new Link(id, dd);
Когда создается ссылка newlink
, переменная newlink
содержит адрес памяти созданного объекта ссылки.
newLink.next = first;
first
- переменная ссылки, которая содержит адрес памяти объекта ссылки.
Затем newlink.next()
направляется к object contained at the memory address of the variable first
.
first = newLink;
Затем переменная first
направляется к newlink
.Это означает, что теперь сначала содержится адрес памяти объекта newlink
(сама newlink содержит адрес для реального объекта).
Когда метод завершается, переменная 'newlink' теряется, но нам все равно, поскольку у нас уже есть copied
адрес памяти (в поле next
) объектов ссылки.
Правильна ли эта аналогия?
class Link
{
public int iData; // data item
public double dData; // data item
public Link next; // next link in list
public Link(int id, double dd) // constructor
{
iData = id; // initialize data
dData = dd; // ('next' is automatically
} // set to null)
//////////////////////////////////////////////////////////////////////
class LinkList
{
private Link first; // ref to first link on list
public LinkList() // constructor
{
first = null; // no links on list yet
}
// insert at start of list
public void insertFirst(int id, double dd)
{ // make new link
Link newLink = new Link(id, dd);//######################################## DOESN'T THROW ERROR
newLink.next = first; // newLink --> old first
first = newLink; // first --> newLink
}
} // end class LinkList
//////////////////////////////////////////////////////////////////////
class LinkListApp
{
public static void main(String[] args)
{
LinkList theList = new LinkList(); // make new list
theList.insertFirst(22, 2.99); // insert four items
theList.insertFirst(44, 4.99);
theList.insertFirst(66, 6.99);
theList.insertFirst(88, 8.99);
} // end main()
} // end class LinkListApp
///////////////////////////////////////////////////////////////////