与构造函数链接混淆

Ril*_*low 0 java constructor

我试图理解几个构造函数链接,我知道从同一个类的另一个构造函数调用构造函数称为构造函数链接,

当我们在构造函数中使用它时,我们实际上正在调用我们已经定义的另一个构造函数,但是我想要理解的程序很奇怪,

public AESCipher(Key key) {
        this(key.getEncoded());
    }

    /**
     * Create AESCipher based on existing {@link Key} and Initial Vector (iv) in bytes
     *
     * @param key Key
     */
    public AESCipher(Key key, byte[] iv) {
        this(key.getEncoded(), iv);
    }

    /**
     * <p>Create AESCipher using a byte[] array as a key</p>
     * <p/>
     * <p><strong>NOTE:</strong> Uses an Initial Vector of 16 0x0 bytes. This should not be used to create strong security.</p>
     *
     * @param key Key
     */
    public AESCipher(byte[] key) {
        this(key, INITIAL_IV);
    }

    private AESCipher(byte[] key, byte[] iv) {
        try {
            this.secretKeySpec = new SecretKeySpec(key, "AES");
            this.iv = new IvParameterSpec(iv);
            this.cipher = Cipher.getInstance(ALGORITHM_AES256);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw Throwables.propagate(e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在第一个构造函数中,使用了这一行this(key.getEncoded()),构造函数是这行调用的吗?在它之前没有构造函数实际上没有带有一个参数的构造函数.

在第3个构造函数中,只有一个类型的参数byte[],这就是里面发生的事情,

this(key, INITIAL_IV);
Run Code Online (Sandbox Code Playgroud)

它链接一个带有两个参数的构造函数,一个类型key和一个类型byte[],所以它链接这个构造函数AESCipher(Key key, byte[] iv),这很好,但仍然......第一个构造函数中发生了什么,以及为什么需要4个构造函数在第一个地方.

PS:我只是没有发布这个问题,我花了4小时试图了解发生了什么,但它太混乱了.

这是完整的代码,

https://github.com/mike-ensor/aes-256-encryption-utility/blob/master/src/main/java/com/acquitygroup/encryption/AESCipher.java

Fox*_*sly 5

第一个构造函数调用第三个构造函数:public AESCipher(byte[] key).

至于为什么首先有4个构造函数,它的目的是封装处理将a Key转换为a 的逻辑byte[],并允许用户使用不同的初始向量(如果他们这样选择).

  • 是现货.另外我注意到了这一点:`之前没有构造函数......`.如果这样你就会觉得你无法在文件中进一步调用方法; 没有什么可以离真相更远.Java不关心方法或其他位出现在文件中的顺序(大多数情况下......静态初始化规则确实关心,但这不是问题). (2认同)