关于java:抽象方法和类的用法不清楚

Usage of abstract methods and classes unclear

本问题已经有最佳答案,请猛点这里访问。

我正在学习面向对象编程的概念。其中之一是抽象。我理解任何包含抽象方法的类也应该是抽象的,并且抽象类不能被实例化。要使用抽象类,我必须从另一个类继承它。

到现在为止,一直都还不错。下面是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class Games {

   public abstract void start();

   public void stop(){
       System.out.println("Stopping game in abstract class");
   }
}

class GameA extends Games{
   public void start(){
       System.out.println("Starting Game A");
   }
}

class GameB extends Games{

   public void start(){
       System.out.println("Starting Game B");
   }
}

然后我们有一个使用main方法的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class AbstractExample {

   public static void main(String[] args){
       Games A = new GameA();
       Games B = new GameB();

       A.start();
       A.stop();

       B.start();
       B.stop();
   }
}

但我可以在类Games中写下以下内容:

1
2
3
public void start(){
   System.out.print("");
}

那么它就不必是abstract,输出是相同的,我甚至可以实例化Games类。那么,创建抽象方法和类的关键是什么呢?


是的,所以在某种意义上抽象类/接口是需要您提供自己的契约实现的契约。例如,您正在编写一个日志记录库,该库可以写入文件、数据库等。请考虑如何强制任何一个库实现持久化基础IO的功能。为了实现这一点,您需要使代码与接口/抽象类的实例一起工作。现在,这两者之间的区别很简单,因为接口没有实现。好吧,直到Java 8,但是没关系,这不是ATM需要关注的。抽象类可以实现某些方法。例如,如果写入尝试未成功,请重试。但是实际的写操作将只存在于实现它的操作中。接口不能。


抽象类在单个程序员项目上没有多大意义。您可以将它们看作是从实现某些方法的类继承的程序员获得的承诺。