我们能直接实例化一个抽象类吗?

37

我了解到我们只能通过继承来实例化抽象类,但是我们不能直接实例化它。
然而,我发现我们可以通过调用另一个类的方法创建一个抽象类的类型对象。
例如 - LocationProvider 是一个抽象类,我们可以通过在 LocationManager 类中调用 getProvider() 函数来实例化它:

LocationManager lm = getSystemService(Context.LOCATION_PROVIDER);
LocationProvider lp = lm.getProvider("gps");

这里如何实例化抽象类?


11
除其他事情外,查克·诺里斯能够实例化抽象类:http://www.ithoughts.de/chuck-norris-programmer-facts ;-) - Lukas Eder
查克·诺里斯在编程中还可以做很多其他的骚操作:http://chucknorrisfacts.co.uk/fact/category/4/ - Artur Kedzior
LocationProvider 不是一个抽象类,我认为它只是一个普通的公共类,正如您在这里所看到的。http://developer.android.com/reference/android/location/LocationProvider.html 您可能会这样说是因为他们在类文档中使用了抽象词。 - Vins
4个回答

87

您不能直接实例化抽象类,但是当没有具体类时,可以创建匿名类:

public class AbstractTest {
    public static void main(final String... args) {
        final Printer p = new Printer() {
            void printSomethingOther() {
                System.out.println("other");
            }
            @Override
            public void print() {
                super.print();
                System.out.println("world");
                printSomethingOther(); // works fine
            }
        };
        p.print();
        //p.printSomethingOther(); // does not work
    }
}

abstract class Printer {
    public void print() {
        System.out.println("hello");
    }
}

这也适用于接口。


2
抽象类中可以定义函数吗? - satheesh.droid
1
您可以在匿名类中创建方法,但只能在匿名类内部调用这些方法。请参见我的回答中的代码,我已经进行了编辑。 - kiritsuku
3
因为它不是公共的/不为人知的,所以无法输入“打印机”这个类型。 - kiritsuku
如果不是“实例化”,你会用什么词来描述这个? - James Wierzba
1
@AnV 如果一个类要成为抽象类,你只需要定义它为 abstract。然后它可以有0个抽象方法以及任意数量的具体方法。(参见:这个SO问题 - h4nek
显示剩余3条评论

23

不,你永远不能实例化一个抽象类。这就是抽象类的目的。你所提到的getProvider方法返回抽象类的具体实现。这就是抽象工厂模式。


请您能否详细介绍一下工厂模式或者提供一些相关链接? - satheesh.droid
@satheesh.droid,这是一个例子:http://www.javabeat.net/tips/18-factory-pattern-design-patterns-in-javaj.html - Darin Dimitrov
create[Object]方法放在单独的[Object]Factory类中而不是抽象的[Object]类本身中的动机是什么?以您链接中的示例为例:将createButton方法放在单独的ButtonFactory类中而不是抽象的Button类本身中的动机是什么? - theyuv

5
抽象类不能被实例化。

0
据其他人说,您无法从抽象类实例化。但是有两种方法可以使用它。 1.创建另一个非抽象类来扩展抽象类。因此,您可以从新类中实例化并使用抽象类中的属性和方法。
    public class MyCustomClass extends YourAbstractClass {

/// attributes, methods ,...
}

与接口一起工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接