class A
{
void fn1()
{
}
}abstract class B
{
abstract void fn2();
}class C extends A
{
B getB()//B是一个抽象类,抽象类怎么能定义一个方法呢?
{
return new B()
{
public void fn2()
{
}
};
}
}class Test
{
static void method1(A a)
{
a.fn1();
}
static void method2(B b)
{
b.fn2();
}
public static void main(String[] args)
{
C c=new C();
method1(c);
method2(c.getB());
}
}各位java前辈,下面一段代码怎么理解呢?B getB()//B是一个抽象类,抽象类怎么能定义一个方法呢?
{
return new B()
{
public void fn2()
{
}
};
}

解决方案 »

  1.   

    LZ的代码能编译通过吗?
    B是absract的能够new吗?
    但可以从一个方法中返回B的一个具体子类
    比如:   public B getB() {
         return new D();//假设D extends B,且D不是抽象类
      }
      

  2.   

    LZ的代码能编译通过吗?
    B是absract的能够new吗?
    但可以从一个方法中返回B的一个具体子类
    比如:  public B getB() {
        return new D();//假设D extends B,且D不是抽象类
      }
      

  3.   

    抽象类和接口都可以作为方法的类型。为什么呢?
    如果出现这种情,方法返回的是继承了这个抽象类或实现了这个接口的实例,是一个实实在在对象。
    B getB()        //B是一个抽象类,抽象类怎么能定义一个方法呢? 

        return new B()
        { 
             public void fn2() 
             { 
             } 
        };
     
    } 抽象类和接口都不可以用来创建对象,按道理说也不可以作为方法返回值的类型,返回一个方法中没有任何功能的对象有何意义?
    事实为什么又可以呢?作为方法返回值类型的抽象类和接口,要想得到的返回值是有用的,那么就应该是实现这些抽象类和接口方法中的功能。
    所以,new B()后面的程序块,把抽象类中的fn2方法重写了,重写了抽象类和接口中所有的抽象方法的类就可以创建对象,因此这里其实就是创建了一个对象,并以这个对象作为返回值返回,这个对象就是抽象类B的对象。    return new B()
        
             public void fn2() 
             { 
             } 
        };

    我们看上面代码,我们只看红色的部分,可以看出如果我们用class ClassName代替return new B()这段语句,不就是在定义一个类了吗?
    而这个类定义在方法中,所以我们叫它局部内部类,有些象定义在方法中的变量--局部变量。
    要注意的是new B()把定义类和创建对象的步骤合二为一了,创建了一个没有名字的类的同时生成了一个没有名字的对象。
    既然定义在方法的类叫作局部内部类,这个局部内部类没有,我们可以叫它匿名局部内部类呀?我们可以把它叫作局部内部类对象。实现了抽象方法或接口方法的对象,就有了功能,所以把它作为返回值,不就有了意义了吗?
    抽象方法和接口最终的目的还是要有类来继承和实现他们方法中的功能,并生成对象。很菜,说了很多,不知道说得清楚不。如果说不清楚,希望没把你说糊涂。
    ------助人为乐