当前位置: 代码迷 >> J2SE >> 关于接口的有关问题,前辈
  详细解决方案

关于接口的有关问题,前辈

热度:78   发布时间:2016-04-23 19:49:18.0
关于接口的问题,请教各位前辈
本帖最后由 geniuszcs 于 2015-05-06 23:21:58 编辑
private String name;
private int count = 1;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void set(String name)throws InterruptedException
{
lock.lock();
try
{
while(flag)
condition_pro.await();
this.name = name+"--"+count++;

System.out.println(Thread.currentThread().getName()+"......"+this.name);
flag = true;
condition_con.signal();
}
finally
{
lock.unlock();
}
}

在这段代码中,Lock和Condition在API文档里都是以接口类型定义的,而接口是不能创建对象的,
那么请各位前辈指教,第4,5,6行是怎么来的?
特别请详细说明下此语句private Condition condition_con = lock.newCondition();中的lock.newCondition()是怎么来的,这与前面书上写的创建对象格式完全不一样了,谢谢!
------解决思路----------------------
是不能创建接口对象
但是可以用接口去引用实现了该接口的对象
也是父类引用指向子类对象的一种形式而已
lock.newCondition()会多态调用子类对象的方法
即ReentrantLock实例中接口方法的具体实现:

public Condition newCondition() {
        return sync.newCondition();
    }

------解决思路----------------------
引用:
Quote: 引用:

那么请各位前辈指教,第4,5,6行是 因为有实际对象继承自这个接口, 所以可以
Lock lock = new ReentrantLock(); 这么写. ReentrantLock 这个对象继承自 Lock接口.

关于private Condition condition_con = lock.newCondition(); 这个.
对象却是都必须用 new class 来创建. 但是 newCondition()是一个方法. 方法内部肯定是有new 对象的.. 比如我简单的写个

public Condition newCondition(){
      return new Condition();
}

这样.. 外部只需要调用这个 newCondition() 就可以获得一个新的 Condition对象.


前辈,你说的我理解了,但还有一点,问题在于Condition是接口类型,所以我仍然有些混乱,还请再细说下

如果说Condition是接口的话,那么 return new Condition(); 是肯定会报错的。如果你用过List集合的话就会好理解一点。List是一个接口,它有两个实现类,ArrayList和LinkedList。所以我们在定义List集合的时候,都是 List list = new ArrayList(); 或者 List list = new LinkedList(); 。但是如果写成 List list = new List(); ,编译器就会报错。
简单来说,就是不能用接口去实例化一个对象,但是可以用接口的实现类去实例化对象。
------解决思路----------------------
有些时候,看API看不懂的话,看看源码就知道了。。Lock接口有一个实现类 ReentrantLock,在这个实现类中可以找到newCondition的具体实现
public Condition newCondition() {
        return sync.newCondition();
    }

那么继续,可以找到一个叫sync的类
abstract static class Sync extends AbstractQueuedSynchronizer
在sync类中,可以找到
final ConditionObject newCondition() {
            return new ConditionObject();
        }
这就说明,接口 Lock 中的 newCondition返回的是ConditionObject对象。ConditionObject对象有两种形式,AbstractQueuedSynchronizer.ConditionObject和AbstractQueuedLongSynchronizer.ConditionObject,这两个类都是接口Condition的实现类。
------解决思路----------------------
引用:
Quote: 引用:

那么请各位前辈指教,第4,5,6行是 因为有实际对象继承自这个接口, 所以可以
Lock lock = new ReentrantLock(); 这么写. ReentrantLock 这个对象继承自 Lock接口.

关于private Condition condition_con = lock.newCondition(); 这个.
对象却是都必须用 new class 来创建. 但是 newCondition()是一个方法. 方法内部肯定是有new 对象的.. 比如我简单的写个

public Condition newCondition(){
      return new Condition();
}

这样.. 外部只需要调用这个 newCondition() 就可以获得一个新的 Condition对象.


前辈,你说的我理解了,但还有一点,问题在于Condition是接口类型,所以我仍然有些混乱,还请再细说下


接口, 只是为了便于调用和管理统一的方法.  java的书里. 一般介绍接口的时候, 都会举 动物的例子. 
比如 动物 是一个接口. 里面有  走, 吃东西, 生孩子.. 等等方法的声明.
但具体到每一个动物身上..比如 狗熊, 企鹅, 鸭子..之类的 具体 实现了 动物 这个接口的 对象. 他们去实现 走 , 吃东西, 生孩子 这些方法都有自己的方式... 
声明一个对象的时候, 你可以用  狗熊  狗熊a=new 狗熊. 也可以用  动物  狗熊a=new 狗熊(). 
但是不能用 动物  动物a=new 动物(). 因为接口里的方法都是没有被实现的. 仅仅是一个框框.

方法的返回是可以用 接口 来返回的, 外部知道这个接口可以调用的方法... 知道动物 有, 走,吃,生娃 这些方法. 但你可以不知道他具体是熊, 还是企鹅....
是不是解释的很接地气.................. 
  相关解决方案