java代码块牛刀小试

Posted xunzhaorendaxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java代码块牛刀小试相关的知识,希望对你有一定的参考价值。

牛刀小试1.

  试一把静态代码块、实例化代码块和构造函数的执行顺序

public class People

public static int num = 0;//静态变量初始化
String name;//初始化为null

//构造函数
public People(String name) 
System.out.println(num + ":构造函数初始化");
this.name = name; //将name引用指向传入参数
num++; //构造函数执行结束num值+1


//实例初始化块

System.out.println(num + ":实例初始化块");


//静态初始化块
static 
System.out.println(num + ":静态初始化块");


public static void main(String[] args) 
People people1 = new People("xunzhaorendaxia");
People people2 = new People("xunzhaorendaxia");

输出结果:

0:静态初始化块
0:实例初始化块
0:构造函数初始化
1:实例初始化块
1:构造函数初始化

  反编译后的代码:

public class People

public static int num = 0;
String name;

public People(String name)

System.out.println(num + ":实例初始化块");

System.out.println(num + ":构造函数初始化");
this.name = name;
num += 1;


public static void main(String[] args)

People people1 = new People("xunzhoarendaxia");
People people2 = new People("xunzhaorendaxia");


static

System.out.println(num + ":静态初始化块");

结论:

1)执行先后顺序,静态初始化块>实例初始化块>构造函数初始化。
2)静态初始化块只在类加载时执行一次,实例初始化块和构造函数初始化每次实例化类时都执行。
3)实例初始化块的代码,其实被放进了构造函数里面,且放在构造函数内容的前面。

牛刀小试2.

  测试一种初始化HashMap的方式(使用场景是想优雅的初始化一些Key-Value的参数):

public class Person 
  
    public static int num = 0;//静态变量初始化
    String name;//初始化为null

    //构造函数
    public Person(String name) 
        System.out.println(num + ":构造函数初始化");
        this.name = name; //将name引用指向传入参数
        num++; //构造函数执行结束num值+1
    

    //实例初始化块
    
        System.out.println(num + ":实例初始化块");
    
   static Map map1=null;
    //静态初始化块
    static 
        System.out.println(num + ":静态初始化块");
        
        map1 = new HashMap<String,String>()
            
                put("1", "111");
                put("2", "2222");
            
        ;
    


    public final static Map map = new HashMap();
    
    public static void main(String[] args) 
        Person people1 = new Person("xunzhaorendaxia");
        Person people2 = new Person("xunzhaorendaxia");

        System.out.println(map1.toString());
      
  

输出内容:

0:静态初始化块
0:实例初始化块
0:构造函数初始化
1:实例初始化块
1:构造函数初始化
1=111, 2=2222

 

反编译文件中会出现两个class文件:

技术图片

下面是反编译的代码:

public class Person 
    public static int num = 0;
    String name;
    static Map map1 = null;
    public static final Map map;

    static 
      System.out.println(num + ":静态初始化块");
      map1 = new 1();//这里new 1()肯定是编译优化的,怎么简单省空间怎么来。
      map = new HashMap();
   

    public Person(String name) 
        System.out.println(num + ":实例初始化块");
        System.out.println(num + ":构造函数初始化");
        this.name = name;
        ++num;
    

    public static void main(String[] args) 
        new Person("xunzhaorendaxia");
        new Person("xunzhaorendaxia");
        System.out.println(map1.toString());
    
class Person$1 extends HashMap<String, String> 
	Person$1() 
		this.put("1", "111");
		this.put("2", "2222");
	

  

下面提出个人的解析观点:

1.Person$1的class文件怎么回事?

答:Person$1.class是内部类的编译文件,即Person类中名为“1”的匿名内部类的编译文件。“1”应该是编译器优化了这里的匿名内部类。(注意查看第二个反编译文件)

2.为啥会出现匿名内部类?好像没有定义啊

答:请注意这里的Person类中HashMap的初始化方式,后面加了两层大括号,这里第一个外层编译器默认是编译成一个继承HashMap的匿名内部类。第二个内层本质上是属于实例代码块,即在执行构造方法是最先执行。(不明白的可以参考牛刀小试1)。还有一点需要注意这里的静态代码块初始化HashMap的声明要放在外面,写在静态代码块中会读不到(作用域不够)。

  static Map map1=null;
    //静态初始化块
    static 
        System.out.println(num + ":静态初始化块");
        
        map1 = new HashMap<String,String>()
            
                put("1", "111");
                put("2", "2222");
            
        ;
    

 

参考链接:https://www.cnblogs.com/xdouby/p/5890083.html

     https://blog.csdn.net/kingzone_2008/article/details/45015301

以上是关于java代码块牛刀小试的主要内容,如果未能解决你的问题,请参考以下文章

大数据选择题牛刀小练1

牛刀小试

Android开发牛刀小试之“AA算钱软件”开发

大数据选择题牛刀小练2

Android Room牛刀小试

Android Room牛刀小试