这是什么操作?java中的变量竟然可以先使用后声明?
【摘要】 记录一个简单的DBHelper类吧,用的时候在上来拿!/// <summary> /// 数据库连接工具类 /// </summary> public class DBHelper { string constr = "Data Source=.;Initial Catalog=schoolDB;Integrated Security=True"; ...
记录一个简单的DBHelper类吧,用的时候在上来拿!
/// <summary>
/// 数据库连接工具类
/// </summary>
public class DBHelper
{
string constr = "Data Source=.;Initial Catalog=schoolDB;Integrated Security=True";
private SqlConnection conn;
//数据库连接Connection对象
public SqlConnection get相信大家在看到标题之后,是疑惑的点进来看内容的。
在看到标题之后,大家肯定会怀疑,我赵某人用java写了好几年的代码了,还真就没见过java中的变量能先用在声明,今天就是进来看看你在没有声明变量的前提下是怎么用的!怎么用的!!!
各位,先别激动,能不能你先自己看,我们先来写个例子:
```java
/**
*
*
* 项目名称:BianChengXiGuan
* 类名称:TestMain
* 类描述: 静态变量
* 创建人:Mu Xiongxiong
* 创建时间:2020-6-17 下午10:53:54
* 修改人:Mu Xiongxiong
* 修改时间:2020-6-17 下午10:53:54
* 修改备注:
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version
*
*/
public class TestMain {
public static int num = 10;
static{
num = 100;
}
public static void main(String[] args) {
System.out.println(num);
}
}
这个例子很简单,输出结果我不说大家也都知道,是100,正确。那么我们稍微改一下上面的代码:
/**
*
*
* 项目名称:BianChengXiGuan
* 类名称:TestMain
* 类描述: 静态变量
* 创建人:Mu Xiongxiong
* 创建时间:2020-6-17 下午10:53:54
* 修改人:Mu Xiongxiong
* 修改时间:2020-6-17 下午10:53:54
* 修改备注:
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version
*
*/
public class TestMain {
static{
num = 100;
}
public static int num = 10;
public static void main(String[] args) {
System.out.println(num);
}
}
注意了,我将声明num的和赋值num的代码替换了位置,你肯定会问:兄弟,你这代码能编译通过吗?即便你能编译通过,那输出来是多少???(这里可以看到num是先赋值后声明的)
这段代码可以编译通过,并且输出的num结果是10,是不是有点出乎意料了,不着急,要想把这里说通,我们还得回到静态变量的诞生说起,总所周知,静态变量是在我们第一次使用类(加载类)的时候别分配到数据区的,它在内存中之后一次拷贝,不会被分配多次,其后不管给它赋值多少遍,都是值在改变,而地址不变。
当类被加载时,首先会找到类中的所有静态声明,然后给它们分配空间,这个时候仅仅只是分配空间,并未赋值,此后,JVM就会根据静态赋值或者静态块的先后顺序去执行,到这里相信大家差不多就明白了。
回到我们的代码中,TestMain类被加载时,JVM首先在内存中开辟出了一块空间,并且将该地址传递给num,也就是执行的是public static int num,其次按照先后顺序,就该执行num = 100;了,接着往下执行,碰到了num = 10;显而易见,最后输出的结果就是num为10,谁在最后,谁说了算!
最后温馨提示一下大家,正常情况下,我们还是先声明在赋值比较靠谱点,免得本来想装个大神来着,结果出现了语料未及的结果,造成没必要的麻烦可就不值得了。
if(conn==null){
conn = new SqlConnection(constr);
}
return conn;
}
//打开连接
public void OpenConnection() {
if(conn.State==ConnectionState.Closed){
conn.Open();
}else if(conn.State==ConnectionState.Broken){
conn.Close();
conn.Open();
}
}
//关闭连接
public void CloseConnection() {
if(conn.State==ConnectionState.Open||conn.State==ConnectionState.Broken){
conn.Close();
}
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)