我们都知道Java程序运行时,做的第一件事情就是试图访问main方法,因为main方法是程序执行的入口,那么一个类加载的时候首先运行的一定是main方法吗?
我们看一个示例:
package day3;
public class MethodSequence {
public static void main(String[] args) {
System.out.println("main方法");
test();
}
{
System.out.println("类加载中执行的非静态代码块");
}
static {
System.out.println("类加载中执行的静态代码块");
}
public static void test(){
System.out.println("静态方法");
}
}
运行结果:
通过这段代码我们可以看出,在java运行时先运行静态代码块再运行main方法。最后执行其他的方法。
这个静态方法在main方法中被显式调用发生才执行,那么在静态代码块中显式调用test会如何?
此时发现静态方法居然在main方法之前被调用,实际上静态方法已经在JVM启动时被加载了,而main方法和test方法的加载顺序,取决于文件的位置和编译器。main方法之所以被调用是因为他是程序的主方法。(请注意加载和调用不一样)
你可以自行尝试在静态代码块中先加载main再加载test的情况看看是什么样的。
所以从类加载角度来说:
静态代码块 > main方法
这时我们引入对象再看看运行情况。
package day3;
public class MethodSequence {
public static void main(String[] args) {
System.out.println("main方法");
test();
MethodSequence t1 = new MethodSequence();
MethodSequence t2 = new MethodSequence();
}
//相当于普通方法
{
System.out.println("类加载中执行的非静态代码块");
}
static {
System.out.println("类加载中执行的静态代码块");
}
public MethodSequence(){
System.out.println("构造方法");
}
public static void test(){
System.out.println("静态方法");
}
}
运行结果是这样的:
通过对比我们发现,静态的代码块和方法都只执行过一次。而且是最优先执行的,我们可以得到这样的规律:
静态代码块>main方法>静态方法>非静态代码>构造方法
为什么会有这样的规律?
分析:
因为静态部分依赖于类,而不是依赖于对象,所以静态部分优先被加载出来
main方法是一个特殊的静态方法,当找到main方法时,会继续试着从main方法找到其他加载部分。
所以执行顺序大致分为以下三类:
当加载一个类时,JVM会根据属性的数据类型赋初值,然后对静态属性初始化,并且为静态属性分配内存空间。
注意:加载时先加载静态的代码块内容,再加载静态方法。并且静态部分只加载一次,当所有的静态被加载完就可以创建对象了
当new一个对象时,这时会调用构造方法,在调用构造方法之前,静态部分已经不加载完成了,此时静态部分不会重新被加载一次。然后动态属性初始化,分配内存。
注意:方法只有调用时才会分配内存,当方法执行结束后立马释放内存。
new一个对象时,这时会调用构造方法,在调用构造方法之前,静态部分已经不加载完成了,此时静态部分不会重新被加载一次。然后动态属性初始化,分配内存。
注意:方法只有调用时才会分配内存,当方法执行结束后立马释放内存。
所以构造方法大于一般方法
文章浏览阅读482次。这是因为权限不够,将任务管理器使用管理员身份打开即可:_nvm exit status 1:
文章浏览阅读4k次,点赞2次,收藏14次。根据官网总结:<el-select v-model="form.formVal" clearable filterable remote @change="changeVal($event)" :remote-method="getFormList" placeholder="请选择表单"> <el-option v-for="item in formList" :key="item.id" :label="item.formName" .._element ui的下拉框搜索如何实现
文章浏览阅读726次。srvctl add service参数如下:-s:服务名-r:首选实例名-a:备用实例名-p:TAF策略,有none,basic,preconnect三个值可选-d-pdbsrvctl add service -help 查看各个参数的含义这里如果未指定-pdb,则连到cdb上,这在远程克隆pdb,设置tns的时候需要srvctl add service -s lych_srv -d x..._srvctl -p taf策略 none basic preconnect
文章浏览阅读3k次。有用户问小编删除win10地址栏历史记录方法,其实在Win7系统下进行搜索操作经常会留下浏览记录,这样很容易暴露用户的操作痕迹,所以用户在使用完后可以清楚这些任务栏中的浏览记录。那怎么删除win10地址栏历史记录方法呢?下面就让小编给大家介绍一下关于怎么删除win10地址栏历史记录方法的方法吧!1、如图所示我们的任务栏中的地址会自动留下我们的浏览痕迹,怎么去掉这些痕迹呢?删除win10地址栏历史记..._如何删除"我的电脑"路径栏上的记录?
文章浏览阅读370次。数据在网络中是被分成一个个数据包传输的,每个数据包中有表示数据信息和提供数据路由的帧。而数据包在一般介质中传播是总有一小部分由于两个终端的距离过大会丢失,而大部分数据包会到达目的终端。 在cmd 中键入ping [网址],显示最后一行(x% loss)就是对目标地址ping包的丢包率。 ..._网络丢包率
文章浏览阅读660次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar_el-upload重新上传文件不触发on-change
文章浏览阅读1.9w次,点赞2次,收藏5次。今年我的目标是【个体崛起】,年初写下自己的目标,希望年终会有收获! adb 命令敲黑板的知识点启动app,在终端输入:#adb shell am start -n 包名/启动的activity关闭app,在终端输入#adb shell am force-stop 包名..._adb 关闭当前activity
文章浏览阅读368次。01-WEB环境搭建 一、JavaWEB概述 常用软件体系结构 C/S C/S结构即客户端/服务器(Client/Server),例如QQ; 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户端程序; 缺点:软件更新时需要同时更新客户端和服务器端两端,比较麻烦; 优点:安全性比较好。 ..._javaweb
文章浏览阅读503次。实例:实例代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>视频标签栏切换</title> <style> * {_爱奇艺轮播图代码
文章浏览阅读777次,点赞8次,收藏8次。【代码】完美解决JS点击一次却触发了两次的解决办法。_javascrip点击事件执行两次 js
文章浏览阅读7.4k次,点赞7次,收藏28次。controller的异常处理以及service层的事务控制最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看。还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法;service层面向的是controller,service层中的某些方法,必须保_controller层吃掉异常
文章浏览阅读3k次。一篇关于“面向云环境基于属性加密的密文分享系统”的简介_属性加密cpabe的系统设计