我对抽象类概念感到困惑。请清除我的怀疑。 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
是一个对象还是什么?
答案 0 :(得分:5)
test
是AbstractTest
的匿名具体子类的对象(注意它实现了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类的实例(即扩展您的抽象类),您可以为其提供继承抽象方法的实现。