这是什么操作?java中的变量竟然可以先使用后声明?

举报
穆雄雄 发表于 2022/12/13 22:01:03 2022/12/13
【摘要】 记录一个简单的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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。