静态方法块 static 以及对象属性&类属性的用法

使用静态块的好处:只要在类被加载时,static块就会被调用,整个过程就调用这么一次,不会在后面的对象处又不断的调用。如果不使用它,就会出现如下问题:new一个对象,我就要调用一次所需的这些内容,重复被调用,从而增加开销。

程序1:这个程序就是用静态方法块,测试输入一个人的出生日期,判断是否在给定出生日期范围内出生,如果是就返回true,否则返回false。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.liaojianya.chapter5;
 
import java.sql.Date;
 
/**
 * This program will demonstrate the use of staticBlock.
 * @author LIAO JIANYA
 *
 */
public class StaticBlock
{
    public static void main(String[] args)
    {
        Person1 p = new Person1(Date.valueOf("1998-11-12"));   
        Person1 p1 = new Person1(Date.valueOf("1988-11-12"));
         
        System.out.println("Is this p born between 1980 and 1990:" + p.isBornBoomer());
        System.out.println("Is this p1 born between 1980 and 1990:" + p1.isBornBoomer());
    }
 
}
 
class Person1
{
    private Date birthDate;
    private static Date startDate, endDate;
    static
    {
        startDate = Date.valueOf("1980-01-11");
        endDate = Date.valueOf("1990-01-11");
    }
    public Person1(Date birthDate)
    {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer()
    {
        return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;
    }
}

结果显示:

1
2
Is this p born between 1980 and 1990:false
Is this p1 born between 1980 and 1990:true

 TIP:先前写这个程序的时候,遇到的问题就是在Person1 p = new Person1();l

这个时候,我尝试在括号里赋日期值,报各种错误,然后才发现需要用到一个java.lang.sql里的Date.valueOf("YYYY-MM-DD")格式,而不能直接赋一个数字年份。

查了一下API如下:

public static Date valueOf(String s)

  将 JDBC 日期转义形式的字符串转换成 Date 值。

参数:
  s - 表示 "yyyy-mm-dd" 形式的日期的 String 对象
返回:
  表示给定日期的 java.sql.Date 对象
抛出:
  IllegalArgumentException - 如果给定日期不是 JDBC 日期转义形式 (yyyy-mm-dd)。

 

程序2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.liaojianya.chapter1;
/**
 * This program demonstrates the use of attribute of class.
 * @author LIAO JIANYA
 * 2016年7月20日
 */
public class UsingAttribute
{
    static String a = "string-a";
    static String b;
     
    String c = "string-c";
    String d;
     
    static
    {
        printStatic("before static");
        b = "string-b";
        printStatic("after static");
    }
     
    public static void printStatic(String title)
    {
        System.out.println("--------" + title + "--------");
        System.out.println("a = \"" + a + "\"");
        System.out.println("b = \"" + b + "\"");
    }
     
    public UsingAttribute()
    {
        print("before constructor");
        d = "string-d";
        print("after constructor");
    }
     
    public void print(String title)
    {
        System.out.println("--------" + title + "--------");
        System.out.println("a = \"" + a + "\"");
        System.out.println("b = \"" + b + "\"");
        System.out.println("c = \"" + c + "\"");
        System.out.println("d = \"" + d + "\"");
         
    }
    public static void main(String[] args)
    {
        System.out.println();
        System.out.println("------------create UsingAttribute object------------");
        System.out.println();
        new UsingAttribute();
        System.out.println("----------------again---------------");
        new UsingAttribute();
    }
 
}

  运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--------before static--------
a = "string-a"
b = "null"
--------after static--------
a = "string-a"
b = "string-b"
 
------------create UsingAttribute object------------
 
--------before constructor--------
a = "string-a"
b = "string-b"
c = "string-c"
d = "null"
--------after constructor--------
a = "string-a"
b = "string-b"
c = "string-c"
d = "string-d"
----------------again---------------
--------before constructor--------
a = "string-a"
b = "string-b"
c = "string-c"
d = "null"
--------after constructor--------
a = "string-a"
b = "string-b"
c = "string-c"
d = "string-d"

  分析:

  初始化顺序:

  类属性(静态变量)定义时的初始化,如static String a = "string-a"

  static 块中的初始化代码,如static{}中的b = “string-b”

  对象属性(非静态变量)定义时的初始化, 如String c = “string-c”

  构造方法中的初始化代码,如d ="string-d"

  1)static语句块用于初始化static成员变量,是最先运行的语句块,只要在类被加载时,static块就会被调用,整个过程就调用这么一次,不会在后面的对象处又不断的调用。

  2)被static修饰的变量称为类变量(class‘s variables),被类的实例所共享,某一个类的实例改变了这个静态值,其他这个类的实例也会受到影响。而成员变量(member variables)则是没有被static修饰的变量,为实例所私有,即每个类的实例都有一份自己专属的成员变量,只有当前实例才可以改变它们的值。

  

posted @   Andya_net  阅读(4848)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示