关于java的初始化

public class test04 {

public static void main(String[] args) {
C c = new C(11);
}
}

class A{
public A(int i){
System.out.println("Constructor A."+i);
}
}
class B{
public B(int i){
System.out.println("Constructor B."+i);
}
}
class C extends A{
int i;
public C(int i){
super(i);
this.i=i;
System.out.println("Constructor C."+i);
}
B b = new B(i);
}
为什么输出结果是:
Constructor A.11
Constructor B.0

Constructor C.11


对于类的初始化:

1、调用顺序:
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数

其他说明:
2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法
5、类消除时候,首先消除子类部分,再消除父类部分

你这里C继承A,所以顺序是:
A的属性初始化-->A的构造-->C的属性初始化(此时new B()调用了B的构造)-->C的构造


对于变量的初始化;

java 语言要求变量遵循先定义,再初始化,然后使用的规则。

变量的初始化是自从变量定义以后,首次给它赋初值的过程。

 

对于类的成员变量。不管程序有没有显示的初始化,Java  虚拟机都会先自动给它初始化为默认值。

规则为:

1、整数类型(byte、short、int、long)的基本类型变量的默认值为0。

2、单精度浮点型(float)的基本类型变量的默认值为0.0f。

3、双精度浮点型(double)的基本类型变量的默认值为0.0d。

4、字符型(char)的基本类型变量的默认为 “/u0000”。

5、布尔性的基本类型变量的默认值为 false。

6、引用类型的变量是默认值为 null。

7、数组引用类型的变量的默认值为 null。春关键数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。

 

局部变量初始化

 

局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。因此对于局部变量,必须先经过显示的初始化,才能使用它。

如果编译器确认一个局部变量在使用之前可能没有被初始化,编译器将报错。

 

public void method(){

int a;

a++;//编译出错,变量a 必须初始化

System.out.println(a);

}

 

public void method2(){

int x = (int)(Math.random() * 100);

int y;

int z;

if(x > 50){

y = 9;

}

z = y + x;//编译出错,变量y可能没有被初始化

 

如果局部变量没有被初始化,并且在方法中一直没有被使用,则编译和运行都会通过。

 

为什么 Java 虚拟机会自动初始化类的成员变量,却要求局部变量必须显示的初始化?

 

1、对于局部变量,很有可能是程序员疏忽,忘记了初始化局部变量,Java 编译器在编译阶段强制要求程序员给局部变量赋初始值,可避免潜在的威胁。

2、对于成员变量,Java 语言提供了多种的初始化的途径。可以在声明时显示初始化,也可以在构造方法中初始化(适用于实例变量),还可以在静态代码块中初始化(适用于静态变量)。假如程序员没有显示的初始化成员变量,Java 语言则认为这些变量的初始值刚好和该数据类型的默认值相同,因此提供自动初始化的功能,以此简化编程。


由此可以看出,java语言在初始化方面是比C要更加安全,它避免了随机赋值导致的内存空间错乱等现象。

 

 

 

发表评论


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值