Resin 2.1.4, Java 2 SDK SE v1.4.2我在JavaBean 中创建数据库的连接,比如:
public static Connection CreateConn(String url){
Connection conn = null;
......
conn = DriverManager.getConnection();
......
return conn;
}在我的JSP页面中:
Connection conn = CreateConn(...);
....
conn.close();我想知道的是:在JSP页面中的conn是CreateConn()函数中的conn还是函数中conn的一个复制对象?因为在C++中,函数CreateConn中的conn的生存期就只有在这个函数中。
2: 我在JSP页面中调用conn.close()之后,是不是把页面和函数中的Connection都关闭了?这种写法有没有什么问题?
还有,我希望采用C++中的传递对象引用的方法来传递Connection,该如何采用?我用以下方法不对
public static void CreateConn(String url, Connection conn){
......
conn = DriverManager.getConnection();
......
}conn作为参数传递之后,出来的conn仍然是null,也就是说参数是复制了对象的,那如何传对象引用?谢谢

解决方案 »

  1.   

    我初学java,只说一下我的理解,不对之处请见谅
    1.
    在JSP页面中的conn我觉得应该是CreateConn中的conn,java的对象变量采用的是类似于
    c中的指针的形式,而new的内存是自动回收,我的感觉是jvm对于每一个对象变量应该用了
    c++常用的引用计数形式,当java的垃圾回收看到一个对象的引用为零,就对其释放,
    而对象的引用计数的维护根据一个变量的作用域来定2.java没用类似c++的按引用传递,都是按值传递
    对于对象变量
    类似于 static void CreateConn(const string & url, Connection * conn){
        conn = DriverManager.getConnection();}
      

  2.   

    1.是方法创建的连接
    2.实际上关闭的就是方法创建的连接
    public static void CreateConn(String url, Connection conn){
    ......
    conn = DriverManager.getConnection();
    ......
    }
    这种写法是不能让参数conn获得连接的,因为java中没有指针一说,你无法把生成的新连接指向参数的地址,java中都是按值传递的,参数conn只是这个对象的地址的一个拷贝,但你可以改变参数对象的成员变量的值。
      

  3.   

    conn = DriverManager.getConnection();
    的确生成了连接,也的确赋值给conn了,但这个conn是参数的对象地址的拷贝,赋值发生在拷贝上,DriverManager.getConnection()生成的对象,是新对象,要重新分配地址的,参数的拷贝指向的对象地址已经指向了新生成的连接,所以,外部conn仍然是null的。永远记住,不要在方法里给参数对象重新赋值,没有意义,但可以调用参数对象的方法更改其成员变量。
      

  4.   

    我觉得楼主和楼上的几位兄弟都没有理解好对象和原型变量,以下是我的理解,望高人指正。^_^int fun(Object ob);在java,传入的是一个对象,是引用不是传值,返回的是原型变量,是传值。
    在c++,传入的是一个对象,是传值不是引用,返回的是原型变量,是传值,int fun(Object & ob)或int fun(Object * ob)跟java中是等效的。
    Object fun(int i);在java,传入的是一个原型变量,是传值不是引用,返回的是对象,是引用(返回对象的生命周期取决引用这个对象的周期)。
    在c++,传入的是一个原型变量,是传值不是引用,返回的是对象,也是传值,Object * fun(int i)跟java中是等效的。
    在c++中int fun(Object ob);Object fun(int i);这二个函数用到的Object类,这个类必须要重载"operator ="操作符和"fun(Object)"构造方法,否则就不能这样写。
      

  5.   

    再补充一下:在c++中Object * fun(int i)

       Object ob;
       ....
       return &ob;
    }这样写是错误,Object ob的生命周期是fun级的,应写成:Object * fun(int i)

       Object * ob=new Object();
       ....
       return ob;
    }而
    Object fun(int i)
    {
       Object ob;
       ....
       return ob;
    }
    是转值,不是传指针。
      

  6.   

    首先java中的对象变量类似于c++中的指针,而不是c++中的引用
    c++的引用不能有空引用,而且初始化后不能指向别的对象
    而java的对象变量可以为null,还可以指向别的对象c++中
    int func(Object * pObj);Object * pObject;
    func(pObject);这个func(pObject)的调用中这个pObject这个指针变量本身是按值传递的
    如果要按引用传递
    应该是
    int func(Object * & rpObj);同样java中对象变量传递就是
    c++中int func(Object * pObj);这种按值传递形式,java中经常所说的对象变量引用什么的,实际上等同于c++中的指针,而不是c++中的引用
      

  7.   

    JavaBean中返回的Conn是个引用,不是对象,到了JSP你把引用赋值给了一个新声明的引用,你说呢,当然是一个对象了,是吧!!