我们可以直接实例化一个抽象类吗? [复制]

Posted

技术标签:

【中文标题】我们可以直接实例化一个抽象类吗? [复制]【英文标题】:Can we instantiate an abstract class directly? [duplicate] 【发布时间】:2011-06-02 12:47:43 【问题描述】:

我读过我们只能通过继承来实例化一个抽象类,但我们不能直接实例化它。 但是,我看到我们可以通过调用另一个类的方法来创建具有抽象类类型的对象。 比如——LocationProvider是一个抽象类,我们可以通过调用LocationManager类中的getProvider()函数来实例化它:

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

抽象类在这里是如何实例化的?

【问题讨论】:

除其他外,Chuck Norris 可以实例化抽象类:ithoughts.de/chuck-norris-programmer-facts ;-) Chuck Norris 可以在编程中做很多其他技巧:chucknorrisfacts.co.uk/fact/category/4 LocationProvider 不是我认为的抽象类,它只是一个普通的公共类,正如您在此处看到的那样。 developer.android.com/reference/android/location/… 你可能会说这是因为他们在类文档中使用了抽象词。 【参考方案1】:

按照别人的说法,你不能从抽象类中实例化。但它存在两种使用方式。 1.创建另一个从抽象类扩展的非抽象类。所以你可以从新类中实例化并使用抽象类中的属性和方法。

    public class MyCustomClass extends YourAbstractClass 

/// attributes, methods ,...

    使用接口。

【讨论】:

【参考方案2】:

不,你永远不能实例化一个抽象类。这就是抽象类的目的。您所指的getProvider 方法返回抽象类的特定实现。这就是抽象工厂模式。

【讨论】:

您能否详细说明工厂模式或提供一些相关链接? @satheesh.droid,这是一个例子:javabeat.net/tips/… create[Object] 方法放在单独的[Object]Factory 类而不是抽象的[Object] 类本身的动机是什么?要使用链接中的示例:将 createButton 方法放在单独的 ButtonFactory 类中而不是抽象 Buttton 类本身中的动机是什么?【参考方案3】:

不能直接实例化抽象类,但是可以在没有具体类的情况下创建匿名类:

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");
    

这也适用于接口。

【讨论】:

我们可以在抽象类中定义函数吗? 可以在匿名类内部创建方法,但只能在匿名类内部调用这些方法。请参阅我的答案中的代码,我对其进行了编辑。 @sschaef,你能解释一下为什么对 p.printSomethingOther 的调用在课堂内部可以正常工作,但从外部却不行吗? @Cupidvogel:因为它不公开/不知道输入Printer @AnV 要使一个类成为抽象类,您只需定义它abstract。然后它可以有 0 个抽象方法以及任意数量的具体方法。 (见:this SO question)【参考方案4】:

不,抽象类永远不能被实例化。

【讨论】:

以上是关于我们可以直接实例化一个抽象类吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

继承一个抽象类,并实例化抽象类中定义的方法,这个方法返回spring注入的一个对象,值一直为空?

抽象类

抽象类

Dart9(九)抽象类、多态、 接口

Android Studio中的View是抽象类吗?

普通类抽象类和接口区别: