任何人都可以告诉我为什么这句话工作正常:System.out.println(p [i]);

时间:2017-08-13 19:20:43

标签: java

阅读密码学,无法理解为什么指示的代码行打印数据:

Provider p[] = Security.getProviders()
for (int i = 0; i < p.length; i++) {
    System.out.println(p[i]); // <<<--- THIS LINE

为什么打印出数据,如果它不是字符串,则是提供者对象

感谢。

6 个答案:

答案 0 :(得分:5)

因为println()接受了很多类型,所以此方法有很多签名,例如:

println(int i){...}               //when you set int you call this
println(String i){...}            //when you set String you call this
println(boolean i){...}           //when you set boolean you call this
println(char i){...}              //when you set char you call this
println(java.lang.Object i){...}  //when you set Object you call this
... and so on

看看java.lang.System

答案 1 :(得分:1)

编辑:Java中的所有类(其中大多数类如下所述,谢谢)都有toString()方法,它返回一个对象的String表示,同样适用于Provider类。编写自己的类时,可以覆盖toString()方法,这意味着您可以编写名为toString()的方法,只要您尝试以String形式访问该对象,就会调用该方法(例如,在System.out.println()中)。

希望这有帮助,如果不是,只需google toString()。

答案 2 :(得分:1)

基本上,println()调用Object的toString()方法(即Provider toString())来打印对象的字符串表示。 (如果Provider类已实现toString(),则继承自Object类的默认toString()

Javadoc linkhttps://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(java.lang.Object)

  

public void println(Object x)

     

打印一个对象,然后终止该行。此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println()。

     

参数:

     

x - 要打印的对象。

如果Object(即你的情况下是提供者)类没有覆盖默认的java.lang.Object的类toString()那么它会显示什么?

它实际上打印了类名+“@”符号+ Object的hashcode方法的十六进制值。 (hashcode也继承自Object类)

public class Solution {
    private int i;

    public Solution() {
        this.i = 10;
    }
    public static void main(String... args) {
        Solution solution = new Solution();
        System.out.println(solution);
        // what is default toString prints?
        System.out.println(Integer.toHexString(solution.hashCode()));
    }
}

示例运行

Solution@5eba06ff
5eba06ff

如果Object(即你的情况下是提供者)覆盖了默认的java.lang.Object类toString()那么它会显示什么?

它实际上打印了你打算在toString()中打印的内容。

public class Solution {
    private int i;

    public Solution() {
        this.i = 10;
    }

    @Override
    public String toString() {
        return "Solution [i=" + i + "]";
    }

    public static void main(String... args) {
        Solution solution = new Solution();
        System.out.println(solution);
    }
}

示例运行

Solution [i=10]

答案 3 :(得分:0)

在java中,每当我们尝试1.直接打印对象2.或者直接用字符串连接对象时,会自动调用 toString方法。默认情况下,字符串打印类名@ hashcode

与您的示例中一样, p[i].toString()正在发生

因为,对象类是直接或间接的每个类的父类,所以它的所有11个函数(包括toString())都在子类中继承。

Provider类重写Hashtable<Object,Object>类中的toString()函数。 此重写的toString()返回一个字符串,其中包含此提供程序的名称和版本号

答案 4 :(得分:0)

公共类ExamineSecurity {

public static void main(String args[]) {
    try {
        Provider p[] = Security.getProviders();
        for (int i = 0; i < p.length; i++) {
            System.out.println(p[i]);
            for (Enumeration e = p[i].keys(); e.hasMoreElements();)
                System.out.println("\t" + e.nextElement());
        }
    }
    catch (Exception e) {
        System.out.println(e);
    }
}

}

如果我们使用1.2 Sun安全提供程序运行此程序,我们将获得此输出:

班级定义

SUN版本1.2         Alg.Alias.MessageDigest.SHA

    Alg.Alias.Signature.SHAwithDSA
    Alg.Alias.Signature.1.3.14.3.2.13
    Alg.Alias.Signature.OID.1.2.840.10040.4.3
    Alg.Alias.Signature.SHA-1/DSA
    Alg.Alias.Signature.DSS
    Alg.Alias.Signature.SHA1withDSA
    Alg.Alias.Signature.OID.1.3.14.3.2.13
    AlgorithmParameters.DSA
    KeyFactory.DSA
    Alg.Alias.Signature.1.2.840.10040.4.3
    Alg.Alias.MessageDigest.SHA1
    AlgorithmParameterGenerator.DSA
    Alg.Alias.AlgorithmParameters.1.2.840.10040.4.1
    MessageDigest.MD5
    Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1
    MessageDigest.SHA-1
    Alg.Alias.KeyPairGenerator.OID.1.3.14.3.2.12
    Signature.DSA
    Alg.Alias.KeyPairGenerator.1.3.14.3.2.12
    Alg.Alias.KeyPairGenerator.1.2.840.10040.4.1
    Alg.Alias.Signature.1.3.14.3.2.27
    Alg.Alias.Signature.SHA/DSA

从这个例子中可以看出两件事。首先,仅包含引擎名称和算法的字符串实现了我们在表8-1中列出的预期操作。其次,正如我们在Provider类的部分中提到的,安全提供程序通常利用Provider类是Properties类的子类的事实,以提供仅对作为提供程序包一部分的其他类有意义的属性。因此,签名算法1.3.14.3.2.13可能对Sun安全提供程序中的一个类but it is not a string that will necessarily not make sense to other developers. In fact, those aliases--including the ones that are prefaced by OID--do have meanings within the cryptography standards world有意义,但出于我们的目的,我们将坚持使用前面列出的标准算法名称。

答案 5 :(得分:-2)

类Provider的toString()方法似乎已实现。