类中代码执行的顺序
1、先执行静态代码块
点击查看代码
public class ClassTest {
static{
System.out.println("静态代码执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
}
}
2、类中定义静态成员变量,会先创建对象
点击查看代码
public class ClassTest {
static User user=new User();
static{
System.out.println("静态代码执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
3、如果是非静态代码块和非静态成员变量,不执行
点击查看代码
public class ClassTest {
User user=new User();
{
System.out.println("静态代码执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
只有创建了ClassTest对象,非静态代码块和非静态成员变量才会执行,new 了几次对象就会执行多少次,执行的顺序跟代码位置有关
点击查看代码
public class ClassTest {
User user=new User();
{
System.out.println("代码块执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
ClassTest classTest = new ClassTest();
ClassTest classTest2 = new ClassTest();
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
4、如果同时存在静态代码块和非静态代码块,以及静态成员变量和非静态成员变量,先执行静态的对象,并且只执行一次,再执行非静态的对象(创建对象),创建多少个对象就会执行多少次
点击查看代码
public class ClassTest {
User user=new User();
{
System.out.println("代码块执行了");
}
static {
System.out.println("静态代码块执行了");
}
static User user1=new User();
public static void main(String[] args) {
System.out.println("main方法执行了");
ClassTest classTest = new ClassTest();
ClassTest classTest2 = new ClassTest();
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
点击查看代码
加入父子级
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.sayHello();
((Parent)child).sayHello();
}
}
class Stub{
public Stub(String str){
System.out.println(str + "-object creat");
}
}
class Parent{
static Stub parentStaticObject=new Stub("parent static object");
static {
System.out.println("parent static code");
}
{
System.out.println("parent code");
}
Stub parentStub=new Stub("parent object");
Stub stub;
public Parent() {
System.out.println("parent constructor");
stub=new Stub("parent constructor create");
}
public void sayHello(){
System.out.println("hello from parent");
}
}
class Child extends Parent{
static Stub childStaticObject=new Stub("child static object");
static {
System.out.println("child static code");
}
{
System.out.println("child code");
}
Stub parentStub=new Stub("child object");
Stub stub;
public Child() {
System.out.println("child constructor");
stub=new Stub("child constructor create");
}
public void sayHello(){
System.out.println("hello from child");
}
}
执行流程:
1.首先会加载Parent,则Parent里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)
2.加载Chlid,则Chlid里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)
3.类加载完成后,创建对象,先创建Parent对象,创建对象之前,先创建对象的资源
4.执行Parent构造器,完成对象的创建
5.创建Child对象之前,先创建对象的资源
6.执行Child构造器,完成对象的创建
7.执行sayhello的方法
总结:父类静态字段->父类静态代码块->子类静态字段->子类静态代码块->父类成员变量和非静态块(顺序加载)->父类构造函数->子类成员变量和非静态块(顺序加载)->子类构造函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了