java窗口关闭后自动初始化_Java变量自动初始化

在Java中有些变量使用的时候不需要人为的初始化,系统会自动给变量赋默认的值

例如:

boolean 变量的初始值如果有的话,则为false。

int           变量的初始值如果有的话,则为0.

那么什么情况下,java中的变量会自动初始化呢?这里我们主要讨论以下几种情况:实例变量、类变量、函数中的局部变量

1)实例变量

实例变量都会在构造函数中进行自动初始化,会有相应的值。

class T1{

private int t1;

private double t2;

private boolean t3;

void test(){

System.out.println(t1+" "+t2+" "+t3);

}

}

这里的输出结果:0 0.0  false

但是如果类的实例有final修饰符的时候,需要特别注意了,含有final修饰符的实例变量必须要由程序员指定初始值,指定方式有两种:

a. 在final 实例变量定义的时候进行初始化,例如

class T1{

final private int t1=10;

void test(){

System.out.println(t1+" ");

}

}

b.在非静态块中进行进行初始化,例如

class T1{

final private int t1;

void test(){

System.out.println(t1+" ");

}

{ //去掉括号会报错的

t1=10;

}

}

c.在构造函数中进行初始化,例如

class T1{

final private int t1;

T1(){

t1=10;

}

void test(){

System.out.println(t1+" ");

}

}

当在构造函数中进行初始化的时候,对于有多个构造函数的类,必须在每个构造函数中都对该final实例变量进行初始化,但是各构造函数可以使用不同的值来进行初始化,例如

class T1{

final private int t1;

T1(){

t1=10;

}

T1(int c){

t1=20;

}

void test(){

System.out.println(t1+" ");

}

}

对于final修饰的实例变量来讲,上述三种初始化方式各有优缺点,a,b方法类似,均不需要再去每个构造函数中对该实例变量进行初始化,c方法可以针对不同的构造函数对final修饰的实例变量进行特定的初始化。

2)类变量

类变量通常也叫静态变量,是类中使用static关键字修饰的成员变量。对于其来说,程序员未显示指定初始值的类变量,系统会自动赋初始值,例如

class T1{

static private int t1;

void test(){

System.out.println(t1+" ");

}

}

输出结果为: 0 系统自动给int型的类变量t1赋初始值0.

对于有final修饰的类变量,例如 final static int t1来讲,系统不会进行默认赋值,初始化需要按照如下两种方式进行:

a.在定义变量的时候进行初始化,例如

class T1{

static private int t1=10;

void test(){

System.out.println(t1+" ");

}

}

b.在静态初始化块中进行初始化,例如

class T1{

final static private int t1;

void test(){

System.out.println(t1+" ");

}

static{

t1=10;

}

}

与实例变量最大的不同在于,对于final修饰的类变量来讲,不能在构造函数中进行初始化的。

3)函数中的局部变量

对于局部变量来讲,系统不会进行默认初始化,必须程序员指定初始值。当程序中没有显示的指定这类局部变量的初始值的时候,程序会编译出错

class T1{

void test1(){

int a;

System.out.println(a);

}

}

具体情况如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

The local variable a may not have been initialized

at T1.test1(TestString.java:5)

at TestString.main(TestString.java:26)因此,在使用局部变量的时候,需要注意给局部变量进行初始化。

注意:上述情况都是针对基本类型,包括byte, short, int, long及String类型来说,对于引用类型来讲,所有的必须程序员自己进行显示的初始化,如下所示:

class T0{

}

class T1{

T0 t;

void test1(){

System.out.println(t.toString());

}

}

上述代码没有对t进行初始化,因此程序运行时,会抛出NullPointerException

需要进行如下改进:

class T0{

}

class T1{

T0 t=new T0();

void test1(){

System.out.println(t.toString());

}

}

在定义的时候,或者其他可以的地方对t进行显示的初始化就好了。

先暂时整理到这里了,有什么不对或者不清楚的地方欢迎大家留言指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值