interface C { public void g(); // 1# }class D { public void h(C c) {// 2# c.g(); } public static void main(String[] args) { D d = new D(); d.h(new C() { // 3# @Override public void g() { System.out.println("ok"); } }); } } class A { public void f() { System.out.println("A"); } } class B { A a = new A() { // 1# @Override public void f() { System.out.println("B"); } }; }对1#的解释: A类型引用变量a不是引用A类型实例,而是A子类的实例! “声明A类型引用变量a。然后,声明一个新类,它没有名字,但是,这是A的子类。这里的大括号打开该类的定义……”class A { public void f() { System.out.println("A"); } } class B { A a = new A() { }; //2# } public class Test { public static void main(String[] args) { B b = new B(); b.a.f(); //3# } }Output: A注意2#处并没有对父类方法的重写。但是3#处调用了A类的方法(继承而来的f()方法)匿名内部类实现接口的例子:interface C { public void g(); // 1# }class D { public void h(C c) { // 2# c.g(); //4# } public static void main(String[] args) { D d = new D(); d.h(new C() { // 3# @Override public void g() { //5# System.out.println("ok"); } }); } }注意,在2#处方法的参数是接口类型的引用。 再看我们在3#处传进去的地什么!我们创建了一个实现了C接口的匿名内部类,并将其引用传给了方法h(),并在h()方法执行到4#处时多态调用了5#处的匿名内部类的方法体代码。 另外特别注意:3# “new C() { …… }”,发现什么了吗?C是接口,但是我们对它用了new(而不是implements)! 这也是Java中唯一在接口前使用new的地方(呵,太武断了,据我现在所知是如此)。回答一下4楼的问题,对象可是在运行时才存在的啊,它必须用new来上创建并存活在堆上。这里是定义了一个没有名字的类,并在运行时创建它。
new ActionListener(){
public void actionPerformed(ActionEvent event){
openFile();
if (fileName == null)
return;
analysisFileOrDir(fileName);
for(File file : list){
analyze(file);
}
}
});
public Object doInHibernate(Session session)throws HibernateException, SQLException {
criteria.setProjection(Projections.rowCount());
return (Integer) (criteria.list().iterator().next());
}
});
public void g(); // 1#
}class D {
public void h(C c) {// 2#
c.g();
} public static void main(String[] args) {
D d = new D();
d.h(new C() { // 3#
@Override
public void g() {
System.out.println("ok");
}
});
}
}
class A {
public void f() {
System.out.println("A");
}
}
class B {
A a = new A() { // 1#
@Override
public void f() {
System.out.println("B");
}
};
}对1#的解释:
A类型引用变量a不是引用A类型实例,而是A子类的实例!
“声明A类型引用变量a。然后,声明一个新类,它没有名字,但是,这是A的子类。这里的大括号打开该类的定义……”class A {
public void f() {
System.out.println("A");
}
}
class B {
A a = new A() { }; //2#
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.a.f(); //3#
}
}Output:
A注意2#处并没有对父类方法的重写。但是3#处调用了A类的方法(继承而来的f()方法)匿名内部类实现接口的例子:interface C {
public void g(); // 1#
}class D {
public void h(C c) { // 2#
c.g(); //4#
} public static void main(String[] args) {
D d = new D();
d.h(new C() { // 3#
@Override
public void g() { //5#
System.out.println("ok");
}
});
}
}注意,在2#处方法的参数是接口类型的引用。
再看我们在3#处传进去的地什么!我们创建了一个实现了C接口的匿名内部类,并将其引用传给了方法h(),并在h()方法执行到4#处时多态调用了5#处的匿名内部类的方法体代码。
另外特别注意:3# “new C() { …… }”,发现什么了吗?C是接口,但是我们对它用了new(而不是implements)! 这也是Java中唯一在接口前使用new的地方(呵,太武断了,据我现在所知是如此)。回答一下4楼的问题,对象可是在运行时才存在的啊,它必须用new来上创建并存活在堆上。这里是定义了一个没有名字的类,并在运行时创建它。