一.Java字段初始化的规律。
1.类的构造方法
(1)“构造方法”,也称为“构造函数”,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。
(2)如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
例如:
public class Test{
public static void main(String[] args){
Foo obj1=new Foo(); //Foo obj1=new Foo(2);
}
}
class Foo{
int value; //static int value;
public Foo(int initValue){
value=initValue;
}
}
该程序是无法运行的,修改成后面语句将可以运行。
(3)同一个类可以有多个构造函数,多个构造函数之间通过参数来区分.这是方法重载的一个实例。
构造函数之间可以相互调用。
例如:
public class Test{
public static void main(String[] args){
Foo obj1=new Foo();
System.out.println(Foo.grams);
Foo obj2=new Foo(5);
System.out.println(Foo.grams);
}
}
class Foo {
static int grams;
Foo() {
this(55);
}
Foo(int g){
grams=g;
}
}
程序的运行结果为:
55
5
2.类的初始化块
(1)可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员。
类的这种“没有名字”的“成员”,多用于初始化类的字段。
public class Test {
public int value=200;
{
value=100;
}
}
3.
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
执行类的构造函数
类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
例如:
public class Test{
public static void main(String[] args){
Foo obj1=new Foo();
System.out.println(Foo.grams);
obj1=new Foo(5);
System.out.println(Foo.grams);
}
}
class Foo {
{
grams=100;
} public static int grams=50;
public Foo(int g){
grams=g;
}
public Foo() {}
}
结果为:
100
5
但当public static int grams=50;语句在 {grams=100;}之前时结果则为:
50
5
4.继承关系中的初始化
例如:
class B
{
public static int data=100;
static
{System.out.println("B初始化 data="+data);}
}
class A extends B
{
public static int data=50;
static
{System.out.println("A初始化 data="+data);}
}
public class Test
{
public static void main(String[] args)
{
new A();
}
}
运行结果为:
B初始化 data=100
A初始化 data=50
二.如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)
类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中"寄居",不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。
三.静态初始化块的执行顺序。
与普通初始化块类似的是,系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,而且还会一直上溯到java.lang.Object类,先执行java.lang.Object类中的静态初始化块,然后执行其父类的静态初始化块,最后才执行该类的静态初始化块。经过这个过程,才完成了该类的初始化过程。只有当类初始化完成后,才可以在系统中使用这个类,包括访问类method、类Field,或者用这个类来创建实例。
四.Integer类的装箱和拆箱到底是怎样实现
装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。
在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。
因此可以用一句话总结装箱和拆箱的实现过程:
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 intValue方法实现的.