资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,10,讲 成员的初始化,10.1,定义初始化,10.2,构造方法初始化,10.3,实例语句块,10.4,静态数据的初始化块,10.5,静态语句块,10.6,类的加载及初始化顺序,10.7,本讲小结,Java会尽量保证所有变量局部变量除外在使用前都能得到恰当的初始化,而局部变量那么是通过编译时出错的形式来提醒程序员。例如代码如下:,public void count(),int i;,i+; /编译时出错,局部变量i可能尚未初始化,Java会为根本数据类型的数据成员赋一个初始值,这个初始值为这种类型下的“0。而对象的引用也会被赋个初始值,这个初始值为null。例如代码如下:,分别声明boolean t;char c;byte b;short s;int i;long l;float f;double d;类型的变量,并在控制台上进行打印输出;,10.1,定义初始化,最直接的方法是在定义该类成员变量的时为其赋初值,这种方法称为定义初始化,也叫指定初始化。例如代码如下:,public class InitialValuesOne ,boolean t = true;,char c = a;,int i = 3;,double d = 1.2;,MemberInitialValues re = new MemberInitialValues();,10.1,定义初始化,这种方法简单直观,但在使用时应防止“向前引用的发生。如:,public class ForwardReference ,int x = f2(i); /非法的向前引用,因为这是i还没有被初始化,int i = f1();,int f1(),return 10;,int f2(int m),return m+1;, ,使用这种方法创立的所有对象,其成员变量都具有相同的初始值。有时我们需要在创立对象时给定初始值。,10.2 构造方法初始化,可以使用构造方法进行初始化,这时成员变量的初始化顺序是先执行定义初始化,再运行构造方法。例如代码如下:public class InitialValuesTwo ,int i = 1;,InitialValuesTwo(),i = 10;,InitialValuesTwo(int i),this.i = i;,public static void main(String args),InitialValuesTwo t1 = new InitialValuesTwo();,System.out.println(t1.i = +t1.i);,InitialValuesTwo t2 = new InitialValuesTwo(100);,System.out.println(t2.i = +t2.i);,10.3,实例语句块,Java可以进行实例初始化,用来初始化对象的非静态成员,例如代码如下:,public class InstanceBlock ,int i=1;,System.out.println(1:i = +i);,i = 10;,InstanceBlock(),System.out.println(2:i = +i);,i=100;,public static void main(String args) ,InstanceBlock a = new InstanceBlock();,System.out.println(3:i = +a.i);, /大括号局部称为实例语句块,其顺序在定义初始化之后,构造函数之前。,10.4,静态数据的初始化,每个对象的存储空间相互独立,实例变量存储在其中。而静态变量存放在静态存储区,属于类的变量,所有对象共同持有。所以静态变量只初始化一次。静态变量由static修饰,例如代码如下:,public class StaticInitial ,public static int i = 1;,public static void main(String args) ,System.out.println(i = + i);,i=10;,StaticInitial s1 = new StaticInitial();,System.out.println(s1.i = + s1.i);,StaticInitial.i=100;,StaticInitial s2 = new StaticInitial();,System.out.println(s2.i = + s2.i);,System.out.println(StaticInitial.i = + StaticInitial.i);,10.4,静态数据的初始化,下面代码展示了静态变量只初始化一次:,class Computer,Computer(int maker),System.out.println(Computer( + maker +);,class Electric,static Computer b1 = new Computer(1);,Electric(),System.out.println(Electric();,Computer b2 = new Computer(2);,public class StaticInitialTwo ,static Electric e = new Electric();,public static void main(String args) ,System.out.println(进入main()函数.);,new Electric();,10.5 静态语句块,Java允许将多个静态初始化动作放在一起组成一个静态语句块,与静态初始化一样,静态语句块仅执行一次。例如代码如下:,public class StaticBlock ,static int i=1;,static ,i=10;,System.out.println(i = + i);,public static void main(String args) ,StaticBlock b;,10.6 类的加载及初始化顺序,Java中每个类的编译代码都存在于它自己独立的文件中,该文件只在被使用时才被加载到内存。通常加载发生在创立该类的第一个对象时,但访问该类的static变量或static方法时,该类也会被加载。,所有实例成员会按照定义的顺序进行初始化,而static的成员仅被初始化一次。,变量的初始化顺序分为没有继承时和继承时两种;,10.6 类的加载及初始化顺序,一没有继承时,变量的初始化顺序:,1静态成员变量的默认初始化。(整型为0,浮点型为0.0,布尔型为false,字符型为u0000,引用型为null),2静态成员的定义初始化和静态语句块的初始化。按照在代码中出现的顺序,上面1和2在类加载时只执行一次。,3运行main方法,如果main中有创立对象的语句,那么在堆中给类的实例分配内存空间,new之后空间清零。,4实例变量的默认初始化。(整型为0,浮点型为0.0,布尔型为false,字符型为u0000,引用型为null),5实例变量的定义初始化和实例语句块的初始化。按照在代码中出现的顺序,6执行构造函数。,10.6 类的加载及初始化顺序,二有继承时,变量的初始化顺序:,1当类第一次使用时,JVM就会加载该类,如果该类存在父类,那么就先加载父类,再加载子类,这是一个递归过程。在类加载中,首先进行静态变量的默认初始化,然后按照在类中声明的顺序执行静态成员的定义初始化和静态语句块的初始化。,注:这个过程从父类到子类,并且只会执行一次。,2当父类与子类的静态代码初始化完成后,如果有创立子类对象的语句,先初始化父类的实例变量和实例语句块。然后再初始化子类的实例变量和实例语句块,这是一个递归的过程。,14.6,本讲小结,本讲首先讲述了类中成员变量的初始化方式,包括定义初始化,使用构造方法进行初始化,使用语句块进行初始化。其次讲述了类中成员的初始化顺序以及在有继承关系的类中变量的初始化顺序。,讲后练习,1、总结变量初始化的方式有哪几种?,2、总结类的初始化顺序。,3、总结在有继承关系的类中变量的初始化顺序。,
展开阅读全文