interface Myface
{  //这里加void fun(),下面的加f.fun();能编译通过
}
public class B
{
public static void main(String args[])
{
Myface f=new Myface()
{
public void fun()
{
System.out.println("test");
}
};
//可以编译通过,这里f.fun()则编译能过不了
}
};这段代码能说明什么呢?

解决方案 »

  1.   

    Myface f=new Myface()
    {
    public void fun()
    {
    System.out.println("test");
    }
    };这是内隐类,大括号里实现了具体的fun()
      

  2.   

    对,你所说的实现应该在结果里面有个void fun();方法才对,可现在我没有在接口里定义,这样一样能编译通过,为什么?有什么规则吗?
      

  3.   

    对,你所说的实现应该在接口里面有个void fun();方法才对,可现在我没有在接口里定义,这样一样能编译通过,为什么?有什么规则吗?
      

  4.   

    我实现了一个接口,也就是接口内的所有函数我都实现,除此之外我也可以加入新的成员函数阿
    所以,如果你接口类里没有fun();我在其实现类中当然可以加入新的函数fun()!
      

  5.   

    如果你在Myface里不加fun(),那在B里面Myface f=new Myface(){};它在编译期是找不到f.fun(),你在内隐类里定义的fun()只有在运行期才能被识别;而如果你在Myface里加fun(),那在B里面Myface f=new Myface(){};它在编译期是能找到f.fun()的,而你在内隐类里定义的fun()实现了Myface里的fun():)
      

  6.   

    向上转型了!这是一个典型的向上转型(Up-Casting)现象.Myface f = new Myface() {
      public void fun() {
        System.out.println("test");
      }
    }这里产生了一个实现了Myface接口的类的实例, 当你将它赋给一个Myface 类型的变量f时, 这个对象已经向上转型为Myface类型的对象了, 所以, 只有Myface接口中的定义了的方法才可以用f.方法名()来调用, 其它方法在向上转型的过程中被屏蔽了.
      

  7.   

    用 eclipse 写就很明确告诉你错误提示了:The method fun() is undefined for the type Myface