public class Test14 {
public static void main(String[] args) {
}
}
//定义一个接口
interface InterB {
void showB();
}
//目标:调用成员方法methodB
class B {
InterB b;
public B(InterB b){
this.b = b;
}
public void methodB(){
b.showB();
}
}作者: 庞麦郎 时间: 2016-7-2 23:58 本帖最后由 庞麦郎 于 2016-7-3 00:01 编辑
/*public*/ class Test14 {
public static void main(String[] args) {
B b=new B(new InterB(){
public void showB(){
System.out.println("show");
}
});
b.methodB();
}
}
//定义一个接口
interface InterB {
void showB();
}
//目标:调用成员方法methodB
class B {
InterB b;
public B(InterB b){
this.b = b;
}
public void methodB(){
b.showB();
}
}
复制代码
我是这样做的,不知道对不对呢
测试的时候说:
错误: 类Test14是公共的, 应在名为 Test14.java 的文件中声明
public class Test14 {
^
1 个错误,
然后,我把你的代码里面:public class Test14 的public 注释掉,测试就通过了!(具体是什么原因能通过,希望有大神回答一下):
分析:
1.首先要调用方法methodB,就要有class B 的对象去调用。从 methodB 的方法体:b.show(),知道b肯定是一个对象(那么就要创造一个对象b),b.show()是:就是通过对象b来调用show()方法,而show()是接口InterB里面的方法,要想调用就要用它的具体实现类的对象来调用,b.show()就说明了,b是接口InterB的具体实现类的对象。
2. b在class B里定义为:InterB b 也就是接口InterB的对象(验证了分析1),而在class B 的构造方法:public B ( InterB b ) { this.b = b;},this代当前类(class B ),this.b=b;就是说将形参:InterB b 赋给代当前类(class B )的对象:b
3. 其实类(class B)的目的:就是先定义一个接口的对象(InterB b ),然后,在构造方法 public B 中将将形参:InterB b 赋给代当前类(class Test14 )的对象:b(也就是说,你要在创建class B对象的对象时候,将一个接口InterB 的对象传过来给class B的构造方法,那么经过构造方法后,class B的对象b其实代表的就是接口InterB 的对b了),最后,在 methodB 中调用show()方法。
4. 要调用show()方法,那么就要有接口methodB 的具体实现类的对象,而既不用重新写一个接口的具体实现类并创造一个对象调用其方法的:就是接口的匿名内部类了。
匿名内部类的格式:
new 类名或者接口名(){
重写方法;
};