Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么使用抽象类而不是扩展类和实现接口?_Java_Oop_Interface_Abstract Class - Fatal编程技术网

Java 为什么使用抽象类而不是扩展类和实现接口?

Java 为什么使用抽象类而不是扩展类和实现接口?,java,oop,interface,abstract-class,Java,Oop,Interface,Abstract Class,我的怀疑或论点是- 抽象类可以通过扩展具体类和实现接口来替换 如何或什么? 抽象类包含什么?实现某些默认行为的方法。不同的访问修饰符。可以扩展另一个抽象类。可以实例化。等等 所有这些都可以使用一个具体的类来实现。 当需要维护结构而没有实现时,我们可以使用接口 我可以将抽象类看作是具体类和接口的组合 显示一些代码- public abstract class MobilePhone { abstract public String getPhoneModel(); public Str

我的怀疑或论点是-

抽象类可以通过扩展具体类和实现接口来替换

如何或什么?

抽象类包含什么?实现某些默认行为的方法。不同的访问修饰符。可以扩展另一个抽象类。可以实例化。等等

所有这些都可以使用一个具体的类来实现。 当需要维护结构而没有实现时,我们可以使用接口

我可以将抽象类看作是具体类和接口的组合

显示一些代码-

public abstract class MobilePhone {
   abstract public String getPhoneModel();
   public String getIMEI(){
       // Consider execute() is some function that returns us IMEI for now
       return execute("*#06#");
   }
}


public class SamsungPhone extends MobilePhone {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getSamsungModelFromDB(imei);
    }
}

public class iPhone extends MobilePhone {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getiphoneModelFromDB(imei);
    }
}
如果我们这样做,同样的事情也可以实现-

public class MobilePhone {
   public String getIMEI(){
       // Consider execute() is some function that returns us IMEI for now
       return execute("*#06#");
   }
}

public interface Imobile {
    String getPhoneModel();
}

public class SamsungPhone extends MobilePhone implements Imobile {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getSamsungModelFromDB(imei);
    }
}

public class iPhone extends MobilePhone implements Imobile {
    public String getPhoneModel(){
        String imei = displayIMEI();
        return getSamsungModelFromDB(imei);
    }
}
抽象类的特殊用例或需求是什么

参考资料-

还有一些(但它们没有那么大的帮助)


PS:我不是指抽象类和接口之间的区别

抽象类允许您修复行为,如:

public abstract class Foo {

  protected abstract int getValue();

  public final void doTheFoo() {
    int value = getValue();
    ... do something ...
  }
通过使用这种方法,您可以保证doTheFoo()的行为不会被Foo的子类改变。但是您仍然可以扩展Foo,并允许这些子类对doTheFoo()的工作产生一定的影响

这是用具体的类+接口无法做到的


另一个核心方面:请记住,这些概念也是交流的一种手段。通过使用abstract关键字,您可以告诉您的“受众”您不希望实例化该类。如果这对你现在来说是有价值的,那不是真正的重点;因为这个概念对于Java的创始人来说非常重要,足以使它成为语言的一部分。

因此,如果您对基类没有意见,那么问题是“为什么要将基类抽象?”。有时候你想在里面放一些抽象的方法。有时您不希望直接实例化基类。试图通过接口和具体基类的组合来实现同样的目标并不会降低抽象类的有用性。@bozzmob这并不是说它是一个骗局,尽管它可能是,但这在本网站上是离题的……一个关键点是:当你以“请投我反对票”开始提问时。。。那么可能是出了什么问题。如果你避开了那一部分;然后问“拥有抽象类的真正好处是什么”。。。如果情况不一样,事情可能会过去。我仍然决定回答,因为我看到了你在文本中隐藏的真实问题的一些优点;但您可能仍然决定戏剧性地编辑您的输入。“也许你会重新获得一些选票。”幽灵猫他说。“我明白了。”真怀疑主义者:现在好点了吗?