我一直在阅读关于运行时类型信息的java这本书,我对类对象和类Class非常困惑。问题可能很愚蠢,但我有点困惑。当我们通常编写一个类时,我们使用较小的case c作为word类。例如。公共类Foo,类名以大写字母开头。所以类Class是类名的大写字母C.现在混淆是关于类对象。这也是该类的大写。所以现在例如,如果我们在诸如
之类的类中说出一个方法public void countClass(Class<?> type) {
Class<?> superClass = type.getSuperclass();
}
public TypeCounter (Class<?> baseType) {
this.baseType = baseType;
}
现在在第一个方法中,我理解的是void类型的方法countClass有一个任何类型的对象的参数?这里提到的类是什么? CLass班?还是Class对象?如果它是任何类型的类对象,为什么我们不能在这里写出超类的名称,而不是让事情复杂化呢?
在第二种方法中,TypeCounter方法根本没有说明类型?这是如何运作的?并且它在传递的参数中有一种类型?
如果这些是指Class类,那它究竟意味着什么?如果它只是Class对象,那么在这种情况下类对象实际上做了什么?
有这样的课程:
static class PetCounter extends LinkedHasMap<Class<? extends pet>,Integer> {
....}
现在班级真的是什么? class Class还是Class对象?如果我对这个问题感到困惑,我很抱歉。但请尝试回答。
提前致谢。
答案 0 :(得分:2)
type
是对未知类型的引用(因此<?>
)。
假设您有一个类Car
,您可以将此车的运行时表示传递给countClass。然后使用getSuperClass,您将获得Car
的超类。这可能是对象或其他东西。
第二个是一个构造函数,它有一个类型Class
的参数用于未知类型(因此<?>
)。
最后一个示例是一个名为PetCounter
的静态内部类,它派生自LinkedHashSet,而LinkedHashSet又只接受实例化pet的Class类型的对象。 (我猜pet
应该是大写的。)
这意味着:您只能添加Class类型的对象,它们代表某种类型的宠物。
你必须以这种方式看待它:在java中,除了基元(int,boolean等)之外,一切都是对象。这意味着,如果我调用myObjectInstance.getClass()
,我会得到一个表示该对象元信息的对象。此对象的类型为Class
。因为我的java项目中有多个类,例如。 Car
Vehilce
等我可以进一步指定此元信息将包含的内容,因此我可以使用泛型指定此类的类型。如果我不知道这一点,我可以指定<?>
。
答案 1 :(得分:1)
<?>
是所谓的通配符参数,意思是它可以是任何类型的对象,而不指定超类。我们可以通过定义超类(<? extends A>
)或子类(<? super B>
)来缩小范围,但在这种情况下我们不会。
第二种方法实际上是一个构造函数,它是一种类样板文件,用于传递值来初始化类字段。它是一个基本的OOP概念,请务必阅读更多相关信息。
答案 2 :(得分:1)
类类型变量包含类的元数据(如方法详细信息,注释,按类等实现的接口等)。它不与任何特定的类实例相关联,但对于给定类的所有实例都是相同的。
小写类是类声明的保留关键字。
在第一个方法中,参数是Class类型,它不是实例,而是从
创建的元数据持有者Class<?> metadata = AnyClass.class;
这可能不会回答你的整个问题,但希望能给你一个思考的方向。
答案 3 :(得分:1)
让我们看一下Class类的javadoc:
类Class的实例表示a中的类和接口 运行Java应用程序。 ...
Class没有公共构造函数。而是构造了Class对象 由Java虚拟机自动加载和加载类 在类加载器中调用defineClass方法。
...
也可以获取命名类型的Class对象(或者 void)使用类文字。请参阅Java™语言的第15.8.2节 规格。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
关键字class
用于类声明(定义类)或类文字(表示类的Class对象以供运行时使用)
public class Foo {}
Class<Foo> fooClass = Foo.class;
上面解释的Class
类在运行时用于表示对象的类作为对象。
Methods[] methods = fooClass.getMethods();
Foo foo = fooClass.newInstance();
另一个例子,从对象的实例中获取Class
:
Foo foo2 = new Foo();
Class<Foo> fooClass2 = foo2.getClass();
答案 4 :(得分:1)
首先,您必须知道“class”和“Class”之间的区别。我们将类似的东西放入同一类别,即“class”。例如,汽车和自行车可以在车辆类中。当然,所有类可以放在同一类别中,即“类”。“类”表示“类”的原型。类的每个对象都有自己的类,它保留其信息,如名称,属性,方法等。