java学习class5

一.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.分析原因

在类中自定义了一个构造函数后,系统就不会执行默认的构造函数,也就是说调用构造函数时,必须加上相应的参数。

原文地址:https://www.cnblogs.com/tianxiayoujiu/p/7693951.html