1.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
程序源代码
package zihao;class InitalizeBlockClass { { field=200; } public int field =100; public InitalizeBlockClass(int value) { this.field=value; } public InitalizeBlockClass() { } public static void main(String[] args) { InitalizeBlockClass obj=new InitalizeBlockClass(); System.out.println(obj.field); obj=new InitalizeBlockClass (300); System.out.println(obj.field); }}
程序执行结果
分析:
在Java编程中,字段的初始化顺序是
-
类加载时直接初始化静态字段;
-
类加载时调用静态方法初始化静态字段;
-
实例化对象时,在调用构造函数之前代码块中初始化字段;
-
实例化对象时,在调用构造函数之时初始化字段;
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个排在前面
类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”
2.
静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 另一种没有static修饰,为实例变量 类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。 而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
源程序代码
package boke;public class Jingshili { static int i;、 int b=3; public static void main(String args[]) { System.out.println(i); int i=1; System.out.println(i); //创建一个实例 Jingshili a=new Jingshili(); System.out.println(a.b); }}
程序执行结果截图
System.out.println(i);创建一个实例之后,可以通过一个实例来访问实例变量