Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类在Java中是什么意思?_Java_Class_Methods - Fatal编程技术网

类在Java中是什么意思?

类在Java中是什么意思?,java,class,methods,Java,Class,Methods,.class在Java中是什么意思?例如,如果我创建了一个名为Print的类。Print.class返回什么?当您在类名后写入.class时,它引用类文本- 对象,该对象表示有关给定类的信息 例如,如果类是Print,则Print.class是在运行时表示类Print的对象。它是由Print的任何(直接)实例的getClass()方法返回的同一个对象 Print myPrint = new Print(); System.out.println(Print.class.getName()); S

.class
在Java中是什么意思?例如,如果我创建了一个名为
Print
的类。
Print.class
返回什么?

当您在类名后写入
.class
时,它引用类文本- 对象,该对象表示有关给定类的信息

例如,如果类是
Print
,则
Print.class
是在运行时表示类
Print
的对象。它是由
Print
的任何(直接)实例的
getClass()
方法返回的同一个对象

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());

.class
在类的实例不可用时使用

.getClass()
在类的实例可用时使用

object.getClass()
返回给定对象的类

例如:

String string = "hello";
System.out.println(string.getClass().toString());
这将输出:

class java.lang.String

这是string对象的类:)

我认为这里的关键是理解类和对象之间的区别。对象是类的实例。但在完全面向对象的语言中,类也是对象。因此,调用
.class
将获取对该类的类对象的引用,然后可以对其进行操作。

如果对象的实例可用,则获取其类的最简单方法是调用
对象.getClass()

.class
语法

如果类型可用但没有实例,则可以通过在类型名称后附加
.Class
来获取类。这也是获取基元类型类的最简单方法

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

请参阅:

如果没有可用的实例,则使用
.class
语法获取类的相应类对象,否则可以使用getClass()方法获取类对象。由于不存在基元数据类型的实例,因此我们必须对基元数据类型使用
.class
语法

    package test;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }

只是澄清一下,这个“.class”方法并不是指编译java代码后看到的字节码文件,也不是指OOP理论中类和对象概念之间的混淆

此“.class”方法在Java中用于代码反射。通常,您可以为类收集元数据,例如完整的限定类名、常量列表、公共字段列表等

查看这些链接(上面已经提到)以获取所有详细信息:


通常,当您开始构建项目时,您不打算立即使用反射。在尝试管理已经运行的代码之后,您知道您需要它。很多时候,您需要它来管理程序的多个实例。也许您想识别每个特定的“克隆”,以确定是否已经定义了某些内容,或者计算函数的数量,或者只是简单地记录类的特定实例的详细信息。

类文本是由类、接口、数组或基元类型的名称或伪类型void组成的表达式,后跟“.”和标记类。 JDK 5.0中的一个变化是java.lang.class类是泛型的,
java.lang.class类
,因此:

Class<Print> p = Print.class;
Class p=Print.Class;
此处的参考资料:


对上述答案进行补充:

假设您有一个名为“myPackage.MyClass”的类。假设它在类路径中,下面的语句是等价的

//checking class name using string comparison, only Runtime check possible
if(myInstance.getClass().getName().equals(Class.forName("myPackage.MyClass")).getName()){}

//checking actual Class object for equality, only Runtime check possible
if(myInstance.getClass().getName() == Class.forName("myPackage.MyClass"))){}

//checking actual Class object for equality, but compile time validation
//will ensure MyClass is in classpath. Hence this approach is better (according to fail-fast paradigm)
if(myInstance.getClass() == MyClass.class){}
Class<?> myClassObject = MyClass.class; //compile time check

Class<?> myClassObject = Class.forname("myPackage.MyClass"); //only runtime check
同样,以下内容也是等效的

//checking class name using string comparison, only Runtime check possible
if(myInstance.getClass().getName().equals(Class.forName("myPackage.MyClass")).getName()){}

//checking actual Class object for equality, only Runtime check possible
if(myInstance.getClass().getName() == Class.forName("myPackage.MyClass"))){}

//checking actual Class object for equality, but compile time validation
//will ensure MyClass is in classpath. Hence this approach is better (according to fail-fast paradigm)
if(myInstance.getClass() == MyClass.class){}
Class<?> myClassObject = MyClass.class; //compile time check

Class<?> myClassObject = Class.forname("myPackage.MyClass"); //only runtime check
Class myClassObject=MyClass.Class//编译时检查
类myClassObject=Class.forname(“myPackage.MyClass”)//仅运行时检查
如果JVM加载一个类型,则表示该类型的类对象将出现在JVM中。我们可以从反射包中经常使用的类对象中获取关于类型的元数据。class是一个速记方法,它实际上指向表示MyClass的class对象

作为一个附录,一些关于类参考的信息将有助于阅读,因为大多数情况下,它们是一起使用的

类引用类型可以保存表示任何类型的任何类对象

如果类引用也在方法参数中,则这种方法也会以类似的方式工作


请注意,类“class”没有公共构造函数。所以你不能用“new”操作符实例化“Class”实例。

这对我来说确实是个问题。我自己也在问这个问题,在谷歌快速搜索后发现自己在这里。我想如果我知道我的问题不是真的,我就不该费心了!此外,我认为由于特定搜索字符串的笨拙性,关于这个问题几乎没有书面或可查找的内容。除了上面链接的API文档之外,我从未在其他任何地方看到过这种符号(尽管你经常在反射中看到它)。@MadProgrammer OP询问的是
.class
语法,它只是与
.class
文件扩展名偶然相关。类似于C#中的
typeof(MyType)
。(即:静态获取一个“type”对象)
getClass()
仅当您有一个指向该类对象的引用时才有用<代码>类名。即使类没有实例,也可以使用类。例如,考虑<代码>数学>类< /代码>。每一种都适用于某些情况。精辟的解释。说到点子上。我喜欢你如何区分
.class
.getClass()。
可以对类对象做些什么?@Kevin请参阅API文档。应用程序:访问私有字段,例如:
Writer.class.getDeclaredField(“writeBuffer”)
。那么打印.class的类型是什么?Android如何处理
新的意图(这个,Activity.class
?它会尝试通过compa找出
类活动吗