java中关于静态变量的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中关于静态变量的问题相关的知识,希望对你有一定的参考价值。

各位大神,我觉得第二段代码应该没问题,但是报空指针异常,特不理解.
当我调用该类中的静态方法时,先执行静态代码块,发现cf变量,再给静态变量分配内存,java虚拟机是这样
执行的么.也就是类加载的时候,静态变量是不是在需要用到的地方再分配内存
当设置为静态变量的时候,如果多次调用该类,那么是不是只会初始化一次
基础没学好,希望能回答的详细点,谢谢...

不是先执行静态代码快。
当调用静态方法时,首先执行静态类属性,static代码块也相当于一个类属性(我是这样理解的);执行的顺序是你属性的排列顺序。当第一次调用静态属性或静态方法以及第一次创建对象时,都会初始化静态属性,分配内存,而且以后不再初始化。如下例:

package edu.hu.my;

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++);
    

输出:

1
2
...edu.hu.my.Demo4_1@15bdc50...
。。。。。

当第一次调用静态属性d2时初始化,所有静态属性;再调用方法f()时,就没有再初始化了。

参考技术A 静态变量和静态块的初始化是按照定义的先后顺序。这两种方式没有顺序。
你把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中关于静态变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

新手请教C#中关于静态函数和静态变量

java中关于对象初始化的问题

python 中关于 类变量, 实例变量, 静态方法,类方法,全局变量,局部变量的理解

java中关于null的一些理解

Java 局部变量实例变量类变量(静态变量)区别

CAPL脚本中关于 局部变量 容易忽略的一点