java中代码块,方法与构造器的执行顺序。
时间:2019-11-04
本文章向大家介绍java中代码块,方法与构造器的执行顺序。,主要包括java中代码块,方法与构造器的执行顺序。使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- 代码块:以{}括起来,放在java类中,括号上以static声明的是静态代码块,执行顺序最早,在类加载时就开始执行。静态代码块不可以放在方法中,因为对于普通方法来说,只有实例被创建时才能被访问,而静态方法虽然在类被加载时就已经被加载了,但是它只可以通过类名或实例名访问,与静态代码块相比,方法都是被动运行,静态代码块是主动运行的。静态代码块执行之早可见java核心技术卷一131页下面Hello类的例子。构造代码块和普通代码块不用static修饰,前者放于类中,起到初始化的作用。构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造器执行。只要构造类的对象后这些构造代码块就会被执行。尽量将构造代码块放在域定义之后;后者放在方法中定义。有多个同类型代码块时可以按书写顺序执行。
- 构造器:最后决定域的值,可以在构造器中调用另一个构造器,用this(“被调用构造器的参数列表“”),注意调用其他构造器的语句必须放在调用者的第一行。
package thisTest; public class thisTest { private static String name; static { System.out.println("我是静态代码块!!!!!!所以我不能用this~"+name); } static { System.out.println("我是第二个静态代码块!!!!!!所以我不能用this~"+name); } { System.out.println(this+"我是构造代码块"+this.name); } { System.out.println(this+"我是第二个构造代码块"+this.name); } void f1() { System.out.println(this+"我来自f1方法"+this.name); //static 报错 方法中不可以定义普通代码块 { System.out.println(this+"我来自普通代码块"+this.name); } } static void f2() { //System.out.println(this+"我来自f2方法"+this.name); 报错,静态方法不能用this调用实例域。 System.out.println("我来自f2方法" + name); } //System.out.println(this+"我是动态代码块"+this.name);不把它声明为代码块也不把它放在方法里会报错。 public thisTest() { System.out.println(this+"我是无参数的构造方法"+this.name); } public thisTest(String name) { this();//调用无参数构造器 System.out.println(this+"我是有参数的构造方法"+this.name); this.name = name; System.out.println(this+"我也是有参数的构造方法"+this.name); //this();报错,在一个构造器中调用另一个构造器必须放在第一行。 } public static void main(String[] args) { f2(); thisTest child=new thisTest("张三"); child.f2(); child.f1(); System.out.println(child+"普通方法"+child.name); } }
输出结果是:
我是静态代码块!!!!!!所以我不能用this~null 我是第二个静态代码块!!!!!!所以我不能用this~null 我来自f2方法null thisTest.thisTest@15db9742我是构造代码块null thisTest.thisTest@15db9742我是第二个构造代码块null thisTest.thisTest@15db9742我是无参数的构造方法null thisTest.thisTest@15db9742我是有参数的构造方法null thisTest.thisTest@15db9742我也是有参数的构造方法张三 我来自f2方法张三 thisTest.thisTest@15db9742我来自f1方法张三 thisTest.thisTest@15db9742我来自普通代码块张三 thisTest.thisTest@15db9742普通方法张三
首先按顺序执行静态代码块,因为此时对象还未创建因此name被初始化为默认值null;然后执行静态方法f2(),此时name值依然是null,接下来按顺序执行构造代码块,对象还没有被创建;
接下来执行构造器了,构造了一个thisTest对象child,目前它的name还是默认值null。第一行调用无参数构造器,第二行回到带参数的构造器,可以发现现在Name还是null,在this.name = name 之前都没有。注意,接下来,执行this.name = name后,分别调用f2和f1后发现name值为张三。
在构造器中使用了两次this.name。一次在赋值前,一次在赋值后,可以看到执行完this.name = name后实例child的域立即被设置为张三。
原文地址:https://www.cnblogs.com/ljf-0/p/11790469.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- zabbix模块配置学习
- Windows下安装及使用NVM
- U盘上安装多个Linux发行版和PE
- ubuntu18.04部署python3、nginx项目
- CentOS8.x系统配置记录
- js根据经纬度换算行驶里程
- ubuntu18.04 安装docker
- COBBLER无人值守批量安装系统.md
- 使用VSCode 打包你的第一个flutter应用(安卓篇)
- KICKSTART无人值守批量安装系统.md
- Centos7-Firewall防火墙基础讲解
- 优酷iOS插件化页面架构方法
- 处理一次k8s、calico无法分配podIP的心路历程
- 小视频源码,按返回键两次退出
- iOS音视频接入 - TRTC多人音视频通话