说穿了还是接口的问题
 就是不知道接口的运行机制
1。比如实现了Serializable接口,就能序列化了吧,但是这个接口是标识接口,里面没有任何方法和属性,那在自己的类实现了这个接口,java是怎么让它实现序列化的呢
2。在Hibernate中
常用的接口Query,例如:
        Query query = hbtSession.createQuery("................");
        vos = query.list();
htbSession也是一个接口,并没有实现createQuery这个方法,但是query.list()就能取出结果集了,这又是怎么回事呢。
 
问题困扰了我很久,麻烦大侠么帮我解决,不胜感激。

解决方案 »

  1.   

    第一个问题我也疑惑中...,为什么implements 一下Serializable就可以实现了呢?第二个问题,query看起来是接口,实际上已经是对象了。createQuery返回的是一个对象,这个对象实现了Query接口,但你调用list()时,实现是调的那个对象的方法。
    关于这个可以去看看动态编连
      

  2.   

    我只知道每一个接口最终都至少有一个实现类的,只不过有时我们是显示的指明接口实现类,而有时我们是看不到的(不知道去哪看)。
    显示的:List list = new ArrayList();
    隐式的:如第二个问题中Hibernate中的session,是由SessionContext指明实现类的,而SessionContext本身又是接口,它是由容器在运行时提供实现的。
    呵呵,就知道这么多,看看别人的答案吧。
      

  3.   

    接口机制使Java的面向对象编程变得更加灵活。我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现。在《Thinking in Java》一书中,有这样的描述:“接口(interface)比抽象(abstract)的概念更进了一步。你可以把一个接口看成是一个纯的抽象类。”
      

  4.   

    JVM虚拟机意识到implements 一下Serializable就用特殊的序列华机制予以序列华,所以只要标志下就OK了,但是也不是所有implements 一下Serializable就可以序列化,不行的华会抱错
      

  5.   

    关于序列化,看看这个:
    http://anniekim.bokee.com/3927765.htmlhttp://xn--94qz7fc65e.com/qfc/76151.html
      

  6.   

    也曾有楼主的疑惑,和Serializable类似的还有Cloneable接口,其实可以理解为这些接口是sun或者jvm开发者实现的,但是至于什么方法就要研究虚拟机了。这样就会产生一点点疑惑,是不是jdk中的interface和我们自己的interface不一样呢?我想是的,是不一样的。至于第二个问题,我想如果你有机会看下hibernate的源码,肯定能理出头绪来,呵呵,实际上我也不是很清楚,不敢再瞎说了,反正我是这样理解的。其实java中还有很多有趣的问题,比如interface是class么?interface可以继承concrete class么?回答之前想一下Object(所有class的superclass):)
      

  7.   

    第一个部题暂时还不理解,我也在研究当中,
    至于第二个问题,我是这样认为的,createQuery()方法返回的一个实现了Query接口的类的一个实例,Query query = hbtSession.createQuery(),就是把query指向了一个类的实例,
    然后调用 query.list()方法,因为Query是一个接口,他的实现类就必须实现list()这个方法,
    所以当你调用query.ist()的时候,实际上是调用了实现类的list()方法,下面是我写的例子:
    //定义一个接口
    interface T{
      public void method();
    }//定义一类实现了接口T
    class T1 implements T{
       //实现了接口中的方法
       public void method(){
         System.out.println("t1");
       }   //一个静态方法,返回这个类的一个实例
       public static T1 createT(){
         T1 t1 = new T1();
         return t1;
       }
    }
    //就是测试类
    class Test 
    {
      public static void main(String [] args)
      {      
             
    T t =T1.createT();
    t.method();
      }
    }
    输出的结果是t1
      
      

  8.   

    关于序列化接口,不知道楼主有没有看过 JDK (相信是没有),其中一段原文如下:To allow subtypes of non-serializable classes to be serialized, the subtype may assume responsibility for saving and restoring the state of the supertype's public, protected, and (if accessible) package fields. The subtype may assume this responsibility only if the class it extends has an accessible no-arg constructor to initialize the class's state. It is an error to declare a class Serializable if this is not the case. The error will be detected at runtime. 可见只要该类声明了缺省的构造函数,那么直接 implements Serializable 即可,不必手动对序列化做具体的实现。那么如果该类没有缺省的构造函数呢?JDK是这么说的:Classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:  private void writeObject(java.io.ObjectOutputStream out)
         throws IOException
     private void readObject(java.io.ObjectInputStream in)
         throws IOException, ClassNotFoundException;
     
    也就是说没有缺省构造函数的类必须实现 writeObject 和 readObject 两个方法。这两个方法的解释楼主可以自己到 JDK 去找,他们的缺省实现是这样的:    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
            out.defaultWriteObject();
        }    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
            in.defaultReadObject();
        }如果没有特殊要求的话,象上面这样写就可以了。
      

  9.   

    楼主,你的第一个问题不是问我们在程序中如何实现Serializable,而是奇怪为何一个标识接口怎么实现序列化这个功能的对么?好像很些人误解了。