Java-“this”和“类名.this”以及“类名.class”的区分和详解
引言:
对于以上三个语法结构的区分,需要先理解Class类 所有对象的类以及调用了静态方法的类都需要在对象创建之前在JVM虚拟机中加载,加载内容被称为“类对象”,每个类的类对象是唯一且是不可变的。而在对象创建的时候,由于类对象已加载,所以可以添加上类型标签。
1. Class类介绍:
此类的介绍是为了解释
类名.class
的含义。
1.1 Class类简介:
- Class类只有私有的构造方法,所以不能使用new关键词来创建一个Class对象;只有JVM虚拟机可以创建一个类对象,且是在类加载的时候被调用的。
- 运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
- 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象,和其名字相同的类对象名。
- 每个数组属于被映射为 Class 对象的一个类,所有具有 相同类型 和 维数 的数组都共享该 Class 对象。只不过数组对象的名字比较奇怪
- 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
1.2 得到类对象的三个方法:
虽然我们不能使用构造器得到Class对象,但是却可以通过其他方法得到:(注意,class对象可以是接口)
我们先创建一个对象,比如:
String
类:
String str = new String("Hello World");
方法1:通过
对象.getClass()
得到对象类(非静态方法):
Class classOfString=str.getClass();
注意事项:
getClass
方法继承于
Object
类,是一个
native
方法
方法2:通过
Class
类的静态方法
forName()
返回类对象:
注意事项:
-
forNanme()方法会抛出异常ClassNotFoundException,所以需要使用try-catch语句捕获。 -
forName方法输入参数为类名,而不是对象名,并且要完整写出类路径,否则会抛出异常
方法3:通过
类名.class
返回此类对象(非静态方法):
Class classOfString3=String.class;
介绍完以上三种方法,不仅知道了得到Clas对象的方法,也知道了类名.class是什么意思了,其就是返回类名所对应的唯一类对象。
1.3 Class类的常用方法:
-
getName()其原理上调用了一个本地私有方法的非静态方法,返回String类型的实例,代表Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 -
newInstance()此方法用于返回一个类对象的实例,实例构造只能无参构造器,且为弱类型(即Object类型)。 例子:
可见由于newInstance返回的是Object类型,所以需要额外向下强制转型。
-
getClassLoader()返回该类的类加载器。 -
getComponentType()返回表示数组组件类型的 Class。 -
getSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。 -
isArray()判定此 Class 对象是否表示一个数组类。
2. this关键词:
this关键字的三大应用:
- this调用本类中的属性,也就是类中的成员变量,例如:set和构造器中经常使用this关键字(与输入方法的输入参数同名了);
- this调用本类中的其他方法,但通常this可以省略;
- this调用本类中的其他构造方法,调用时要放在构造方法的首行,this()方法可以为有参,也可以为无参(重载)。
总之,关键字this用于指代当前的对象。因此,类内部可以使用this作为前缀引用实例域以及方法(包括构造方法);
3. 类名.this :
类名.this
一般用于内部类调用外部类的对象时使用,因为内部类使用
this.
调用的是内部类的域和方法,为了加以区别,所以使用
类名.this
来加以区分。例如以下代码: