栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于静态代码块的执行顺序,很简单的一道题,应该所有人都会吧

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于静态代码块的执行顺序,很简单的一道题,应该所有人都会吧

public class User {

private static final Address address1=new Address(“guangdong”);

private Address address2=new Address(“guangxi”);

static {

System.out.println("-- User 的静态代码块1–");

}

{

System.out.println("-- User 的非静态代码块1–");

}

public User() {

{

System.out.println("-- User 的普通代码块1–");

}

System.out.println("-- User 的构造方法–");

{

System.out.println("-- User 的普通代码块2–");

}

}

private static final Address address3=new Address(“hubei”);

private Address address4=new Address(“hunan”);

{

System.out.println("-- User 的非静态代码块2–");

}

static {

System.out.println("-- User 的静态代码块2–");

}

}

public class StaticCodeTest {

public static void main(String[] args) {

new User();

}

}

可以先写下自己的答案哦。

来对答案吧!

– Address 的构造方法:province=guangdong

– User 的静态代码块1–

– Address 的构造方法:province=hubei

– User 的静态代码块2–

– Address 的构造方法:province=guangxi

– User 的非静态代码块1–

– Address 的构造方法:province=hunan

– User 的非静态代码块2–

– User 的普通代码块1–

– User 的构造方法–

– User 的普通代码块2–普通代码块2–

可以看到,静态代码块和静态变量的赋值是最快执行的,执行的顺序是按照在类中写的顺序来执行的,然后就是 User 的成员变量的赋值、User 的非静态代码块、最后再是构造方法,普通代码块实际上跟普通的代码差不多了哈哈。

好了,今天就到这里了,下课。

复杂一丢丢的题

====================================================================

啊喂,就这么简单?我都不好意思发出来了,上面的题目几乎学过 Java 的都能做出来,来来来,加点难度,不是还有一个继承嘛,我给你们加上。

public class SonUser extends User {

private static final Address address1=new Address(“beijing”);

private Address address2=new Address(“nanjing”);

static {

System.out.println("-- SonUser 的静态代码块1–");

}

{

System.out.println("-- SonUser 的非静态代码块1–");

}

public SonUser(){

{

System.out.println("-- SonUser 的普通代码块1–");

}

System.out.prin

【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

tln("-- SonUser 的构造方法–");

{

System.out.println("-- SonUser 的普通代码块2–");

}

}

{

System.out.println("-- SonUser 的非静态代码块2–");

}

static {

System.out.println("-- SonUser 的静态代码块2–");

}

}

public class StaticCodeTest {

public static void main(String[] args) {

new SonUser();

}

}

这个答案是有点长了。不先写好答案也行吧,来一起看看。

– Address 的构造方法:province=guangdong

– User 的静态代码块1–

– Address 的构造方法:province=hubei

– User 的静态代码块2–

– Address 的构造方法:province=beijing

– SonUser 的静态代码块1–

– SonUser 的静态代码块2–

– Address 的构造方法:province=guangxi

– User 的非静态代码块1–

– Address 的构造方法:province=hunan

– User 的非静态代码块2–

– User 的普通代码块1–

– User 的构造方法–

– User 的普通代码块2–

– Address 的构造方法:province=nanjing

– SonUser 的非静态代码块1–

– SonUser 的非静态代码块2–

– SonUser 的普通代码块1–

– SonUser 的构造方法–

– SonUser 的普通代码块2–SonUser 的普通代码块2–

可以看到有关于静态的(包含父类和子类)基本上都是在一开始就执行了,静态变量以及静态代码块,只不过父类的会比子类的更快执行,在执行完静态代码块后,就会去执行父类的变量

静态变量赋值和静态代码块,可以看作是一段静态代码的打包,按照代码顺序打包到一起,而成员变量的赋值非静态代码块也打一个包,前者我们可以称作静态代码包,后者我们可以称作非静态代码包。

在类加载时就执行静态代码包,这个只执行一次;在每次声明(new)一个对象的时候就会执行非静态代码包,然后再执行构造方法,注意这里的非静态代码包会每次都执行,构造方法就看每次调用的是那个,就执行那个构造方法。

一起来看看 Byte Code

============================================================================

这里的静态代码包和非静态代码包虽名称是我编的,但是确实存在这个东西。

让我们看看 User 类的字节码。

public class test/other/entity/User {

// compiled from: User.java

// access flags 0x1A

private final static Ltest/other/entity/Address; address1

// access flags 0x2

private Ltest/other/entity/Address; address2

// access flags 0x1A

private final static Ltest/other/entity/Address; address3

// access flags 0x2

private Ltest/other/entity/Address; address4

// access flags 0x1

public ()V

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号