黑马程序员技术交流社区

标题: 有点看不明白求解 [打印本页]

作者: Zhang_qian    时间: 2012-5-9 19:06
标题: 有点看不明白求解
import java.util.*;
class DuiLie
{
        private  LinkedList link;

        DuiLie()
        {
         link=new LinkedList();//在DuiLie的构造函数里link是谁的对象?如果是LinkedList的为什么不可以写成这样 LinkedList link=new LinkedList();呢?求指点
        }
        public  void myAdd(Object obj)
        {
               
                link.addFirst(obj);
        }
        public  Object myGet()
        {
               
                return link.removeLast();
        }
        public boolean isNull()
        {
               
                return link.isEmpty();
        }
}



class LinkedListTest
{
        public static void main(String[] args)
        {
                DuiLie dl=new DuiLie();
                dl.myAdd("a");
                dl.myAdd("b");
                dl.myAdd("c");
                dl.myAdd("d");
                while(!dl.isNull())
                {
                        System.out.println(dl.myGet());
                }
        }
}

作者: Zhang_qian    时间: 2012-5-9 19:20
link=new LinkedList();这里是不是用到了多态啊?link前面是不是省略了this.是不是代表当前的构造函数引用了link?
作者: 李啸    时间: 2012-5-9 19:22
link=new LinkedList();//在DuiLie的构造函数里link是谁的对象?如果是LinkedList的为什么不可以写成这样 LinkedList link=new LinkedList();呢?求指点
这样写的目的是为了节省资源 当去实例化DuiLie对象时才真正的获取了一个LinkedList
作者: 李啸    时间: 2012-5-9 19:26
Zhang_qian 发表于 2012-5-9 19:20
link=new LinkedList();这里是不是用到了多态啊?link前面是不是省略了this.是不是代表当前的构造函数引用 ...

首先没用到多态 link前面确实省略了this关键字当前的构造函数是去给全局的私有的link 赋值
作者: 李啸    时间: 2012-5-9 19:34
建议你去再看一看面向对象
作者: 永恒之翼网络    时间: 2012-5-10 15:08
“ link=new LinkedList();//在DuiLie的构造函数里link是谁的对象?如果是LinkedList的为什么不可以写成这样 LinkedList link=new LinkedList();呢?”是LinedList对象,至于为什么不写成"LinkedList link=new LinkedList();"原因有两个方面。第一个方面是在构造函数DuiLie使用了LinkedList link=new LinkedList();得到的对象并不会赋给成员变量link, 因为构造函数里也有一个变量link,它屏蔽掉了成员变量link,那后面对成员变量link的操作都无意义,就算去掉“ private  LinkedList link;”也没有用,因为构造函数调用完之后,LinkedListd对象会释放。第二个方面是如果把“LinkedList link=new LinkedList();”放在成员变量的位置,那它下面的构造函数就无意义了,就不应该写。如果楼主的意思是把“LinkedList link=new LinkedList();”放在成员变量的位置,不写构造函数,那是可以的。至于你要问为什么写此代码的人不这样写,原因是个人习惯,他喜欢那样写。
作者: 付信榕    时间: 2012-5-10 15:39
       //在DuiLie的构造函数里link是谁的对象?如果是LinkedList的为什么不可以写成这样 LinkedList link=new LinkedList();呢?求指点
如果在构造函数里写成 =new LinkedList();则link的作用范围只在 构造函数DuiLie()中,后面的几个方法都不能正确引用到link指向new LinkedList()的对象。所以要把LinkedList link 放在外面(全局变量),那么所有的方法都能够正确用到link指向new LinkedList()的对象。这是一种常见的处理这种情况的方法,多总结,多归纳就能掌握。

      
作者: 永恒之翼网络    时间: 2012-5-12 08:12
对上面的补充。如果从“
private  LinkedList link;

        DuiLie()
        {
         link=new LinkedList();//样 LinkedList link=new LinkedList();
        }
”来看的话,应该是使用的包装设计模式。如果楼主对包装设计模式不明白可以看看毕老师的视频。
但是从后面的方法来看,调用的都是 link原有方法,并没有对其功能加强。所以本例有点怪。
作者: 杨鹏    时间: 2012-5-12 09:01
从楼主提供的代码,可以看出楼主想利用LinkedList集合的特有方法来模拟队列结构的特点,构造函数中的link申明的类型是LinkedList类型的,把link申明在成员的位置上,是为了让该成员能够作用于整个类,方便对其操作。link是LinkedList类对象的引用,同时也作为DuiLie类对象的一个属性,不直接在成员位置new LinkedList(),把它放到构造函数中,这样就可以到需要的时候再创建,从而就节省空间资源。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2