当前位置:首页>开发>正文

JAVA当中变量什么时候需要初始化 java什么时候会给变量自动进行初始化

2023-04-20 06:09:51 互联网 未知 开发

 JAVA当中变量什么时候需要初始化 java什么时候会给变量自动进行初始化

JAVA当中变量什么时候需要初始化

类的属性,或者叫值域
方法里的局部变量方法的参数
对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!
其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。

java什么时候会给变量自动进行初始化

代码:Student s = new Student()做了哪些事情?(理解)
(1)把Student.class文件加载到内存
(2)在栈内存为s开辟空间
(3)在堆内存为学生对象申请空间
(4)给学生的成员变量进行默认初始化。null,0
(5)给学生的成员变量进行显示初始化。林青霞,2(6)通过构造方法给成员变量进行初始化。刘意,30
(7)对象构造完毕,把地址赋值给s变量

Java中final static变量初始化的问题

static变量是在类加载的时候初始化

static final常量是对象实例化的时候初始化
public class StaticAndFinalTest {  

   private static Random rand = new Random(47) //47作为随机种子,为的就是产生随机数。  

   private final int a = rand.nextInt(20)  

    private static final int B = rand.nextInt(20)  

    public static void main(String[] args) {  
        StaticAndFinalTest sf = new StaticAndFinalTest()  
        System.out.println("sf : "   "a="   sf.a)  
        System.out.println("sf : "   "B="   sf.B)  
        System.out.println("------------------------------")  
        StaticAndFinalTest sf1 = new StaticAndFinalTest()  
        System.out.println("sf1 : "   "a="   sf1.a)  
        System.out.println("sf1 : "   "B="   sf1.B)  
    }  

}运行结果:
sf : a=15 
sf : B=18 
-------------- 
sf1 : a=13 
sf1 : B=18 
可以看到,在sf和sf1对象中,a的值不是唯一的,但B的值是不会通过创建sf1对象而改变。这是因为它是static,在装载时已被初始化,而不是每次创建新对象时都初始化。

关于JAVA中static初始化问题

java虚拟机在首次主动使用类型的时候才会初始化(lazy-load的形式),主动使用包括以下6种情况

1. 创建类的实例
2. 调用类的静态方法
3. 操作类的非常量静态字段(非final static)
4. 调用特定的反射方法
5. 初始化一个类的子类
6. 指定一个类为虚拟机启动时的初始化类

所以说,你必须主动使用到这个类,这个类才会被初始化,这就能解释第一次有输出,而第二次没有输出的情况了

另外,值得一提的是,加载和初始化不是一个概念,比如,在main函数中写
Table a = null
一样不会有输出。。Table类被加载了但是没有被初始化,因为这不属于上述6种“主动使用”情况之一,不信试试。。。

java 静态变量初始化为什么要用静态初始化

在java中用final修饰符修饰的变量表示不可以被二次赋值,且系统不会给其赋默认值。 如果单纯只是final变量,可以在定义的时候就赋默认值,也可以在构造方法中赋默认值。 但是如果同时用final static 修饰变量,因为static变量属于类而不属于对象,且在调用构造方法之前static 变量就已经被系统给赋默认值。而相应的final static 变量就只能在定义的时候就初始化,否则既无法在构造方法中初始化,系统又不会赋默认值,相当于这个变量被定义出来是毫无用处的。 因此java中final static变量必须初始化

JAVA中什么时候需要初始化什么时候不需要

成员变量会被初始化,局部变量不会初始化。

public class Main {

static int a // 成员变量

public static void main(String[] args) {
int b // 局部变量
System.out.println(a) // 正确输出,默认值是0
System.out.println(b) // 编译异常,没有初始化。因为程序不会自动赋值
}
}

最新文章