java中静态代码块,非静态代码块,构造函数
关于静态代码块
静态代码块的写法:
static {
System.out.println("我是静态代码块");
}
静态代码块的特点:
1.执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。
2.随着类的加载而执行,而且只执行一次
先说一下类加载,一个程序要想运行,首先要把代码加载到内存中,然后才能去和CPU交流,这是冯诺依曼计算机规定的。Java也是一样,Java的.class字节码文件要想执行,首先也要加载到内存,由类加载器把字节码文件的代码加载到内存中,这一步就叫类加载,这是首先要进行的。
关于非静态代码块:
非静态代码块的写法:
{
System.out.println("我是非静态代码块");
}
非静态代码块的特点:
1.执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。
2.非静态代码块在每new一次就执行一次
静态代码块与非静态代码库的异同点:
相同点:
都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
不同点:
1.静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。
静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以 在普通方法中定义(个人感觉作用不大);而静态代码块不行。
2.静态代码块是自动执行的;
静态方法是被调用的时候才执行的;
作用:
静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。
关于构造函数:
构造函数写法:
public class Father{
Father(){
System.out.println("我是构造函数");
}
}
构造函数的特点:
1.构造函数的名字必须和类名完全相同,构造函数不能有
2.返回值,不写void,构造函数不可以被子类继承
3.构造函数可以重载但是不可以被子类覆盖。
关于静态代码块,非静态代码块及构造函数的执行顺序
1.只在父类Class中测试
public class Father {
static {
System.out.println("父类的静态代码块");
}
{
System.out.println("父类的非静态代码块");
}
Father() {
System.out.println("父类的构造函数");
}
public static void main(String[] args) {
System.out.println("new父类前的main方法");
new Father();
System.out.println("new父类后的main方法");
}
}

总结:
只在父类Class中的执行顺序:
静态代码块>new 对象前的main方法顺序执行>非静态代码块>构造函数>new 对象后的main方法顺序执行
2.在继承了父类的子类Class中测试
public class Son extends Father {
static {
System.out.println("子类的静态代码块");
}
{
System.out.println("子类的非静态代码块");
}
Son() {
System.out.println("子类的构造函数");
}
public static void main(String[] args) {
System.out.println("new子类前的main方法");
new Son();
System.out.println("new子类后的main方法");
}
}

总结:
在继承了父类的子类Class中的执行顺序:
父类的静态代码块>子类的静态代码块>new 对象前的main方法顺序执行>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行
3.在父类的Class中测试继承了父类的子类Class
public class Father {
static {
System.out.println("父类的静态代码块");
}
{
System.out.println("父类的非静态代码块");
}
Father() {
System.out.println("父类的构造函数");
}
public static void main(String[] args) {
System.out.println("new子类前的main方法");
new Son();
System.out.println("new子类后的main方法");
}
}

总结:
在父类的Class中测试继承了父类的子类Class中的执行顺序:
父类的静态代码块>new 对象前的main方法顺序执行>子类的静态代码块>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行
第3个(在父类的Class中测试继承了父类的子类Class)和第2个(在继承了父类的子类Class中测试)对比:
左图是在父类中new 子类然后执行main方法,右图是子类中new 子类然后执行main方法
可以看出来,父类new 子类之前,先执行父类的静态代码块,然后main函数里面的代码顺序执行,直到new 了子类,然后执行子类的静态代码块,然后父类非静态代码块>父类构造函数>子类非静态代码块>子类构造函数>new子类后的main方法顺序执行 在父类中执行了main方法,本身父类执行main方法就会执行一次静态代码块,但是在父类中main方法new了一次子类,按继承关系,父类中的静态代码块应该还会执行,但是控制台中却没有打印,这就是因为静态代码块的特征的原因所致,随着类的加载而执行,而且只执行一次.
如果还是有疑问,则看一下代码:

java中静态代码块,非静态代码块,构造函数的更多相关文章
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
- 静态代码块&非静态代码块&构造函数
总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态 ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序
java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...
- Java中替换HTML标签的方法代码
这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").r ...
- C#和Java中执行SQL文件脚本的代码(非常有用)
原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...
- java中CRUD(增删查改)底层代码的实现
java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...
- Java静态同步方法和非静态同步方法
所有的非静态同步方法用的都是同一把锁——该实例对象本身.也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁进而执行 ...
- Java 中 try、catch、finally 语句块的执行顺序
假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...
- Java中的守护线程 & 非守护线程(简介)
Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...
随机推荐
- pip install locustio报错
安装locust时, 执行pip install locustio时报错 ERROR: Cannot uninstall 'requests'. It is a distutils installed ...
- What is Dark Social & Dark Traffic?
What is Dark Social & Dark Traffic? By Iaroslav Kudritskiy Google Analytics is supposed to speak ...
- c语言ARP应用
对于windows环境,winsock不能用来发ARP请求: 发表于: 2002-04-23 11:45:12 arp是请求硬件地址的.winsock层次太高啦... 用winsock中的sendto ...
- outlook寻找/删除指定日期范围内的邮件
总是收到很多系统预警邮件,时间久了攒了好多垃圾邮件.实际上只需保存近期预警邮件,之前的完全可以删除. 上网找了一圈也没找到方法,然后自己想到了一种,步骤如下: 使用outlook规则,将指定日期范围内 ...
- 再谈JVM中类加载
前言 由于本人参加面试,但是JVM这块回答的十分不好,问了面试官,面试官说我基础不行!我真的不行,所以看过的不一定能理解,感觉之前就是糊弄任务,然后这次等实训结束,啥都干完了,我就记录下,深入了解下面 ...
- java中volatile关键字的作用
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...
- Linux下安装xrdp
ubuntu 打开终端,依次输入如下命令: sudo apt-get install xrdp sudo apt-get install vnc4server tightvncserver cd /h ...
- 从 .NET 到 JavaScript —— 纯前端报表控件 ActiveReportsJS 焕新登场
报表工具的发展史,最早可以追溯到微软报表SSRS(SQL Server Reporting Services)时期.最初,报表工具主要应用于报表的定制.呈现和输出.经过几十年的发展,随着各种业务系统功 ...
- ASP.NET跨平台、分布式技术架构技术栈概览 (迄今为止最全的.NET技术栈)
今天有个学技术的小兄弟问我,现在这么多的技术我要学哪个?我说你根据岗位来学,学好了哪一门都可以在社会上立足,如今已经早已不是我们当年学习IT时候那么单纯了,给他讲了很多,发现现在的技术栈变得层次复杂且 ...
- python-day5(正式学习)
格式化输出 符合某种输出规范的print函数的应用 第一种方式 使用占位符.漫威里有个人叫斯塔克,他平时站在人堆里(print函数引号内的内容)我们看不出来和其他人有什么异常(print的终端显示), ...

