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



