对于以上三个语法结构的区分,需要先理解Class类 所有对象的类以及调用了静态方法的类都需要在对象创建之前在JVM虚拟机中加载,加载内容被称为“类对象”,每个类的类对象是唯一且是不可变的。而在对象创建的时候,由于类对象已加载,所以可以添加上类型标签。
此类的介绍是为了解释 类名.class
的含义。
虽然我们不能使用构造器得到Class对象,但是却可以通过其他方法得到:(注意,class对象可以是接口)
我们先创建一个对象,比如: String
类: String str = new String("Hello World");
方法1:通过 对象.getClass()
得到对象类(非静态方法):
Class classOfString=str.getClass();
注意事项:getClass
方法继承于Object
类,是一个native
方法
方法2:通过Class
类的静态方法forName()
返回类对象:
try {
Class classOfString2=Class.forName("java.lang.String");
System.out.println(classOfString2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
注意事项:
forNanme()
方法会抛出异常ClassNotFoundException
,所以需要使用try-catch
语句捕获。forName
方法输入参数为类名,而不是对象名,并且要完整写出类路径,否则会抛出异常方法3:通过类名.class
返回此类对象(非静态方法):
Class classOfString3=String.class;
介绍完以上三种方法,不仅知道了得到Clas对象的方法,也知道了类名.class是什么意思了,其就是返回类名所对应的唯一类对象。
getName()
其原理上调用了一个本地私有方法的非静态方法,返回String类型的实例,代表Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。newInstance()
此方法用于返回一个类对象的实例,实例构造只能无参构造器,且为弱类型(即Object类型)。
例子: try {
String s =(String) classOfString.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
可见由于newInstance返回的是Object类型,所以需要额外向下强制转型。
getClassLoader()
返回该类的类加载器。getComponentType()
返回表示数组组件类型的 Class。getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。isArray()
判定此 Class 对象是否表示一个数组类。this关键字的三大应用:
总之,关键字this用于指代当前的对象。因此,类内部可以使用this作为前缀引用实例域以及方法(包括构造方法);
类名.this
一般用于内部类调用外部类的对象时使用,因为内部类使用this.
调用的是内部类的域和方法,为了加以区别,所以使用类名.this
来加以区分。例如以下代码:
class OuterClass {
final String str = "OuterClass";
private InnerClass innerClass;
public InnerClass getInner() {
innerClass = new InnerClass();
return innerClass;
}
class InnerClass {
final String str = "InnerClass";
final String str2 = this.str;//指向内部类的域
final String str3 = OuterClass.this.str;//指向外部类的域
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.getInner();
System.out.println(innerClass.str);
System.out.println(innerClass.str2);
System.out.println(innerClass.str3);
}
}
控制台输出:
InnerClass
InnerClass
OuterClass
组合 | 用法说明 |
---|---|
this | 指代当前对象的引用 |
类名.class | 指向每个类对应的唯一类对象(类型为Class) |
类名.this | 内部(可以是匿名内部类)类调用外部类的对象时使用,即在内部类中使用时:外部类对象是外部类名.this,内部类对象则是this |