一、static关键字
static关键字在Java程序开发过程之中主要进行属性和方法的定义。
1、static 定义属性
类中的最主要的组成就是属性和方法。
static可以定义公共属性,所有对象都可以拥有并且修改公共属性的能力。
static属性可以在没有实例化对象的情况下直接通过类名称访问。
在以后编写类的过程中首先考虑的全部都是非static属性,只有在描述公共的属性的时候才会考虑到static属性,如果说使用占比:非static属性(98%),static属性(2%)。
2、static 定义方法
使用static定义方法的最大特征在于可以直接由类名称进行方法调用,不管是static属性还是static方法,都不会受到实例化对象的限制。
非static(普通方法)、static方法,这两类方法之间的调用有如下限制:
- 非static方法可以调用static属性与非static属性,也可以调用static方法;
- static方法不允许调用非static属性方法,只允许调用其它的static属性或方法;
|- static 所有方法和属性可以在没有实例化对象的形式下进行访问,而所有的非static操作要求必须存在有实例化对象才可以进行访问,所以两者是完全矛盾的;
在所有类设计的大部分情况下类中的组成基本上都是以非static方法和属性的形式出现的,所以static操作只作为一小部分的情况出现(不作为设计首选),当需要描述公共以及避免实例化对象困扰的时候才会使用static结构。
二、代码块
代码块是一种进行程序切割的一种手段,在Java里面支持有四类代码块:普通代码块、构造代码块、静态代码块、同步代码块,其中同步代码块的使用最为复杂。
1、普通代码块
所谓的普通代码块值的是在代码之中利用“{}”括起来的一段程序代码
代码块的本质上就是一组“{}”定义的程序语句。
范例:普通代码块
public class TestDemo {//主类
public static void main(String[] args){//主方法
{ //普通代码块
int num = 10; //局部变量
System.out.println("【1】num="+num);
}
{ //这样观察会更加的清晰,每个num都属于局部变量
int num = 100; //局部变量
System.out.println("【2】num="+num);
}
}
}
程序执行结果:
【1】num=10
【2】num=100
普通代码块的主要功能是之间写在方法之中,并且将一个比较长的方法进行切割处理,这样就可以防止同名变量出现冲突。但是由于限制的方法代码都比较简单,所以对于重名变量可以轻松回避。
2、构造块
将一个代码块定义在类之中,就成为了一个构造块,并且该构造块将随着每一次类对象的实例化进行调用。
范例:构造块
class Ball{
{//代码块直接写在了类之中
System.out.println("【构造块】Ball类...");
}
}
public class TestDemo{ //主类
public static void main(String[] args) { //主方法
new Ball();
new Ball();
}
}
程序执行结果:
【构造块】Ball类...
【构造块】Ball类...
如果说构造块与构造方法同时定义在类之中了,那么构造块中的代码会先执行。
范例:构造块与构造方法
class Ball{
public Ball(){
System.out.println("【构造方法】public Ball(){...}");
}
{//代码块直接写在了类之中
System.out.println("【构造块】Ball类...");
}
}
public class TestDemo{ //主类
public static void main(String[] args) { //主方法
new Ball();
}
}
程序执行结果:
【构造块】Ball类...
【构造方法】public Ball(){...}
构造方法的主要功能是进行属性的赋值处理,如果有一些先期的处理逻辑为了与构造方法的结构分开,就可以利用构造块的形式完成。
3、静态块
静态块是使用static关键字定义的代码块,静态块需要考虑两种的定义位置:普通类中、主类中。
范例1:普通类中定义静态块
class Ball{
public Ball(){
System.out.println("【构造方法】public Ball(){...}");
}
{//代码块直接写在了类之中
System.out.println("【构造块】Ball类...");
}
static{//代码块使用了static声明
System.out.println("【静态块】Ball类...");
}
}
public class TestDemo{ //主类
public static void main(String[] args) { //主方法
new Ball();
new Ball();
}
}
程序执行结果:
【静态块】Ball类...
【构造块】Ball类...
【构造方法】public Ball(){...}
【构造块】Ball类...
【构造方法】public Ball(){...}
通过执行结果可以发现,静态块优先于构造块执行,并且不管有多少个实例化对象,静态块只执行一次,大部分情况下静态块往往会作为一些公共属性初始化操作。
主类中也可以定义静态块,该静态块的执行优先于主方法执行。
范例2:主类中定义静态块
public class TestDemo {//主类
static {
System.out.println("【1】");
}
public static void main(String[] args){//主方法
System.out.println("【2】");
}
}
程序执行结果:
【1】
【2】