其他博文:
类名.class 类名.this 详解
结论:
当在一个类的内部类中,如果需要访问外部类的方法或者成员域的时候,如果使用 this.成员域(与 内部类.this.成员域 没有分别) 调用的显然是内部类的域 , 如果我们想要访问外部类的域的时候,就要必须使用 外部类.this.成员域。传递 new 类名() 或 类名.this 效果等同。
类名.class 类名.this 测试:
package com.company.test;
import java.lang.reflect.Method;
public class TestA {
public void tn() {
System.out.println("外部类tn");
}
String str = "123";
Thread thread = new Thread() {
public void tn() {
System.out.println("inner tn");
}
public void run() {
System.out.println("内部类run");
// 调用外部类的tn方法
TestA.this.tn();
// 调用内部类的tn方法
this.tn();
// 传递 new TestA() 或 TestA.this 效果等同
test1(new TestA());
test2(TestA.this);
try {
test3(TestA.class);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 反射测试
try {
Class calss = Class.forName("com.jiuqi.test.TestA");
TestA q = (TestA) calss.newInstance();
System.out.println(" 反射测试 ==> " + q.str);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
};
public static void main(String aaa[]) {
new TestA().thread.start();
}
protected void test3(Class<TestA> class1) throws InstantiationException, IllegalAccessException {
TestA a = class1.newInstance();
System.out.println("测试传参: 类.calss ==> " + a.str);
Method[] methods = class1.getMethods();
System.out.println("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
if (null != methods) {
for (Method method : methods) {
// System.out.println(method.getName());
}
System.out.println("测试反射");
}
System.out.println("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
}
protected void test1(TestA testA) {
System.out.println("测试传参: new TestA() ==> " + testA.str);
}
protected void test2(TestA testA) {
System.out.println("测试传参: TestA.this ==> " + testA.str);
}
}
打印结果:
内部类run
外部类tn
inner tn
测试传参: new TestA() ==> 123
测试传参: TestA.this ==> 123
测试传参: 类.calss ==> 123
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
测试反射
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
反射测试 ==> 123