Java类对象和类Class

时间:2015-08-05 06:50:32

标签: java

我一直在阅读关于运行时类型信息的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对象?如果我对这个问题感到困惑,我很抱歉。但请尝试回答。

提前致谢。

5 个答案:

答案 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)

java中的

类型变量包含类的元数据(如方法详细信息,注释,按类等实现的接口等)。它不与任何特定的类实例相关联,但对于给定类的所有实例都是相同的。

小写是类声明的保留关键字。

在第一个方法中,参数是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”。例如,汽车和自行车可以在车辆类中。当然,所有类可以放在同一类别中,即“类”。“类”表示“类”的原型。类的每个对象都有自己的类,它保留其信息,如名称,属性,方法等。