我们可以创建抽象类的对象吗?

时间:2015-11-30 08:10:30

标签: java abstract-class

我对抽象类概念感到困惑。请清除我的怀疑。 Abstract类的定义说我们不能创建这样的类的对象,那么我们称之为A a=new A(){ }。示例如下

  public abstract class AbstractTest {
    public abstract void onClick();
    public void testClick(){

    }
 }

  public class A {
       AbstractTest test = new AbstractTest(){

        @Override
        public void onClick() {

        }
    };
  }

那么test是一个对象还是什么?

3 个答案:

答案 0 :(得分:5)

testAbstractTest的匿名具体子类的对象(注意它实现了AbstractTest的所有抽象方法),这就是为什么这个子类可以是实例

另一方面,

AbstractTest test = new AbstractTest();

不会通过编译,因为这将尝试实例化一个抽象类。

答案 1 :(得分:2)

你正在混淆对象和参考。

 AbstractTest test = new AbstractTest(){   
        @Override
        public void onClick() {    
        }
    };

test这里是对AbstractTest扩展的匿名类的引用,上面的代码就像是这样说:

class MyClass extends AbstractTest{
   @Override
            public void onClick() {
            }
}
AbstractTest test  =new MyClass(); // test is a reference referring to a MyClass object

答案 2 :(得分:0)

我认为抽象类需要与Interface一起解释。

Interface允许您指定具有该接口的对象支持/允许的操作。更具体地说,对象是实现该接口的类的实例。定义接口允许您描述一组不同类别的对象,以便其他对象可以以相同的方式与它们交互。

抽象类是接口和类之间的一步(松散地说)。 Abstract Class允许您指定扩展它的类所支持的操作,但是它还允许您实现(某些)这些操作。这样,您就可以为该抽象类中的一组类实现 common 方法。抽象类中未实现的其他方法(也称为抽象方法)需要由扩展它的类实现。您没有在Abstract类上实现所有方法的事实自然意味着您无法实例化它(创建此类的对象)。对于抽象类(即回调),还有其他有用的实现。

在你的例子中,你看到的是你并不是真的只想创建一个Abstract类的对象,你也提供了抽象方法onClick()的实现;

这是您可以“创建抽象类实例”的唯一方法 - 从技术上讲,您正在创建一个Anonymous类的实例(即扩展您的抽象类),您可以为其提供继承抽象方法的实现。