Object getClass()方法

小菜总结到
大家都知道Object类有一个getClass()方法 打开API看看它是这样说的

[color=red]返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
返回:表示此对象运行时类的 Class 对象。[/color]
疑问来了 返回此Object的运行时类 它这里Object运行时类指那个类? 什么又是运行时类的Class对象 它到底是啥对象?
来点代码吧 我们这里有两个类 Test类测试用的 还有一个Never类
Never类
package woca;

public class Never {
static{
System.out.println("Never类被初始化了");
}
public void shuChu(){
System.out.println("Never类shuChu()方法执行");
}
}


Test类
package woca;

public class Test {
static{
System.out.println("Test类被初始化了");
}
public void testClass() throws Exception, Exception{
this.getClass();
}

public void shuChu(){
System.out.println("本类的Class对象");
}

public static void main(String[] args) throws Exception {
Test t = new Test();
t.testClass();
}
}

猜猜会输出什么? 。。。。。。。。
输出
Test类被初始化了
到这里只能说明一个问题我们调用一个对象的getClass()方法会初始化这个类也就是执行static代码块 你可能会问这里的this指什么呢? 它指的那个对象呢?
答:是Object对象 其实你可以通过你的MyEclipse的自动代码提示功能看到 当你打点的时候会出来Object的许多方法
我们还是用代码来验证以下吧!下面我来改写main方法
package woca;

public class Test {
static{
System.out.println("Test类被初始化了");
}
public void testClass() throws Exception, Exception{
Object ob = this.getClass().newInstance();
if (ob instanceof Object) {
System.out.println("ob是一个Object实例");

}
}

public void shuChu(){
System.out.println("本类的Class对象");
}

public static void main(String[] args) throws Exception {
Test t = new Test();
t.testClass();
}
}

输出结果是:
Test类被初始化了
ob是一个Object实例

所以this指的是Object对象

接下来我们看这个main方法
package woca;

public class Test {
static{
System.out.println("Test类被初始化了");
}
public void testClass() throws Exception, Exception{
Test test = this.getClass().newInstance();
test.shuChu();
}

public void shuChu(){
System.out.println("本类的Class对象");
}

public static void main(String[] args) throws Exception {
Test t = new Test();
t.testClass();

}
}

输出结果:
Test类被初始化了
本类的Class对象

这说明我们这句:[color=red]Test test = this.getClass().newInstance();[/color]得到了一个Test对象 我们调用object.getClass()方法 返回一个Class对象
这个Class对象 和Test对象不同 然后我们调用newInstance()创建了一个实例
API 里边说返回运行时类的Class对象 其实就是说 当前运行这个类的Class对象(在你不指定对象的情况下)
java.lang.Class类里边有很多实用的方法 当你得到一个对象的Class对象之后就可以调用这些方法
这个类里边只要一个静态方法那就是forName("指定类名")其实它和getClass 的功能一样都会对一个类初始化都是返回一个对象的Class对象 只不过它的参数里边直接指定类名 注意这个参数 是完全限定类型鸟 得加上包名! 还有它是一个静态方法你可以直接[color=red]Class.forName()这样用方便些[/color]如果你这样写:
this.getClass().forName("woca.Test");

效果和[b]this.getClass();[/b]一样只不过上边那种有点二
forName()方法还有一个重载方法
类似这种
Class.forName("woca.Never", false, this.getClass().getClassLoader());

第一个参数还是指定类名 第二个参数指定要不要初始化 第三个参数是指定类的加载器
我把第二参数改为false 就不会初始化Never这个类 也就不会执行静态代码块了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值