【问题标题】: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");

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

【问题讨论】:

标签: java android class oop abstract


【解决方案1】:

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

    public class MyCustomClass extends YourAbstractClass {

/// attributes, methods ,...
}
  1. 使用接口。

【讨论】:

    【解决方案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】:

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

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 2021-08-02
      • 2012-06-07
      • 1970-01-01
      • 2015-07-11
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多