首先创建接口、抽象类及普通类
接口
public interface Test {
void test();
}
抽象类
public abstract class Test1 {
public void say() {
System.out.println("我是抽象类");
}
}
普通类
public class Test2 {
public void say() {
System.out.println("我是普通类");
System.err.println("对象" + this.getClass());
System.out.println("类名" + this.getClass().getSimpleName());
}
}
主函数执行
public class Main {
public static void main(String[] args) {
new Test() {
public void test() {
System.out.println("我是接口");
System.err.println("对象" + this.getClass());
System.out.println("类名" + this.getClass().getSimpleName());
}
}.test();
new Test1() {
@Override
public void say() {
System.out.println("我是抽象类");
System.err.println("对象" + this.getClass());
System.out.println("类名" + this.getClass().getSimpleName());
}
}.say();
new Test2(){
public void say() {
System.out.println("我是普通类");
System.err.println("对象" + this.getClass());
System.out.println("类名" + this.getClass().getSimpleName());
}
}.say();
Test2 t = new Test2();
t.say();
}
}
/*
运行结果:
我是接口
对象class test00.Main$1
类名
我是抽象类
类名
对象class test00.Main$2
我是普通类
对象class test00.Main$3
类名
我是普通类
对象class test00.Test2
类名Test2
*/
///利用eclipse运行
/*
严格意义上来讲 new还是针对普通类(虽然内部类和普通类有很大的不一样),只不过这个class的写法稍有不同,它是编译器帮我们从匿名内部类
中提取的经过反推:无论是普通类还是抽象类或是接口的匿名类都需要系统所提供带有 "主方法"入口 的类 + "$及编号" 的具体类继承父类或实
现接口因此new的时候是new的jvm所提供的一个具体实现类,而类名则被"空串"所替代
*/
///反推论证///
//利用DOS窗口找到字节码文件
/*
接口匿名类反推
>javap Main$1.class
Compiled from "Main.java"
class test00.Main$1 implements test00.Test {
test00.Main$1();
public void test();
}
*/
/*
抽象类匿名类反推
>javap Main$1.class
Compiled from "Main.java"
class test.Main$1 extends test.Test1 {
test.Main$1();
public void say();
}
*/
/*
普通类匿名反推
>javap Main$3.class
Compiled from "Main.java"
class test00.Main$3 extends test00.Test2 {
test00.Main$3();
public void say();
}
*/
/*
普通类非匿名反推
>javap Test2.class
Compiled from "Test2.java"
public class test00.Test2 {
public test00.Test2();
public void say();
}
*/