java中关于静态变量的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中关于静态变量的问题相关的知识,希望对你有一定的参考价值。
各位大神,我觉得第二段代码应该没问题,但是报空指针异常,特不理解.
当我调用该类中的静态方法时,先执行静态代码块,发现cf变量,再给静态变量分配内存,java虚拟机是这样
执行的么.也就是类加载的时候,静态变量是不是在需要用到的地方再分配内存
当设置为静态变量的时候,如果多次调用该类,那么是不是只会初始化一次
基础没学好,希望能回答的详细点,谢谢...
不是先执行静态代码快。
当调用静态方法时,首先执行静态类属性,static代码块也相当于一个类属性(我是这样理解的);执行的顺序是你属性的排列顺序。当第一次调用静态属性或静态方法以及第一次创建对象时,都会初始化静态属性,分配内存,而且以后不再初始化。如下例:
public class Demo4
public static Demo4_1 d1 = new Demo4_1(1);
public static Demo4_1 d2 = new Demo4_1(2);
public static void f()
System.out.println("。。。。。");
public static void main(String[]args)
System.out.println("..."+Demo4.d2+"...");
Demo4.f();
class Demo4_1
public Demo4_1(int i)
System.out.println(i++);
输出:
12
...edu.hu.my.Demo4_1@15bdc50...
。。。。。
当第一次调用静态属性d2时初始化,所有静态属性;再调用方法f()时,就没有再初始化了。
你把static块提到sf上面就可以了。 参考技术B private static SessionFactory sf = cf.buildSessionFactory(); 这行放到
static;方法块下面就没事了。
因为你在cf.buildSessionFactory();的cf是null ,这句是错的
Java中关于String对象引用的问题?
新手请教下假如我定义了一个String类的对象String str = "abc";再将其修改为String str = "def";这是str应该是指向堆内存中的def,然后我又将其改回String str ="abc";这时str会指向原来的abc,还是在堆内存中重新分配abc的空间再指向它呢??不胜感激!!
你要明白,何时分配堆内存,何时分配栈内存。String a = "aaa";
用这种方式的时候java首先在内存中寻找"aaa"字符串,如果有,就把aaa的地址给它
如果没有则创建
String a = new String("aaa");
是不管内存中有没有"aaa"
都开辟一块新内存保存它
可以用以下方法验证下
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
System.out.println(a==b);
System.out.println(a==c);
结果应该是:
true
false
此题作为java程序员笔试题几率比较高。
你要好好记住哦!O(∩_∩)O~ 参考技术A 不是这样的,java5.0以后出现了一个对象池的概念,Java虚拟机在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本类型的包装类对象和String对象,String str = "abc"这样写是从对象池中取abc的对象,如果对象池中已经有了abc这个对象,那么就不会从新给它分配新的空间了,如果这样写String str = new String("abc");就会分配新的空间 参考技术B 字符串常量本来就是一个匿名对象,string
s="哈哈"这条语句的结果是,将“哈哈”的引用,也就是在字符串常量池中的首地址赋值给s,string
s=new
string("哈哈");这句的结果是:首先会在字符串常量池中产生"哈哈"这个对像,然后再用"哈哈"这个已经存在的对象,去构造s这个对象,这样就会产生两个对象,这似乎并不是我们要的结果 参考技术C 这个你可以用一个小程序自己测试下,印象更深刻~
以上是关于java中关于静态变量的问题的主要内容,如果未能解决你的问题,请参考以下文章