java中,这是什么写法?

罗曼蒂克在消亡
  • 15
HttpHeaders createHeaders(String username, String password){
      return new HttpHeaders() {{
          String auth = username + ":" + password;
          byte[] encodedAuth = Base64.encodeBase64( 
             auth.getBytes(Charset.forName("US-ASCII")) );
          String authHeader = "Basic " + new String( encodedAuth );
          set( "Authorization", authHeader );
      }};
 }

从论坛上看到这段代码,大致知道该方法的作用,但是 new HttpHeaders() 之后为啥这样写啊?看了HttpHeaders的构造函数有两个,一个无参,一个三参。不理解图中这种写法,望各位告知,谢谢

======================================分割线======================================

首先谢谢各位的回答,我搜了下关于代码块,构造代码块,静态代码块的相关知识。写了个测试代码,

public class Demo01 {
String name ;

public Demo01(String name){
    System.out.println("构造函数");
    this.name = name;
}
{
    System.out.println("类中的构造代码块");
}
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public void show(){
    System.out.println(name);
}
public static void main(String[] args) {
    Demo01 demo = new Demo01("11"){{
            System.out.println("构造代码块???");
            setName("22");
        }};
    demo.show();
}
}

执行结果如下:

clipboard.png

问 :如果是构造代码块,执行时应该是先于构造函数,但打印结果却是最后执行,所以到底是不是构造代码块呢?如果不是,那这种写法就是普通代码块吗?

回复
阅读 2.4k
4 个回答

其实很简单,使用javac编译之后得到两个class(Demo01.class Demo01$1.class),我贴上来你看一下。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public class Demo01 {
    String name;

    public Demo01(String var1) {
        System.out.println("类中的构造代码块");
        System.out.println("构造函数");
        this.name = var1;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String var1) {
        this.name = var1;
    }

    public void show() {
        System.out.println(this.name);
    }

    public static void main(String[] var0) {
        Demo01 var1 = new Demo01("11") {
            {
                System.out.println("构造代码块???");
                this.setName("22");
            }
        };
        var1.show();
    }
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

final class Demo01$1 extends Demo01 {
    Demo01$1(String var1) {
        super(var1);
        System.out.println("构造代码块???");
        this.setName("22");
    }
}

这种方法是匿名对象的方法,然后在构造代码块执行代码,构造代码块会比构造方法先执行。

里面是个构造代码块,然后,回想一下,Java中代码的执行顺序。

楼上正解,是生成一个类Demo01$1继承Demo01,然后在Demo01$1的构造器里面先调用父类Demo01的构造器, System.out.println("构造代码块???");是子类构造器里面的一行代码。。。。

宣传栏