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,也就是说参数是复制了对象的,那如何传对象引用?谢谢
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,也就是说参数是复制了对象的,那如何传对象引用?谢谢
解决方案 »
- 我的这段代码sum值在第一次计算时不出错,为什么重复循环的时候sum值出错?
- 获取输入年月日之后的第一个星期的日期有哪几种方法?其中类 Calendar具体用法?
- 用java访问sql sever 无法显示结果…… 急!在线等……………………
- 这个正则表达式的Pattern如何写?
- 一个java技术网站[http://javalife.cn],欢迎大家来灌水。
- 本科毕业到软件公司需要知道哪些知识??迷茫中的本科生
- 为什么java不提供对象手工释放?
- <请问>如何计算 "1+1" 的值?
- 问题
- 问个弱问题,JAVA里有没有四舍五入的方法?
- 请问哪有小的JDBC连接SQL或ACCESS的程序
- jdk 覆盖问题请帮忙谢谢
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.实际上关闭的就是方法创建的连接
public static void CreateConn(String url, Connection conn){
......
conn = DriverManager.getConnection();
......
}
这种写法是不能让参数conn获得连接的,因为java中没有指针一说,你无法把生成的新连接指向参数的地址,java中都是按值传递的,参数conn只是这个对象的地址的一个拷贝,但你可以改变参数对象的成员变量的值。
的确生成了连接,也的确赋值给conn了,但这个conn是参数的对象地址的拷贝,赋值发生在拷贝上,DriverManager.getConnection()生成的对象,是新对象,要重新分配地址的,参数的拷贝指向的对象地址已经指向了新生成的连接,所以,外部conn仍然是null的。永远记住,不要在方法里给参数对象重新赋值,没有意义,但可以调用参数对象的方法更改其成员变量。
在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)"构造方法,否则就不能这样写。
{
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;
}
是转值,不是传指针。
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++中的引用