构造函数、构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷。这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结。


一.构造函数

格式:类名(参数1,参数2,…){构造函数执行语句};

关于构造函数,以下几点要注意:

在Java中,任何变量在被使用前都必须先设置初值.
Java提供了为类的成员变量赋初值的专门功能:构造方法(constructor)
构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面:  
1.构造方法的名字必须与定义他的类名完全相同没有返回类型,甚至连void也没有。  
2.构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。  
3.每个类可以有零个或多个构造方法.  
4.不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。  
5.构造方法在创建对象时自动执行,一般不能显式地直接调用.   构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性

1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的。

2.构造函数的作用是用于给对象进行初始化。

3.构造函数笼统来说也是函数,它具备函数的一些特性,也不具备一些特性,可以把它看成是特殊的函数。它可以重载(重载时参数类型与参数个数有一项不同即可,但仅仅函数返回值类型不同是不行的),可以被权限修饰符修饰,但是它没有返回值(注意:这与平常所说的函数返回值类型是void不同)。

4.当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造方法。但是当在类中自定义构造函数后,默认的构造函数就没有了,即使是自定义的构造函数也是空参数的也是这样,因为那毕竟是你“自定义”的!

5.构造函数和一般函数不仅在写法上有不同,在运行上也有不同。构造函数是在对象一建立就运行,给对象初始化,而一般函数是对象调用时才执行,给对象添加对象具备的功能。

一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。

6.定义构造函数的需求性:当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

二.构造代码块

格式:{构造代码块执行语句};

关于构造代码块,以下几点要注意:

1.构造代码块的作用是给对象进行初始化。

2.对象一建立就运行构造代码块了,而且优先于构造函数执行。这里要强调一下,有对象建立,才会运行构造代码块,类不能调用构造代码块的,而且构造代码块与构造函数的执行顺序是前者先于后者执行(无论构造代码块出现在构造函数的什么位置,总是先执行)。

3.构造代码块与构造函数的区别是:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容

三.静态代码块

格式:static{静态代码块执行语句};

关于静态代码块,要注意的是:

1.它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的,当然,建立对象的时候,它也会执行,但是建立多个对象,它也是只会执行一次,并不是说每次建立对象它都要执行,因为它是由类调用的,且只执行一次!就它优先于主函数而执行这点来说,因为主函数也是由类调用的,所以类可以控制着执行的顺序,而实际上,类调用时,先执行静态代码块,然后才执行主函数的。

2静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。区分着理解比较容易记牢。

下面结合一个小例子来具体分析三者的用法。

classStaticCode{

int num=9;

StaticCode(){

System.out.println("b");

}

static{

System.out.println("a");

}

{

System.out.println("c");

}

StaticCode(int x){

System.out.println("d");

}

}

public classStaticCodeDemo {

public static voidmain(String[] args){

newStaticCode(1);

}

}

运行结果是

a

c

d

这是因为,主函数中的执行语句是new StaticCode(1);因为这个语句调用了StaticCode类并调用StaticCode的一个构造函数建立对象,那么在StaticCode类中,先执行的是静态代码块

static{

System.out.println("a");

}

它是在调用类时立即执行,但此时还没有建立对象。然后执行的是构造代码块,

{

System.out.println("c");

}

这是在建立对象时执行,但它的执行是优先于构造函数的。接着执行的是对应的构造函数

StaticCode(int x){

System.out.println("d");

}

,这个构造函数与new StaticCode(1);有着相同的参数个数和对应的参数类型,执行语句自动匹配寻找对应的构造函数。

另外,StaticCode类中有个成员变量num,如果将静态代码块改为

static{

System.out.println("a"+this.num);

}

则编译不通过,因为静态代码块只能调用静态变量,非静态成员变量在对象没有建立前是不存在的,这也帮助理解了静态代码块是在对象建立前执行的。

如果将构造代码块改为

{

System.out.println("c,num="+this.num);

}

那么将编译无误,运行正确,因为构造代码块是在对象建立后才运行的,是由对象调用的,对象建立后,成员变量num已经存在了,所以不会出错。

运行结果如下

a

c,num=9

d

四.普通代码块

普通代码块一般在方法和语句中出现,按照出现的先后顺序执行

//普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
public class GeneralCodeBlock01{
public static void main(String[] args){

{
int x=3;
System.out.println("1,普通代码块内的变量x="+x);
}

int x=1;
System.out.println("主方法内的变量x="+x);

{
int y=7;
System.out.println("2,普通代码块内的变量y="+y);
}
}
}

3  1   7

关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)的更多相关文章

  1. JAVA 构造函数 静态变量

    class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...

  2. Java中静态代码块、构造代码块、构造函数、普通代码块

    在Java中,静态代码块.构造代码块.构造函数.普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序. 1.静态代码块 ①.格式 在java类中(方法中不能存在静态代 ...

  3. Java类中代码的执行顺序 静态代码块>构造代码块>构造方法

    一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...

  4. java静态代码块、静态方法、静态变量、构造代码块、普通代码块

    一.静态代码块 1.在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块: public class CodeBlock{ static{ System.out.prin ...

  5. java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题

    今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...

  6. Java面试题 静态代码块 构造代码块 构造方法 的执行顺序

    JAVA中的静态代码块 构造代码块 构造方法执行顺序: 静态代码块(类加载时执行)>>构造代码块>>构造方法 下面展示一个简单的例子,推荐大家动手运行一遍: public cl ...

  7. java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序

    java静态代码块/静态属性.构造块.构造方法执行.main方法.普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果. 理论知识: 静态代码块是:属于类的,在类加载时 ...

  8. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  9. java中静态代码块,构造代码块,以及构造方法的执行顺序

    写了许久的代码,却把一些基础的东西都给忘了,今天无聊就顺手写了个,然后测试下,发现跟我记忆中的竟然有些出入,作为一个两年的开发,我感觉自己很失败啊. 父类pojo: public class Pojo ...

随机推荐

  1. Java经典编程题50道之四十二

    809*??=800*??+9*??+1,其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数.求??代表的两位数,以及809*??后的结果. public class Example ...

  2. 对于JDBC数据库的初始化操作

    package com.bluesky.connection; import java.sql.Connection; import java.sql.DriverManager; import ja ...

  3. Yii2按需加载图片怎么做?

    按需加载图片应该用 jQuery LazyLoad 图片延迟加载按需加载文件夹应该用 Yii::import

  4. B2B2C商品模块数据库设计

    kentzhu: 在电子商务里,一般会提到这样几个词:商品.单品.SPU.SKU 简单理解一下,SPU是标准化产品单元,区分品种:SKU是库存量单位,区分单品:商品特指与商家有关的商品,可对应多个SK ...

  5. 浙江省赛 C What Kind of Friends Are You?

    思路:一开始考虑n个朋友可以有c种可能,根据回答的问题,如果是yes那么可以确定一些朋友的范围,将原本不在这个范围内的删除即可:如果是"no",说明这些朋友都应该被删除,那么最后看 ...

  6. DOCKER 无法获取使用宿主机DNS 的原因,解决方法

    今天在公司服务器上部署项目,遇到一个大坑.接口怎么请求都不同,宿主机DNS已经改了.宿主可以请求,找了半天,原来是DOCKER 没有获取到主机的DNS 进去DOCKER解析不了域名 指定DNS 启动也 ...

  7. 【前端】Vue2全家桶案例《看漫画》之五、引入axios

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html 项目github地址:https://github.com/shamoyuu/ ...

  8. 沉淀,再出发——手把手教你使用VirtualBox搭建含有三个虚拟节点的Hadoop集群

    手把手教你使用VirtualBox搭建含有三个虚拟节点的Hadoop集群 一.准备,再出发 在项目启动之前,让我们看一下前面所做的工作.首先我们掌握了一些Linux的基本命令和重要的文件,其次我们学会 ...

  9. LVDS/DVI/HDMI Interface

    数字视频信号 以SXGA为例,其时序如下: 垂直:         水平: 图中DSPTMG为使能信号,VSYNC为场同步信号,HSYNC为行同步信号.在行场的消隐期(T1与T7),DSPTMG为低电 ...

  10. TI Davinci DM6446开发攻略——开发环境搭建

    TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...