Java中的getClass如何工作

Bre*_*min 9 java object tostring

以下是JavaDoc所说的内容:

public final Class <?> getClass()
Run Code Online (Sandbox Code Playgroud)

返回此运行时类Object.返回的Class对象是由static synchronized所表示的类的方法锁定的对象.
实际结果的类型是Class<? extends |X|>其中|X|是静态类型上其表达的擦除getClass被调用.例如,此代码片段中不需要强制转换:

Number n = 0;
Class<? extends Number> c = n.getClass();
Run Code Online (Sandbox Code Playgroud)

返回:
表示此对象的运行时类的Class对象.

现在,我知道它是一个本机方法,因此它是在依赖于平台的代码中实现的.但是这种方法的返回类型呢?

public final Class<?> getClass()
Run Code Online (Sandbox Code Playgroud)

另外,请考虑以下代码:

class Dog
{
    @Override
    public String toString()
    {
        return "cat";
    }
}

public class Main
{
    public static void main(String[] args)
    {
        Dog d= new Dog();
        //Class<Dog> dd = new Dog();  Compile time error
        System.out.println(d.getClass());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

班狗

所以,我的疑问在于:

  1. 返回此方法的类型
  2. 不调用toString方法.关于这个主题的类似帖子是: Java.getClass()返回一个类,为什么我也能得到一个字符串呢?
  3. 注释的代码否则会产生编译时错误.

lau*_*une 7

The data for each object contains a reference to an object of class java.lang.Class, and this is returned by the method getClass. There is also one java.lang.Class object describing java.lang.Class.

Think of a Class object as the "blueprint" describing a certain class from which objects are being made. It stands to reason that blueprints also need a blueprint of their own (or else how would engineers know how to make blueprints).

These statements try to illustrate this.

Integer integer = 1;
Class<?> clazzInteger = integer.getClass();
System.out.println( "class of integer=" + clazzInteger );
Class<?> clazzClazzInteger = clazzInteger.getClass();
System.out.println( "class of class Integer's class=" + clazzClazzInteger );
String string = "x";
Class<?> clazzString = string.getClass();
System.out.println( "class of string=" + clazzString );
Class<?> clazzClazzString = clazzString.getClass();
System.out.println( "class of class String's class=" + clazzClazzString );
Run Code Online (Sandbox Code Playgroud)

Output:

class of integer=class java.lang.Integer
class of class Integer's class=class java.lang.Class
class of string=class java.lang.String
class of class String's class=class java.lang.Class
Run Code Online (Sandbox Code Playgroud)

类有一个名称,就像蓝图描述的任何名称一样,不要与蓝图本身混淆.如果类对象出现在某个上下文中,则会隐式调用其toString()方法,并返回类的名称.如果您想要打印类的所有细节(类似于打印蓝图本身),您必须编写大量代码 - 只需查看java.lang.Class的javadoc:有一个糟糕的要检索的大量信息(如蓝图所示).