一.Java字段初始化的规律
1.源代码
1 package class5; 2 3 4 public class InitializeBlockDemo { 5 6 /** 7 * @param args 8 */ 9 public static void main(String[] args) { 10 11 InitializeBlockClass obj=new InitializeBlockClass(); 12 System.out.println("无参构造函数产生结果"+obj.field); 13 14 obj=new InitializeBlockClass(300); 15 System.out.println("有参构造函数产生结果"+obj.field); 16 } 17 18 } 19 20 class InitializeBlockClass{ 21 //下面这句在初始化块之前与之后,会影响到field字段的初始值 22 //public int field=100; 23 24 { 25 field=200; 26 } 27 public int field=100; 28 public InitializeBlockClass(int value){ 29 this.field=value; 30 } 31 public InitializeBlockClass(){ 32 33 } 34 }
2.结果截图
3.Java字段初始化的规律
a.有参构造函数与无参构造函数执行的先后,在于什么时候创建该类型对象
b.调用无参的构造函数时,按照类中的顺序执行,后面的数值将同名的数值的值覆盖掉,之后才会去调用构造函数
c.调用有参的构造函数时,直接执行有参构造函数中的内容,不执行类的其他内容
二.Java静态初始化块的执行顺序
1.源代码
1 package class5Task; 2 3 class Root 4 { 5 static 6 { 7 System.out.println("Root的静态初始化块"); 8 } 9 10 { 11 System.out.println("Root的普通初始化块"); 12 } 13 14 //构造函数 15 public Root() 16 { 17 System.out.println("Root的无参数的构造器"); 18 } 19 20 21 } 22 class Mid extends Root 23 { 24 static 25 { 26 System.out.println("Mid的静态初始化块"); 27 } 28 29 { 30 System.out.println("Mid的普通初始化块"); 31 } 32 33 //构造函数 34 public Mid() 35 { 36 System.out.println("Mid的无参数的构造器"); 37 } 38 39 //有参构造函数 40 public Mid(String msg) 41 { 42 //通过this调用同一类中重载的构造器 43 this(); 44 System.out.println("Mid的带参数构造器,其参数值:" + msg); 45 } 46 } 47 class Leaf extends Mid 48 { 49 static 50 { 51 System.out.println("Leaf的静态初始化块"); 52 } 53 54 { 55 System.out.println("Leaf的普通初始化块"); 56 } 57 58 //构造函数 59 public Leaf() 60 { 61 //通过super调用父类中有一个字符串参数的构造器 62 super("Java初始化顺序演示"); 63 System.out.println("执行Leaf的构造器"); 64 } 65 66 } 67 68 public class TestStaticInitializeBlock 69 { 70 public static void main(String[] args) 71 { 72 new Leaf(); 73 } 74 }
2.结果截图
3.Java静态初始化块执行顺序
a.如果存在静态初始化,则先创建静态初始化块
b.如果该类存在父类,则先创建该父类的静态初始化块,之后直接创建该类的静态初始化块
三.在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)
1.源代码
1 package class5Task; 2 3 public class VisitnotStatic { 4 5 private int num = 0; 6 7 public static int test(VisitnotStatic a)//用来测试 8 { 9 int result; 10 result = a.num; 11 result = 1; 12 return result; 13 } 14 15 public static void main(String[] args) 16 { 17 VisitnotStatic a = new VisitnotStatic(); 18 System.out.println(test(a)); 19 } 20 21 }
2.结果截图
3.设计思想
a.静态方法中只允许访问静态数据,所以,为了在静态方法中访问类的实例成员,就需要创建一个对象。通过这个对象来完成对非静态变量的访问。
b.所以就创建了一个函数,以一个类的对象作为参数,对这个对象的值进行了更改,在返回更改之后的结果。
c.输出修改之后的值,并在主函数中创建对象,调用刚刚的函数。
d.输出结果,验证是否成功
e.结果与预期的相同,成功对非静态的变量进行了访问,并进行了修改。
四.同名类的构造问题
1.源代码
1 package class5Task; 2 3 public class Test { 4 5 public static void main(String[] args) 6 { 7 Foo obj1 = new Foo(); 8 } 9 10 } 11 class Foo 12 { 13 int value; 14 public Foo(int initValue) 15 { 16 value = initValue; 17 } 18 }
2.结果截图
3.分析原因
在类中自定义了一个构造函数后,系统就不会执行默认的构造函数,也就是说调用构造函数时,必须加上相应的参数。
四.同名类的构造问题
1.源代码
1 package class5Task;
2
3 public class Test {
4
5 public static void main(String[] args)
6 {
7 Foo obj1 = new Foo();
8 }
9
10 }
11 class Foo
12 {
13 int value;
14 public Foo(int initValue)
15 {
16 value = initValue;
17 }
18 }
2.结果截图
3.分析原因
在类中自定义了一个构造函数后,系统就不会执行默认的构造函数,也就是说调用构造函数时,必须加上相应的参数。