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

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

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;
}
}

结果显示:

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:

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();
} }

  运行结果:

--------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修饰的变量,为实例所私有,即每个类的实例都有一份自己专属的成员变量,只有当前实例才可以改变它们的值。

  

静态方法块 static 以及对象属性&类属性的用法的更多相关文章

  1. python中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

    类对象.类属性与实例对象.实例属性的区别 在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性.类属性在内存中只有一份,在__init__外部定义. 通过类创建的对象称为实 ...

  2. python-面向对象-09_类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  3. Swift-存储属性,计算属性,类属性

    //类的属性定义 class Student: NSObject { // 定义属性 // 定义存储属性 var age : Int = var name :String? var mathScore ...

  4. python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法

    给对象添加实例属性,可以直接这样  t.age = 18   ( 假设 t = Test() )  给类添加类属性 , 也可以直接这样  Test.age = 18 那给对象添加实例方法,可以在类外面 ...

  5. Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

  6. python基础-9.1 面向对象进阶 super 类对象成员 类属性 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

  7. Static和Final修饰类属性变量及初始化

    1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那 ...

  8. 用代码块在new对象时set属性

    看到这样一种用法,很方便 request.setRequestHead(new RequestHeadType() {{ setRequestor("Online"); setRe ...

  9. JavaScript检测对象的类属性

    function classof(o) { if(o === null) { return "Null"; } if(o === undefined) { return " ...

随机推荐

  1. ♫【模式】Curry化

    /** * 当发现正在调用同一个函数,并且传递的参数绝大多数都是相同的, * 那么该函数可能是用于Curry化的一个很好的候选参数 */ ;(function() { function add(x, ...

  2. 【转】Ubuntu14.04搭建安装svnserver

    原文网址:http://www.cnblogs.com/blfshiye/p/5168028.html 前两天,公司准备搭建一个svnserver,供大家使用.于是.就先装了一个Ubuntu系统,然后 ...

  3. Android 布局之DrawLayout

    在刚开始学android的时候肯定会知道,android的主要的布局就是LinearLayout.RelativeLayout.FramLayout.AbsoluteLayout.以及TableLay ...

  4. 《JavaScript核心概念》基础部分重点摘录

    注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...

  5. Java---网络蜘蛛-网页邮箱抓取器~源码

    刚刚学完Socket,迫不及待的做了这个网页邮箱抓取~~~ 现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎.资讯采集.舆情监测等等,诸如此类.网络爬虫涉及 ...

  6. C++之友元函数

    1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同 ...

  7. hdu 4403 枚举

    #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #inclu ...

  8. nyoj 88 汉诺塔(一)【快速幂】

    汉诺塔(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度 ...

  9. mysql inner join,full outer join,left join,right jion

    https://sites.google.com/site/349624yu/courses/mysql/mysqldbgjzcx inner join,full outer join,left jo ...

  10. dijkstra算法(迪杰斯特拉算法)

    dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...